Java:为什么512位RSA KeyPairGenerator返回65字节密钥?

时间:2009-10-15 12:15:29

标签: java cryptography rsa

这可能是一个新手问题。我正在使用Java生成密钥对:

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

KeyPair keyPair = keyGen.genKeyPair();

RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();

现在我一直认为privateKey.getModulus()和privateKey.getPrivateExponent()形成“私钥”,并且它们与传递给密钥生成器的密钥大小(512位)一样大。

但是,privateKey.getPrivateExponent()。toByteArray()有时返回64字节(如我所料),有时是65字节数组。

为什么有时候65个字节?我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:10)

getPrivateExponent()返回一个BigInteger,toByteArray()方法返回一个字节数组,该数组总是包含一个符号位。如果设置512位指数中的最高有效位,BigInteger将添加额外的第513个0位以指定该数字为正,而不是511位负数,并将第512位设置为1.对于513位,65个字节是编码所需。

如果查看返回的字节数组的内容,如果得到65个元素的数组,第一个字节将始终为0。

答案 1 :(得分:2)

这里a little story on RSA解释了密钥长度并不总是你所想的,即它是从最重要的位开始计算的。但是,它不应超过512位,因为这是密钥的最大长度。故事是关于感知的密钥长度,不一定是实现中的密钥长度。

getPrivateExponent返回BigIntegergetPrivateExponent().toByteArray()返回BigInteger的二进制补码表示。 BigInteger已签名。 512位(64字节)未签名。这意味着:如果设置最高有效位(符号位)使其无符号,则BigInteger需要填充一个字节以使其符合要求。如果查看字节,您会发现添加的字节始终为零。

答案 2 :(得分:-1)

8 * 64 = 512?

编辑:我的不好,没有看到64和65之间的交易,确实是好问题。