为什么我的RSA 2048公钥长294字节?

时间:2014-10-28 00:47:31

标签: java rsa public-key

如果我这样做:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
Key publicKey = kp.getPublic();
byte [] pubKey = publicKey.getEncoded();
System.out.println("Size: " + pubKey.length);

我的输出值是294. RSA 2048输出不应该是256字节长吗?

2 个答案:

答案 0 :(得分:5)

RSA密钥不包含随机字节,例如AES密钥;它由数字组成。 RSA的密钥大小由模数定义,但它也需要公共指数(通常是费马的第四个数或另一个小素数)。因此,使用getEncoded()将两者都嵌入到ASN.1 DER编码的字节数组中,该数组通常存在于名为SubjectPublicKeyInfo的X5.09证书中。

如果要提取密钥大小,请改用((RSAPublicKey) publicKey).getModulus().bitLength()。要查看结构,请使用openssl asn1parse或使用在线解码器,例如this

答案 1 :(得分:2)

  publicKey.getEncoded();

这将以标准格式返回带有一些开销的编码密钥(如算法标识符)。

如果你真的想要原始密钥材料,可以转为RSAPublicKey并致电getModulus()getPublicExponent()(给你BigInteger)。