【问题标题】:Unable to generate same key pair from same random seed无法从相同的随机种子生成相同的密钥对
【发布时间】:2013-05-02 10:17:18
【问题描述】:

我正在使用 java 密码学来生成公钥和私钥。我正在使用String.getBytes() 来生成它。但是在解密时,我使用相同的String.getBytes() 来获取密钥。但我没有得到与以前相同的密钥。请帮忙。下面是代码示例。

KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom ss = null;
ss = new SecureRandom("ABCD".getBytes(UNICODE_FORMAT));
keyGenerator.initialize(512, ss);
KeyPair myKeyPair = keyGenerator.generateKeyPair();   

System.out.println(myKeyPair.getPrivate());
System.out.println(myKeyPair.getPublic());

【问题讨论】:

  • 标题有待改进。
  • 您的代码示例仅生成一对密钥 - 因此它不能证明您的问题。请调整它,以便您有一个可以重现您的问题的示例代码。

标签: java cryptography rsa private-key public-key


【解决方案1】:

您的代码表明您对应该如何使用非对称加密存在根本性的误解。您的发送者和接收者应该有自己的、独立的密钥对。然后,发送者使用接收者的公钥加密数据。

您正在做的是使用固定字符串在两个位置生成相同的密钥对。这并不安全,因为您已将密钥空间从 512 位(这已经太小了 - 至少使用 1024 位)减少到与(可能很短的)字符串相关的熵。

如果您希望使用“密码”字符串在两端派生密钥,则使用对称算法(例如 AES)和密码派生函数,例如 PBKDF2。

【讨论】:

  • 有没有可能的方法来检索之前生成的相同的私钥和公钥?。即使它不安全,对我来说也可以,数据并不那么重要。
  • @user2342659 好吧,您当前的方法每次都生成相同的密钥对。如果你没有得到那个,你在某个地方犯了一个错误。调整您的问题以包含一个 SSCCE 来演示问题,我们可以提供进一步的帮助。
  • 嗨,琼斯,Windows 中正在生成相同的密钥。但在 Unix 中它失败了。另外,为了您的信息,字符串“ABCD”是一个数据库值。
  • @user2342659 我猜SecureRandom 的实现在 Windows 和 Unix 上有所不同?我不确定在所有平台上使用的相同种子是否会产生相同的值。我强烈建议您使用您的字符串和诸如PBKDF2 之类的方法来派生对称密钥。
  • 如前所述,您不应相信SecureRandom 每次都生成相同的随机数。每次获得相同随机值的唯一方法是每次都使用 Sun 提供程序的“SHA1PRNG”,并立即为其播种一个已知值。但即使是“SHA1PRNG”也没有标准化。正如 Duncan 已经提到的,这不是生成密钥的正确方法(甚至不是对称密钥,更不用说非对称密钥了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多