2010-10-05 60 views
0

我有關於n,p,q的信息,其中n = pq和p和q是要用於RSA算法的大質數。 例如:RSA十六進制密鑰到PEM格式

N:C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3

E:10001

號碼:D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A0BC18F5

問:E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09 272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F60BEF2AD7647

我想從該值生成PEM私鑰和公鑰。

我想他們是在十六進制格式,但我真的不知道哪些包含在pem格式的密鑰中。我知道PEM只是意味着關鍵是base64以及其他一些添加頁腳(開始公開等)。

任何建議或任何示例代碼?

我的意思是我的目標是從PEM私鑰和公鑰中獲取兩個文件傳遞給openssl。

非常感謝, 安德烈

回答

1

PEM編碼RSA密鑰是基本上在通過PKCS#1(RFC 3447),所描述的格式的二進制鍵base-64編碼,並通過一個ASCII頁眉和頁腳包圍。注意,PKCS#1格式要求私鑰不僅包括d,e,p和q,而且還要使用其他用於中國剩餘定理(d mod(p-1),d mod(q- 1)和(q的逆)mod p)。如果你知道p和q,這些很容易計算出來。

如果密鑰被加密,還有一點點,因爲你應該也有一些PEM頭描述加密。

在OpenSSL源代碼中有示例代碼(儘管它幾乎沒有評論,並且很難遵循)。你最好閱讀相關的RFC,然後檢查你的代碼與OpenSSL,以確保你的答案正確。

0

的OpenSSL/pem.h具有讀/下面的函數寫RSA密鑰(從文件) PEM_write_RSAPrivateKey PEM_read_PrivateKey

PEM_write_RSAPublicKey PEM_read_RSAPublicKey

如果還不清楚如何使用它們只問。我將爲您提供幾個示例:-)

+0

如果你能爲我提供一些例子,我將非常感激!非常感謝您的好意。 – Kerby82 2010-10-15 18:24:10

0

這是一個RSA在VB.NET項目中的示例。

STEP 1

首先,你必須格式化N,E,P,Q,DP,DQ,InverseQ,d關鍵數據(所有的人!後來見)用base64並與他們建立一個XML結構的字符串(或文件)是這樣的:

<RSAKeyValue> 
<Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW1Iix</Modulus> 
<Exponent>AQ...</Exponent> 
<P>5w/iuGIBZdTYasdfalksdkkdkdksdldfdfs</P> 
<Q>0ilXTMYjwhp+JvQPo3gnRAF0EgoHPm6tBt1</Q> 
<DP>JS2gLEzQrsLlnlkQCRZ55+RtM6cphJSa5x</DP> 
<DQ>RMWugbsdHHma6phXPcEl6EUpfHW3pSCGko</DQ> 
<InverseQ>h54IMS+ZabAn/WzOFTApgB4y16Az</InverseQ> 
<D>OjnoUo+E02CcU3TBcDFnmlrJ2ORUcXCy5FB</D> 
</RSAKeyValue> 

(當然,其中的一個就是假的,不要試圖使用它或將拋出錯誤)

正如dajames所說,你還必須擁有D,DP,DQ和InverseQ。如果你沒有他們,事情會變得更加複雜但不是不可能的,因爲你必須自己計算它們。最簡單的方法(對我來說)是訪問爲我構建P和Q號碼的工具的源代碼。在裏面,有些課程可以用這種大數字來操作。通過稍微修改了代碼,我可以計算出:

DP = (1/Exponent) mod (P - 1) 
DQ = (1/Exponent) mod (Q - 1) 
InverseQ = (1/Q) mod P where P > Q 

見最後一行,則必須考慮到的是,標準要求P>Q,或鍵將被拒絕。但是,我用Delphi(TPLockBox 2.0)使用的工具並不關心它。

注意到上面的XML十六進制數是大端,看着你的P和Q鍵,看到你可以遇到麻煩因爲D9<E2,所以P<Q !!在任何計算解決之前交換你的P和Q號碼,如果我是對的(我絕對不確定這一點,有人可以證實嗎?Thnx)

最後,將所有數字轉換爲base64並構建上述XML結構體。

第2步

隨着BouncyCastle,這是更容易。

下載BouncyCastle.dll,複製到您的項目文件夾(或任何地方),並將其引用添加到您的VB項目;現在你將有一個新的「組織」的命名空間,你可以編碼:

Dim r As New RSACryptoServiceProvider() 
' NOTE: substitute next string with above-like XML, 
' or load it from a file or what you prefer: 
r.FromXmlString("<RSAKeyValue><Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW........</RSAKeyValue>") 
Dim key As Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair = Org.BouncyCastle.Security.DotNetUtilities.GetRsaKeyPair(r) 
' Export to a PEM file:   
Dim fOut As New IO.StreamWriter("c:\keys.pem", False) 
Dim pw As New Org.BouncyCastle.OpenSsl.PemWriter(fOut) 
pw.WriteObject(key) 

希望它可以幫助像我所有的菜鳥誰大汗淋漓,像我一樣在尋找整個過程。

相關問題