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

标签 java cryptography rsa

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

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() 形成“私钥”,并且它们与传递给 key 生成器的 key 大小(512 位)一样大。

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

为什么有时是 65 字节?我在这里遗漏了什么吗?

最佳答案

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

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

关于Java:为什么 512 位 RSA KeyPairGenerator 返回 65 字节 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571999/

相关文章:

java - 调用 modelToView() 方法会卡住 Java Swing 应用程序

java - ArrayBlockingQueue - 如何 "interrupt"正在等待 .take() 方法的线程

C++ OpenSSL 导出私钥

c# - 对于支持 FIPS 的系统,是否有替代 MD5 的哈希算法?

java - 在C中使用私钥加密数据,在Java中使用公钥解密数据

java - 如何在java中播放mp3文件

java - 在 ArrayList 中查找所需数量的最小 double

javascript - 使用 PKCS7Padding 在 python 和 Node.js 之间进行 AES 加密

php - PGP 加密 - PHP openssl

c - 使用 openssl 在 stdout RSA 公钥上打印