如果在线程hibernate之前,RSA Decrypt需要更长的时间

我主要担心的是:我有一个春季启动应用程序,A,使用其他模板调用另一个春季启动应用程序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行)每次运行需要不同的时间,即使是相同的测试,从5ms到20ms,执行相同的数据。 这是正常的吗? 我本来期望有更多类似的持续时间。

关于如何将解密时间保持在最低限度的任何想法? 我尝试了一个密码池,但没有顺利进行。

为了看看我是否可以在应用程序之外复制行为,我执行了以下操作:

我使用RSA算法生成了一对密钥,我加密了一个字符串。 我在一个主线程中,在一个线程上一个接一个地运行解密,并且在5毫秒内平均进行解密

如果我做同样的事情,但在解密之前添加100ms的超时,则解密在20ms内平均进行。 (如果你问我在计算平均值时没有考虑超时)。

有人可以请说明为什么会发生这种情况,我该如何避免它。 我尝试在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(); 

运行了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 "); } 

如果有人询问我的熵:

 cat /proc/sys/kernel/random/entropy_avail 3795 

首先,您需要正确测试: 如何在Java中编写正确的微基准测试?

如果正确的基准测试显示类似的结果,则可能是由于睡眠导致上下文切换,缓存刷新以及在CPU的较低级别上发生的各种其他事情。 睡眠不仅仅是一种延迟。

这就是为什么我们不在我们的代码中放置随机睡眠。