我主要关心的是:我有一个Spring Boot应用程序A,它使用rest模板调用另一个Spring Boot应用程序B。来自B的响应包含一个需要解密的加密字段。
为了解密它,一次将RSA私钥加载到应用A中。
解密代码如下:
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的超时时间,则解密平均将在 20 ms 中进行。 (以防万一,您问我在计算平均值时没有考虑超时)。
有人可以请问一下为什么会发生这种情况,以及如何避免这种情况。我尝试在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
答案 0 :(得分:1)
首先,您需要进行正确的测试:How do I write a correct micro-benchmark in Java?
如果正确的基准测试显示相似的结果,则可能是由于休眠导致上下文切换,缓存刷新以及在CPU较低级别发生的所有其他事情。睡眠造成的不仅仅是延迟。
这就是为什么我们不将随机睡眠放入代码中的原因。