如果在进行线程睡眠之前,RSA Decrypt花费的时间更长

时间:2018-07-03 06:04:59

标签: java encryption rsa

我主要关心的是:我有一个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

1 个答案:

答案 0 :(得分:1)

首先,您需要进行正确的测试:How do I write a correct micro-benchmark in Java?

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

这就是为什么我们不将随机睡眠放入代码中的原因。