我正在研究RSA密码系统。公钥由(n,e),整数(两个大素数的乘积)和加密密钥组成。我想分隔整数(n)和键(e)。典型的公钥以base64表示,并且具有以下类型:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----END PUBLIC KEY-----
现在从上面的密钥中,不清楚哪个部分是整数,哪个部分是加密密钥。如果有人可以指导我,那将会非常有帮助。
答案 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() );