k_z*_*r_k 6 java openssl cryptography rsa key-generator
我有一些 Java 代码,当我运行函数时,KeyPairGenerator.genKayPair()它可以工作 40 秒或更长时间。如何改变这种状况?如果我跑
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout server.key -out cert.pem
Run Code Online (Sandbox Code Playgroud)
它的工作 3 秒。慢代码:
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
gen.initialize(4096, random);
keyPair = gen.generateKeyPair();
PublicKey pubk = keyPair.getPublic();
PrivateKey prvk = keyPair.getPrivate();
Run Code Online (Sandbox Code Playgroud)
首先,虽然 Java 在业务逻辑方面肯定很快,但优化的 C 代码(在它很重要的地方使用汇编)在密码学方面将使其脱颖而出。
Java 将用于BigInteger执行这些计算,并且BigInteger- 并不总是包含针对所有功能的本机优化方法。请注意,在发布此答案时,Oracle JDK / OpenJDK进行了多项更改,并且确实允许从 JDK 8 开始的多种方法的内在函数BigInteger,包括蒙哥马利乘法。脚本语言通常比 Java 糟糕得多,除非它们调用本机代码。
Java 也需要时间来优化字节码。这意味着如果多次调用它,它会运行得更快。因此,您至少需要先调用一个密钥生成器,以查看如果在您的应用程序中多次调用这样的方法会发生什么。在这种情况下,运行时间可能太高,以至于它已经能够优化——这取决于 VM 实现。
RSA 密钥生成主要取决于找到两个大小约为密钥大小一半的大素数。寻找大素数是一个非常占用 CPU 的过程。它还依赖于随机数生成器来创建起点。所以实际使用的随机数生成器实现有很大的不同 -特别是如果随机数生成器在没有足够的熵可用时会阻塞。因此,请尝试使用可用的随机数生成器,直到找到一个足够快且足够安全的生成器。
寻找一定长度的质数是一个没有指定运行时间的过程;该过程不是确定性的。选择一个非常大的数字(在这种情况下,大小约为 4096 / 2 = 2048 位)并开始测试后续数字是否为质数。这就是重击您的 CPU 的原因。因此,您需要计算生成素数的平均运行时间 - 以防您生成大量素数 - 否则您将不得不忍受所需时间的不确定性。
不过,这一切都没有实际意义。一般来说,您不需要大量的 RSA 密钥——您为每个用户生成一到三个。所以这只会在以下情况下成为问题:
如果您想以更快的方式生成密钥对,您可以执行以下操作:
Provider已知快速的 Java 的本机实现,例如使用本机代码或专用硬件(如 HSM);openssl并在您的 Java 应用程序中导入/使用它们。通常虽然您需要修复协议而不是密钥对生成器。通常您只使用不需要经常生成的静态密钥对。
| 归档时间: |
|
| 查看次数: |
3445 次 |
| 最近记录: |