Java中的RSA算法:如何在java.security.Key接口上运行getEncoded方法?

时间:2014-02-13 14:45:04

标签: java rsa public-key asn.1

我想更熟悉RSA算法,我为此做了一个小项目。实际上,everithing工作正常,我可以正确地加密和解密消息,但我不知道我的密钥生成是否正确执行(我的目标是获得一个具有字节数组表示的公钥,我可以导出其他部分)。 / p>

我的密钥是如何生成的:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); 

random.nextBytes(new byte[128]);

keyGen.initialize(1024, random);

KeyPair keyPair = keyGen.generateKeyPair();

PublicKey pubKey = keyPair.getPublic();
PrivateKey privKey = keyPair.getPrivate();

byte[] publicKeyEncoded  = pubKey.getEncoded();
byte[] privateKeyEncoded = privKey.getEncoded();

我的问题是关于getEncoded方法,每次我的程序执行时,似乎都会生成一个新的密钥对(根据我的跟踪)但是当我调用这个方法时我仍然有相同的值,它似乎是固定的。当方法被第二次调用时,该值会被更改,并且每次在我的程序中调用它时都会更改,但如果执行了新的执行,则第一个值与上一个执行事件的第一个值相同(如果是键)不同。

根据文档,它似乎“以其主要编码格式返回密钥......”,我检查了我的密钥格式,它是X.509,但没有任何关于所描述的行为。

你能告诉我更多细节吗?

1 个答案:

答案 0 :(得分:1)

我测试了您在独立java程序中提供的代码段。每次调用它时,都会生成一个新的不同密钥。如果您的代码始终生成相同的密钥序列,则意味着随机数生成器生成相同的数字序列。

SHA1PRNG是一个PRNG,它意味着产生的数字序列取决于种子。如果PRGN用相同的种子播种两次,它将产生相同的数字序列。种子设定如下:

  • 致电setSeed(byte[])
  • 上的SecureRandom
  • 第一个next / nextBytes被称为,而setSeed之前未被称为 PRGN是由底层操作系统提供的安全机制播种的。

由于您在此处发布的代码未调用setSeed,因此SecureRandom对象应使用一些真正的随机值进行正确播种。

我的建议:

  1. 您确定不会调用setSeed(具有相同的种子值)吗?这可以解释这种行为。另请注意,getEncoded()提供的密钥编码始终以相同的字节序列30819f300d06092a864886f70d010101050003818d00

  2. 开头
  3. 尝试使用random = new SecureRandom()。它将使用您平台的默认SecureRandom实现(对于Windows,据我所知它是SHA1PRNG实现,但Linux和MaxOSX正在使用其他实现)