【问题标题】:RSA algorithm in Java : How works getEncoded method on java.security.Key interface?Java中的RSA算法:java.security.Key接口上的getEncoded方法如何工作?
【发布时间】:2014-02-13 14:45:04
【问题描述】:

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

我的密钥是如何生成的:

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,但没有关于所描述行为的任何内容。

你能告诉我更多的细节吗?

【问题讨论】:

  • 如果在代码中添加类似System.out.println("Public Key: " + Hex.toHexString(pubKey.getEncoded())); 的内容会怎样?

标签: java rsa public-key asn.1


【解决方案1】:

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

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

  • 通过在SecureRandom 上调用setSeed(byte[])
  • 第一个next/nextBytes 被调用之前没有调用setSeedPRGN 是由底层操作系统提供的安全机制播种的。

由于您在此处发布的代码未调用 setSeed,因此应为 SecureRandom 对象正确植入一些真正的随机值。

我的建议:

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

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

【讨论】:

  • 嗨,Jcs,感谢您的回答。我现在有点困惑,因为它今天适用于我的代码 sn-p。我昨天尝试使用 random = new SecureRandom() 但我得到了之前描述的效果,这就是为什么我尝试了更复杂的东西。我也尝试使用new SecureRandom(byte[]) 将字符串转换为字节数组,但我得到了相同的结果。昨天和今天的唯一区别就是我的电脑关机重启了,让我抓狂。
  • “我现在有点困惑,因为它现在适用于我的代码 sn-p....” - 为此 +1 :)
猜你喜欢
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多