2011-02-23 205 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表示。

相关问题