java - 确定性生成 RSA 加密 key 对

标签 java android rsa

我正在尝试在 Android 上使用 Java 确定性地生成 RSA key 对。我的要求是我不能存储 key 对,它必须在运行时生成,以等同于任何以前/ future 的运行。

虽然我的过程是确定性地播种随机数生成器并传递该生成器以创建 key 。我的代码是:

SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
random.setSeed(1234);   //something device specific will be used to set this
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024, random);

KeyPair pair=keyGen.generateKeyPair();
PublicKey pub=pair.getPublic();
PrivateKey priv=pair.getPrivate();

生成的键因运行而异。但是,SecureRandom 数字在每次运行中都是相同的,甚至在不同设备上也是相同的。

我错过了什么?我怎样才能重复生成这些 key ?

谢谢

最佳答案

你想做什么?即使这行得通,这段代码也依赖于 Android 上 SHA1PRNG 实现的一个怪癖,因此它可能随时崩溃。通常,setSeed() 会添加熵,因此即使您使用相同的种子为 SecureRandom 播种,也不能保证会得到相同的数字。如果您在桌面 Java 上尝试此代码,它很可能会失败。到目前为止,它适用于大多数(所有?)当前的 Android 版本,但这并不能保证。

如果您想要可预测的 key ,您可能需要为每台设备提供预生成的 key 。如果您需要安全地存储它们,请在 ICS 上使用 KeyChain API,或在 ICS 之前的设备上使用密码短语保护的 keystore 。即使您不存储实际 key ,如果有人知道 key 是如何生成的(种子),他们也可以生成相同的 key ,并且您的 key 仅与种子一样安全。如果它是特定于设备的,很可能不难找到。

至于为什么这不起作用,RSA key 生成器基本上在循环中生成随机 BigIntegers,测试素数。素数测试是概率性的,因此您可能会在每次运行时选择不同的素数。你可能想得到 SpongyCastle ,在模拟器上运行它并在 RSAKeyPairGenerator.java 中设置断点以检查到底发生了什么。

关于java - 确定性生成 RSA 加密 key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10167881/

相关文章:

android - 如何在android studio中获取手机号码?

android - Volley 中的单例类有什么用

android - 替换 android Intent 选择器对话框

c# - RSA解密公式的问题

java - 应该如何通过 HTTP 公开 RSA 公钥?

java - 如何使用 OpenPDF 添加目录

java - 如何在 dropwizard 中注册/添加命令

java - 关于从基类扩展的类的问题(Java)

java - Ant 无法导入 R.java

c# - 在 C# 中实现 RSA