Bouncy Castle,RSA:将密钥转换为String格式

Ske*_*nor 19 c# rsa bouncycastle

我在我的C#项目中使用RSA(Bouncy Castle API).我用这个方法生成了密钥对:

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;
Run Code Online (Sandbox Code Playgroud)

现在我想将它们保存在txt文件中,但问题是我无法将它们转换为字符串格式.我在另一篇文章中读到必须使用以下序列化密钥:

PrivateKeyInfo k = PrivateKeyInfoFactory.CreatePrivateKeyInfo(private_key);
byte[] serializedKey = k.ToAsn1Object().GetDerEncoded();
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?如果是,那我该怎么办?只需将它们从byte []转换为String?

JoD*_*oDG 26

您还可以使用PemWriter以PEM格式存储它们:

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

string privateKey = textWriter.ToString();
Run Code Online (Sandbox Code Playgroud)

现在privateKey包含这样的内容:

-----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-----
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 8

好吧,我不知道RSA特定的一面,但是一旦你有了一个不透明的二进制字符串(即它可以包含任意数据),文本转换的最佳选择是Convert.ToBase64String(byte[])你可以逆转Convert.FromBase64String(string).

不要使用Encoding.GetString(byte[])Encoding.GetBytes(string)为此 - 二进制数据不是特定编码中的文本,应该这样对待.如果你试试这个,你几乎肯定会丢失数据.