RSA公钥的整数部分

时间:2014-07-07 10:19:45

标签: encryption cryptography

我正在研究RSA密码系统。公钥由(n,e),整数(两个大素数的乘积)和加密密钥组成。我想分隔整数(n)和键(e)。典型的公钥以base64表示,并且具有以下类型:

 -----BEGIN PUBLIC KEY-----

 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0
 FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
 3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB

-----END PUBLIC KEY-----

现在从上面的密钥中,不清楚哪个部分是整数,哪个部分是加密密钥。如果有人可以指导我,那将会非常有帮助。

1 个答案:

答案 0 :(得分:3)

这是ASN.1 SubjectPublicKeyInfo结构的DER编码的Base64,它在RFC 5280中定义(对于ASN.1定义,请参见4.1节,对于其他文本描述,请参见4.1.2.7节)。 / p>

SubjectPublicKeyInfo  ::=  SEQUENCE  {
    algorithm            AlgorithmIdentifier,
    subjectPublicKey     BIT STRING  }

subjectPublicKey字段的内容取决于algorithm字段指定的密钥算法。

对于RSA,它将在RFC 3447

中定义RSAPublicKey结构
RSAPublicKey ::= SEQUENCE {
      modulus           INTEGER,  -- n
      publicExponent    INTEGER   -- e
  }

如果您选择的编程语言支持RSA加密,那么它很可能提供类或结构或其他特定于语言的方法来读取通用SubjectPublicKeyInfo数据并将其转换为某种表示形式,以允许访问特定于RSA的数据数据。例如,在Java中

byte[] bytes = javax.xml.bind.DatatypeConverter.parseBase64Binary( "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB" );

X509EncodedKeySpec genericKeySpec = new X509EncodedKeySpec( bytes );
KeyFactory factory = KeyFactory.getInstance( "RSA" );
PublicKey publicKey = factory.generatePublic( genericKeySpec );
RSAPublicKeySpec rsaKeySpec = factory.getKeySpec( publicKey, RSAPublicKeySpec.class );
System.out.println( "n = " + rsaKeySpec.getModulus() );
System.out.println( "e = " + rsaKeySpec.getPublicExponent() );