Java 如果前面有线程休眠,则RSA解密需要更长的时间
我主要担心的是:我有一个SpringBoot应用程序a,它使用rest模板调用另一个SpringBoot应用程序B。来自B的响应包含需要解密的加密字段 为了解密,应用程序a中一次性加载了一个RSA私钥 解密代码如下所示:Java 如果前面有线程休眠,则RSA解密需要更长的时间,java,encryption,rsa,Java,Encryption,Rsa,我主要担心的是:我有一个SpringBoot应用程序a,它使用rest模板调用另一个SpringBoot应用程序B。来自B的响应包含需要解密的加密字段 为了解密,应用程序a中一次性加载了一个RSA私钥 解密代码如下所示: Cipher rsaCipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); rsaCipher2.init(Cipher.DECRYPT_MODE, Test.privateKey); rsaCipher2.update(e
Cipher rsaCipher2 =
Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher2.init(Cipher.DECRYPT_MODE, Test.privateKey);
rsaCipher2.update(encryptMessage);
byte[] decryptedMessage = rsaCipher2.doFinal();
如果我一个接一个地提交多个请求,我会看到响应是应用程序A在不同的时间进行的,解密(仅上面的4行)每次运行的时间不同,从5毫秒到20毫秒,即使使用相同的数据执行相同的测试。这正常吗?我本以为会有更多类似的持续时间
你知道我怎样才能把解密时间控制在最低限度吗?我尝试了大量的密码,但没有成功
为了看看我是否可以在应用程序之外复制这种行为,我做了以下工作:
我用RSA算法生成了一对密钥,我加密了一个字符串。
我在一个线程上以一个主方法一个接一个地多次运行解密,平均在5毫秒内进行解密
如果我做了同样的事情,但在解密前加上100毫秒的超时,解密平均在20毫秒内进行。(如果你问我,我在计算平均值时没有考虑超时)
有人能告诉我为什么会发生这种事,我怎样才能避免它。我尝试在for语句之前初始化密码,但没有看到任何改进,我尝试在单独的线程上运行解密,虽然看到了一些改进,但与原始结果相差甚远
使用RSA生成一对密钥
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);the same thing, but add a timeout of 100ms before the decryption, the decryption is made on average in 20 ms. (in case you ask i did not take the timeou
KeyPair keyPair = keyGen.genKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
对随机字符串进行编码
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey);
rsaCipher.update("randomString".getBytes());
encryptMessage = rsaCipher.doFinal();
运行decript 1000次
for (int i = 0 ; i < 1000 ; i++ ) {
//Thread.sleep(100);
Long time = System.currentTimeMillis();
Cipher rsaCipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher2.init(Cipher.DECRYPT_MODE, privateKey);
rsaCipher2.update(encryptMessage);
byte[] decryptedMessage = rsaCipher2.doFinal();
System.out.println((System.currentTimeMillis() - time) + " ms ");
}
首先,您需要正确测试: 如果适当的基准测试显示出类似的结果,那么可能是由于睡眠导致了上下文切换、缓存刷新以及CPU较低级别上发生的所有其他事情。睡眠造成的不仅仅是延迟
这就是为什么我们不在代码中设置随机休眠。如果在收到http响应后进行解密,我会得到类似的结果。@user745671在紧密循环中运行代码与在http响应后运行代码(可能使用wallclock时间进行测量)是完全不同的。它们不同,但密码的行为相同(相同的文本在不同的时间被解密),循环是触发ITI的一种更简单的方法。现在还不完全清楚您的实际代码是什么或是什么样子,但是如果是JVM没有被预热的情况,您可以通过将解密提取到其自己的私有方法中来获得一些好处,这样JVM就可以有效地内联它。
cat /proc/sys/kernel/random/entropy_avail
3795