2012-10-17 49 views
4

我試圖從一個已經生成的密鑰對(兩個SecKeyRef s)中提取1024位RSA公鑰,以便通過線路發送它。我需要的只是一個普通的(modulus, exponent)對,它應該佔用131個字節(128爲模數,3爲指數)。iOS SecItemCopyMatching RSA公鑰格式?

但是,當我取的關鍵信息作爲NSData對象,我得到140位,而不是131.下面是一個例子結果:

<30818902 818100d7 514f320d eacf48e1 eb64d8f9 4d212f77 10dd3b48 ba38c5a6 
ed6ba693 35bb97f5 a53163eb b403727b 91c34fc8 cba51239 3ab04f97 dab37736 
0377cdc3 417f68eb 9e351239 47c1f98f f4274e05 0d5ce1e9 e2071d1b 69a7cac4 
4e258765 6c249077 dba22ae6 fc55f0cf 834f260a 14ac2e9f 070d17aa 1edd8db1 
0cd7fd4c c2f0d302 03010001> 

重試之後,密鑰生成幾次,比較所產生的NSData對象,保持不變的所有密鑰的字節是第一個7:

<30818902 818100> 

最後三個字節看起來像指數(65537,一個共同的價值)。還有兩個字節的「模數」和指數之間:

<0203> 

有人更加密的經驗可以幫我鑑定一下編碼是什麼? DER?我如何正確解碼模數和指數?

我試着手工剝出使用

NSData* modulus = [keyBits subdataWithRange:(NSRange){ 7, 128 }]; 
NSData* exponent = [keyBits subdataWithRange:(NSRange){ 7 + 128 + 2, 3 }]; 

係數和指數,但試圖解密使用「鑰匙」的遠程主機編碼數據時,我得到的錯誤。

編輯:

這是我結束了使用解開RSA BLOB的解決方案的要點是:https://gist.github.com/vl4dimir/6079882

+0

這是此共同ASN.1 RSA公鑰格式的DER編碼: 'RSAPublicKey :: = SEQUENCE { 模量INTEGER - , - N publicExponent INTEGER - 電子 }' 見[PKCS -1](http://tools.ietf.org/html/rfc3447#appendix-A.1.1) –

回答

2

假設你要解決的iOS下工作,請看看this thread。該帖子確認編碼是DER,並顯示如何從開始的NSData對象中提取指數和模數。

還有另一種解決方案不適用於iOS,但可用於在this thread中安裝OpenSSL的Desktop系統(包括MacOS X)。即使您正在尋找僅支持iOS的解決方案,您仍然可以使用它來驗證您的代碼是否正常工作。

+0

謝謝。基本上,他的代碼返回與我使用的蠻力解決方案相同的密鑰,所以問題必須在我的代碼中的其他位置。 –