KeyPairGenerator不生成随机密钥

时间:2011-03-18 13:53:51

标签: java rsa

我使用KeyPairGenerator生成RSA密钥对,并且我注意到它一直生成完全匹配的密钥,而不是像它应该的随机密钥?也许有人有一些想法为什么会这样?

我的代码现在看起来像这样:

private static KeyPair generateKeyPair(Provider provider, int keySize) throws Exception
{

    KeyPair keyPair = null;

    /* get the eracom keystore - access to the adapter */
    //KeyStore keyStore = KeyStore.getInstance("CRYPTOKI", provider.getName());
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", provider.getName());

    keyPairGenerator.initialize(keySize);
    keyPair = keyPairGenerator.generateKeyPair();

    return keyPair;
}

问题已解决: 这是HSM和我使用的提供商的问题。看看Joachim Sauer回复的评论。

3 个答案:

答案 0 :(得分:1)

运行稍微修改过的代码版本(以使其编译)可以正常工作(即在多次运行时生成不同的密钥:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

keyPairGenerator.initialize(1024);
keyPair = keyPairGenerator.generateKeyPair();
System.out.println(keyPair.getPrivate());
System.out.println(keyPair.getPublic());

您使用的提供商可能是......行为不端吗? provider.getName()的价值是什么?

答案 1 :(得分:1)

我遇到了同样的问题。对我有用的代码是:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");    
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024,random);
KeyPair key = keyGen.generateKeyPair();

现在打印它们以使用以下方法检查键是否不同:

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

SecureRandom生成器使用给定算法(SHA1PRNG)和privider(在本例中为SUN)创建一个新的随机数。您可以在此处找到更多信息:https://docs.oracle.com/javase/tutorial/security/apisign/step2.html 和api在这里: http://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html

答案 2 :(得分:0)

你有没有初始化它。根据{{​​3}},它应该看起来像:

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(1024);
KeyPair keyPair = generator.generateKeyPair();