【发布时间】:2021-03-04 06:49:43
【问题描述】:
我有一个聊天应用,我用 RSA 算法加密了聊天消息。
聊天时一切正常。但问题是当应用程序启动并加载几个用户的消息列表时。这里很慢。
- 用户数:30 - 40
- 每个用户的消息数:40
我有两个嵌套循环
- 迭代用户的第一个循环
- 为每个用户迭代消息的第二个循环
我只是在嵌套循环中解密消息,但加载速度很慢。
为所有用户加载消息大约需要 20 - 25 秒。我也尝试过混合加密(RSA + AES),但它也很慢,因为我用 AES 中的新密钥加密每条消息,然后用 PublicKey 加密每条密钥。
有什么改进建议吗?
AES 密钥生成
SecureRandom rnd = new SecureRandom();
byte [] key = new byte [16];
rnd.nextBytes(key);
this.secretKey = new SecretKeySpec(key, algorithm);
this.cipher.init(Cipher.ENCRYPT_MODE, this.secretKey);
this.cipher.doFinal(input)
RSA 密钥生成
this.keyGen = KeyPairGenerator.getInstance("RSA");
this.keyGen.initialize(1024);
this.pair = this.keyGen.generateKeyPair();
this.privateKey = this.pair.getPrivate();
this.publicKey = this.pair.getPublic();
【问题讨论】:
-
很难判断可能是什么问题。如果您可以创建minimal reproducible example,请这样做并在您的问题中发布代码。只有一个建议:如果您的代码需要很长时间才能生成新的随机密钥,那么您可能用尽了
/dev/random处用于生成随机数的熵池。尝试改用/dev/urandom。 -
@r3mainer 你不需要随机数生成器来解密。
-
@MaartenBodewes 但是,如果您使用新密钥加密每条消息,大概会这样做。等待您的建议。
-
@r3mainer 谢谢,我刚刚添加了密钥生成的部分
-
正如@Maarten Bodewes 所建议的,从 RSA 更改为 ECIES 可能是个好主意。一个简单的加密-解密基准表明,ECIES 的加密时间比 RSA 高 2.5 倍以上,但对于 解密,ECIES 的时间仅为 一半与 RSA 相比的时间。
标签: java encryption cryptography public-key-encryption encryption-symmetric