【问题标题】:Why my RSA 2048 Public Key is 294 bytes long?为什么我的 RSA 2048 公钥是 294 字节长?
【发布时间】:2014-12-23 07:38:33
【问题描述】:

如果我这样做:

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 字节长吗?

【问题讨论】:

    标签: java rsa public-key


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
        publicKey.getEncoded();
      

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

      如果你真的想要原始密钥材料,你可以转换为RSAPublicKey 并调用getModulus()getPublicExponent()(给你BigIntegers)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 2019-11-27
        • 2015-05-16
        • 2016-12-28
        • 2020-08-11
        相关资源
        最近更新 更多