2014-07-07 35 views
0

我正在研究RSA密碼系統。公鑰由(n,e),一個整數(兩個大質數的乘積)和加密密鑰組成。我想分開整數(n)和鍵(e)。典型的公鑰以base64表達,以下類型的:RSA公鑰的整數部分

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

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

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

現在從上面的項,它是不明確哪一部分是整數,並且其中一個是加密密鑰。如果有人能指導我,這將是非常有幫助的。

+0

很高興知道它爲什麼被低估! – user3001408

+0

因爲讀取產生該密鑰表示的方法的文檔會給你答案。 –

+1

@OlegEstekhin在寫之前想想。 OP可能通過電子郵件收到了此信息,在網站上閱讀等。 –

回答

3

這是ASN.1 SubjectPublicKeyInfo結構的DER編碼的Base64,其定義在RFC 5280(關於ASN.1定義請參閱4.1節,關於附加文字說明請參閱第4.1.2.7節)。

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

subjectPublicKey字段的內容取決於其由algorithm字段中指定的密鑰算法上。

對於RSA,這將是RFC 3447

RSAPublicKey ::= SEQUENCE { 
     modulus   INTEGER, -- n 
     publicExponent INTEGER -- e 
    } 

定義RSAPublicKey結構如果您選擇的編程語言支持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()); 
+0

請不要'''sun.misc。*'。他們將在未來的版本中被刪除。特別是現在,從Java 8開始,就有'java.util.Base64'。 – ntoskrnl

+0

儘管通常使用'sun.misc.BASE64Decoder'有效的一點就足以定義該示例的意圖,而不需要引入大量解釋。這個問題甚至對於任何編程語言都不是特定的。 –

+1

好點,但我很擔心那些從互聯網上覆制粘貼隨機代碼片段而沒有完全理解他們在做什麼的人。這些人太多了。現在有一個標準的課程,我不希望sun.misc瘟疫進一步傳播。 – ntoskrnl