当前位置: 首页 > 知识库问答 >
问题:

使用非对称加密时出现IllegalBlockSize异常(公钥私钥Enc)

陶炫明
2023-03-14

我已经在Java中设置了公钥和私钥加密,并分发了两个用户的公钥(通信是在两个用户之间)。我现在希望用户交换一个对称密钥。我应该做的:

  1. 用户A生成密钥。
  2. 用户A用他的私钥加密密钥,然后用B的公钥加密。
  3. 用户A发送加密密钥。
  4. 用户B接收加密密钥。
  5. 用户B先用他的私钥解密密钥,然后用A的公钥解密密钥。

用户A生成密钥的我的代码:

1. KeyGenerator keyGenerator = KeyGenerator.getInstance(ENCMETHOD);
2. SecureRandom secureRandom = new SecureRandom();
3. int keyBitSize = 128;
4. keyGenerator.init(keyBitSize, secureRandom);
5. secretKey = keyGenerator.generateKey();
6. encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());

// encrypt with public key of B and then my private key
7. String encryptedMessage = encodedKey;
8. encryptedMessage = ac.encryptText
               (
                        ac.encryptText(encryptedMessage, otherUserPublickey),
                        privateKey
                );

第8行抛出以下错误:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)
    at driver.AsymmetricCryptography.encryptText(AsymmetricCryptography.java:73) // please refer to the code section below for this method
    at driver.ClientOne.main(ClientOne.java:158) // this is line 8 in the above code
public String encryptText(String msg, PrivateKey key)
        throws
        UnsupportedEncodingException, IllegalBlockSizeException,
        BadPaddingException, InvalidKeyException {
        this.cipher.init(Cipher.ENCRYPT_MODE, key);
        return Base64.encodeBase64String(cipher.doFinal(msg.getBytes("UTF-8")));
}

// this.cipher = Cipher.getInstance("RSA");

非常感谢任何帮助。多谢了。

共有1个答案

沈博延
2023-03-14

看起来您已经超过了可以使用RSA加密的数据量(请参阅此处https://security.stackexchange.com/questions/44702/whats-the-limit-on-the-size-of-the-data-that-public-key-cryptos-can-handle)。

 类似资料:
  • 问题内容: 此代码生成一对公钥/私钥: 我想知道的是您通常如何存储公钥: 选项1:存储字节 我不喜欢将代码绑定到诸如和的具体实现。 选项2:存储模数和指数 第二个选项更易于实现,但是我不知道它是否可能性能较低。 有什么建议吗? 问题答案: 在我们的应用程序中,我们以DER格式存储公钥和私钥,以便可以在Java外部更轻松地使用和操纵它们。在我们的情况下,私钥上没有密码。 要将私钥转换为在Java中更

  • 本文向大家介绍Java生成非对称型加密公钥和私钥的方法,包括了Java生成非对称型加密公钥和私钥的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java生成非对称型加密公钥和私钥的方法。分享给大家供大家参考。具体如下: 非对称型加密非常适合多个客户端和服务器之间的秘密通讯,客户端使用同一个公钥将明文加密,而这个公钥不能逆向的解密,密文发送到服务器后有服务器端用私钥解密,这样就做到了明

  • 我知道这很难...但我使用OpenSSL以一种非常标准的方式加密文件。该文件使用RSA-2048公钥在AES-256中加密。我想在Java中使用私钥解密文件。我研究了很长时间,尝试了很多方法,但似乎都行不通。我只是找到相关的问题与工作的解决方案,但不是确切地为我的问题。 我使用以下命令生成public-/private-key-pair:

  • 并且我将这个函数称为用RSA公钥加密DSA密钥的函数:

  • 您可以在AWS KMS中创建非对称密钥对(加密/解密)。当前AWS CLI允许访问公钥(https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/get-public-key.html) 我无法在Terraform的KMS资源中看到这一点。是我错过了什么还是这只是在最新版本中还没有,

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥: