java - 如果线程 hibernate 之前,RSA 解密需要更长的时间

标签 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 行)每次运行需要不同的时间,从 5 毫秒到 20 毫秒,即使使用相同的数据执行相同的测试。这是正常现象吗?我本来期望有更多类似的持续时间。

关于如何将解密时间保持在最低限度有什么想法吗?我尝试了一组密码,但效果不佳。

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

我使用RSA算法生成了一对 key ,我加密了一个字符串。 我在一个主方法中在一个线程上一次又一次地运行解密多次,平均在 5 毫秒

内完成解密

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

有人可以解释一下为什么会发生这种情况吗?我该如何避免这种情况。我尝试在 for 语句之前初始化密码,但没有看到任何改进,我尝试在单独的线程上运行解密,并看到了轻微的改进,但与原始结果相去甚远。

使用 RSA 生成一对 key

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

最佳答案

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

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

这就是为什么我们不在代码中添加随机 sleep 的原因。

关于java - 如果线程 hibernate 之前,RSA 解密需要更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51147600/

相关文章:

Java:在 JTextField 中添加占位符

security - 散列密码和加密密码之间的区别

c - 不稳定的 openssl/rsa 行为 : RSA_EAY_PRIVATE_DECRYPT:padding check failed

java - 如何从java中的文件加载公共(public)ssh key ?

如果还使用了 EVP_PKEY_free,C++ OpenSSL RSA_free 会给出段错误

java - HibernateUtil的作用是什么?

Java程序分隔整数

java - java不同类别的假文件路径

c# - 在 .NET 中对 HTTPS 使用 chacha20-poly1305 对称算法

c# - C# 和 PHP 上的 Blowfish 加密产生不同的结果