2011-02-23 90 views
14

我在C#項目中使用RSA(Bouncy Castle API)。我生成密鑰對用這種方法:Bouncy Castle,RSA:將密鑰轉換爲字符串格式

RsaKeyPairGenerator r = new RsaKeyPairGenerator(); 
r.Init(new KeyGenerationParameters(new SecureRandom(), 1024)); 
AsymmetricCipherKeyPair keys = r.GenerateKeyPair(); 

AsymmetricKeyParameter private_key = keys.Private; 
AsymmetricKeyParameter public_key = keys.Public; 

現在我想將它們保存在一個txt文件,但問題是,我不能將它們轉換爲字符串格式。我在另一篇文章中讀到鑰匙必須使用序列號:

PrivateKeyInfo k = PrivateKeyInfoFactory.CreatePrivateKeyInfo(private_key); 
byte[] serializedKey = k.ToAsn1Object().GetDerEncoded(); 

這是正確的方法嗎?如果是的話,我應該怎麼做?只需將它們從字節[]轉換爲字符串?

回答

7

嗯,我不知道RSA特定的一面,但一旦你有一個不透明的二進制字符串(即它可以包含任何任意數據),文本轉換的最佳選擇是Convert.ToBase64String(byte[]),您可以反轉Convert.FromBase64String(string)

不要使用Encoding.GetString(byte[])Encoding.GetBytes(string)此 - 二進制數據是不是在一個特定的編碼文本,不應該被如此對待。如果你嘗試這樣做,你幾乎肯定會丟失數據。

+0

謝謝您的快速答覆。我做你說的,因此我得到了這個** MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ7s/B4XNHmNa9LwZ91z ... **我認爲它應該是一個BigInteger否?因爲在RSA中我們使用數字(p,q ...) – Skeenor 2011-02-23 12:41:09

+0

方法名稱(GetDerEncoded)表明返回的數據包含DER編碼格式的所有RSA密鑰參數(p,q,...)。 – 2011-02-23 13:50:49

+0

@Rami:你的目標是讓你可以「補水」回PrivateKeyInfo嗎?如果是這樣,你不需要知道整數等......你只是想確保你可以序列化到一個字節數組(然後到一個字符串),反之亦然。 – 2011-02-23 13:57:08

18

你也可以使用PemWriter將它們存儲在PEM格式:

TextWriter textWriter = new StringWriter(); 
PemWriter pemWriter = new PemWriter(textWriter); 
pemWriter.WriteObject(keys.Private); 
pemWriter.Writer.Flush(); 

string privateKey = textWriter.ToString(); 

現在專用密鑰包含這樣的事情:

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQDFhB3xI1AzSMsKvt7rZ7gp2o/vd49zON89iL1ENvKkph7oFXa2 
ew/hjzbAV33lHnFFlA/vA5SDCbggRyU1/SmjfuPJFEzFbgcPLuO1Sw6z+bWXiIFp 
QNCOTIw11c0fbwk+kB2y4E1OkLv5f9atlNlekb4wBn8bMbFYtu6LGWjkFQIDAQAB 
AoGANPoMteLM3hSGMSmkzOsS4Fb5CDe/SB5W8kA805ERX8wWuhUXtDYpukwZWVme 
MNgLdagS5f7F1KfEtROgDW0Lv4/T/FWAbpgh8O2CPKYDY4ZXl8tmRH9dtYn/824l 
veLxdgNjHwo5OMvuTSDMjC3tbg2UA3kmV4VAm5QotlRinUECQQDo4zvI5e81zWnS 
kNrUARX80t432MOZyr0RvAaVJfBNQpJl0H0xp5LKP74hvPVO9WdJvJ0M4Z4QrmGO 
bm2Hsfz5AkEA2R469YXxgPLDg/LvUQqfrl8Ji9+rip7eQP7iS/dt66NMS31/HymT 
+HscEZ3qGlnQuyyyRR2rGQdhdjU42HNy/QJBAKbPTF1DxSmGbovyUauU84jaCW17 
B++6dd6kDRr7x7mvO2lOAr50RwIy0h8cV6EsycTZIqy9VhigryP0GOQfKxECQA8T 
uVZpab7hnNAh45qGGVabhOcwrhHfPGHZEU/jK7/sRBUN7vD0CzF7IxTaGXKhAAyv 
auW/zKzdRVhXE858HeUCQQCGaaAg8GwM0qIS0nHRTLldu4hIGjKn7Sk0Z46Plfwr 
oqPCtuP4ehX85EIhqCcoFnG6Ttr6AxSgNMZvErVxDBiD 
-----END RSA PRIVATE KEY----- 
+0

這個答案是正確的,但只是改變最後一行,而不是'string privateKey = pemWriter.ToString();'try'string privateKey = textWriter.ToString();' – skw 2011-12-20 19:39:38

1

如果轉換BouncyCastle的證書到.NET證書。這樣做的功能是在bouncycastle lib中(我相信它在一個名爲DotNetUtilities的類中)。該的RSACryptoServiceProvider有一個函數:

ToXmlString(bool includePrivateKey). 

,讓你的證書與如果你想包括所有成分的私有密鑰序列爲Base64 seperately,指數,模量,d(私有指數)的X表示。

相關問題