如果我这样做:
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字节长吗?
答案 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
)。