3

这可能是一个新手问题。我正在使用 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 个字节?我在这里错过了什么吗?

4

3 回答 3

10

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

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

于 2009-10-15T12:37:24.287 回答
2

这里有一个关于 RSA 的小故事,它解释了密钥长度并不总是你想的那样,即,它是从最高有效位开始计算的。但是,它不应超过 512 位,因为这是密钥的最大长度。这个故事是关于感知的密钥长度,不一定是实现中的密钥长度。

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

于 2009-10-15T12:39:21.787 回答
-1

8 * 64 = 512?

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

于 2009-10-15T12:25:50.560 回答