生成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以下。所以我不认为这是一个编码问题,我在从一个失败的示例中加密字符串之前打印了它,并在一个单元测试中测试了它,测试通过后没有问题。
1条答案
按热度按时间tjvv9vkg1#
您可以用aes加密文本(要传输的数据),用rsa加密aes密钥。
稍后您必须将rsa加密的aes密钥和aes加密的文本推送到服务器。
您还需要使用rsa private.key对aes密钥进行解密,并使用该aes密钥打开由aes算法加密的文本。
这是一个伪代码示例。
我最近刚刚完成了这个实现的socket编程,但我猜这是一个spring相关的项目。您不必实现原始的客户机和服务器代码。主要的问题可能是编码。
直接使用inputstream和outputstream可能会有问题。所以在传输数据(加密的aes密钥、文本)时使用objectstreams。