【发布时间】:2016-10-22 10:26:25
【问题描述】:
我正在生成公钥和密钥,并希望将公钥保存在字符串字段中。将其保存到文件中可以正常工作。但是我如何把它变成一个字符串...
private string SaveAndReturn(PgpPublicKey publicKey, bool armor = true)
{
var fileStream = new FileInfo($@"C:\encrypt\Keys\pub2.asc").OpenWrite() as Stream;
SaveFile(publicKey, fileStream, armor);
fileStream.Close();
var keyString = GetStringFromKey(publicKey);
return keyString;
}
public void SaveFile(PgpPublicKey publicKey, Stream outStream, bool armor = true)
{
if (armor)
{
outStream = new ArmoredOutputStream(outStream);
}
publicKey.Encode(outStream);
outStream.Close();
}
private string GetStringFromKey(PgpPublicKey publicKey)
{
var armor = true;
var stream = new MemoryStream() as Stream;
publicKey.Encode(stream);
stream.Position = 0;
var keyString = GetString(stream);
stream.Close();
Console.WriteLine(keyString);
return keyString;
}
private string GetString(Stream theStream, Encoding encoding = null)
{
encoding = encoding ?? Encoding.UTF8;
using (var reader = new StreamReader(theStream, encoding))
{
return reader.ReadToEnd();
}
}
pub2.asc 文件创建良好,并且在其中。我不想将密钥保存到文件中,而是将其保存到字符串中。下面的代码给了我一个空字符串。我究竟做错了什么? 因此,我更新了代码以在读取流之前设置位置。但是返回的字符串与我在文件中看到的文本不同。 我认为 ArmoredOutputStream 进行 Base64 编码。如何获得与文本文件中相同的字符串
来自上述代码的字符串:
???z}?.?u?l:?|?5 ?test??什么?? $???_??cH???L~??+??Bc$?rN??g?.??m?s????0?Z???k?-??G?? mzBQ$ U?E??V|/?,l???=???p???? ??5?%%?9??ae?S?|8Lh?\???|pB??G*?8????N9'???+(?|R??Q@R?? _9D
如果我使用ASCII编码,字符串是
??Wh{? ??;cgx??hO)???C?~????t?roS?4??:??????E?fF?U?r?+?= ?p???#L?????a??B}????-.o??q?i5???Ff.??6???????6r?HdX??} ?S???4?(j)3 ?test??什么? ?U?+U?????????????v??????BJEwp*0?'?lz2??6??P,A???Q??2M??3?a ?W??9???*????M%?|?U^>??????q?&??V??N
来自 Pub2.asc 文件的文本
-----开始 PGP 公钥块-- 版本:BCPG C# v1.8.1.0
mIsEV2h5lwEEAJakqTE+XcRBQ0b2P2vjNuDrgi9IcCsgEGdD3bpH6d1W8CSR+YkZ EV/PWMNI1dyh8Ex+zqHQKwaPCIfEQhNjF2sIJKVyTtjpZ4YukoRto3PBjdse0zAB 2Freiv7Ha9ct0wSQRwID2haKbXpCUSQN5/j8xbx90y60ddxsOoV8C7A1AAUTtAR0 ZXN0iJwEEEAECAAYFAldosdcACgkQPIdhk1pxnGAhxwQAg4NRYbusSDg5WVw3G1tVm 1xM746+O5J6B5RHnaQvFePpVVUm/tpLyCbHPNeYlJao5FeHRYWWpU4d8OExo4phc iv7JfHBCx9tHKso4uccS3ROaTjknw+jwuLErKLN8UvjaUUBSn8wVXzlEDVXSRYCt Vnwv/Sxsxe7mgT2qBJSYcKY= =PYEC -----结束 PGP 公钥块-----
【问题讨论】:
-
您在写入文件时使用
ArmoredOutputStream,但在字符串上使用MemoryStream as Stream()?在您的获取字符串方法中,尝试将stream设置为新的ArmoredOutputStream,例如var stream = new ArmoredOutputStream(stream);,以快速查看我们得到的结果 -
我尝试添加这个 var stream = new MemoryStream() as Stream;流 = 新装甲输入流(流);一旦我运行它,我会在下一行 publicKey.Encode(stream); 的 BouncyCastle.Crypto.dll 中抛出 Exception: 'System.NotSupportedException'
-
ArmoredOutputStream不是ArmoredInputStream -
对不起...我什至没有注意到输入流(对我来说太晚了)。当我使用 ArmoredOutputStream 时,我在尝试设置位置时遇到同样的异常。 var stream = new MemoryStream() as Stream;流 = 新装甲输出流(流); publicKey.Encode(流); stream.Position = 0;
标签: c# bouncycastle openpgp