如果在线程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的较低级别上发生的各种其他事情。 睡眠不仅仅是一种延迟。
这就是为什么我们不在我们的代码中放置随机睡眠。