Java 如果前面有线程休眠,则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

我主要担心的是:我有一个SpringBoot应用程序a,它使用rest模板调用另一个SpringBoot应用程序B。来自B的响应包含需要解密的加密字段

为了解密,应用程序a中一次性加载了一个RSA私钥

解密代码如下所示:

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