我使用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回复的评论。
答案 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();