rsa加密导致java中的非法blocksizeexception

ylamdve6  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(393)

生成aes密钥后,使用:

keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
keyGenerator.generateKey();

我把这个密钥和一个16字节的iv连接起来,然后编码

public String encode(byte[] content) {
    return Base64.encodeBase64String(content);
 }

我将这个字符串传递给rsa密码,如下所示

private final Cipher publicKeyCipher = Cipher.getInstance("RSA");
publicKeyCipher.init(Cipher.ENCRYPT_MODE, publicKey);
publicKeyCipher.doFinal(content.getBytes(StandardCharsets.UTF_8));

所有这些工作正常,测试正常。但是当在受控环境中进行负载测试时,dofinal函数抛出

{"log":"javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes\n"}

这大约占500000个请求的0-15%。日志显示字符串长度和字节大小总是固定在70,即245以下。所以我不认为这是一个编码问题,我在从一个失败的示例中加密字符串之前打印了它,并在一个单元测试中测试了它,测试通过后没有问题。

tjvv9vkg

tjvv9vkg1#

您可以用aes加密文本(要传输的数据),用rsa加密aes密钥。
稍后您必须将rsa加密的aes密钥和aes加密的文本推送到服务器。
您还需要使用rsa private.key对aes密钥进行解密,并使用该aes密钥打开由aes算法加密的文本。
这是一个伪代码示例。


# Client side

    AESKey generatedAESKey = generateAESKey();
    byte[] encryptedText= generatedAESKey.encrypt("Some Text".getBytes())
    RsaEncrypted encryptedAES = RSA.encrypt(generatedAESKey); // by publickey.pem
    connection.sendServer(encryptedAES, encryptedText)

    # Server size
    EncryptedKeyAndData encryptedKeyAndData = connection.receive();
    AESKey aesKey = RSA.decrypt(encryptedKeyAndData.encryptedAES); // by privatekey.pem
    String text = aesKey.decrypt(encryptedKeyAndData.encryptedText);

我最近刚刚完成了这个实现的socket编程,但我猜这是一个spring相关的项目。您不必实现原始的客户机和服务器代码。主要的问题可能是编码。
直接使用inputstream和outputstream可能会有问题。所以在传输数据(加密的aes密钥、文本)时使用objectstreams。

相关问题