【问题标题】:Saving the PgpPublicKey to string将 PgpPublicKey 保存到字符串
【发布时间】: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


【解决方案1】:

MemoryStreamposition 仍设置为您写入其中的字符串的末尾。在尝试再次读取之前,您需要将位置重置为 0。您可以在调用代码中或直接在GetString() 中执行此操作。这是调用代码中的修复:

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;
}

您还可以在How do you get a string from a MemoryStream?找到一些有用的信息

【讨论】:

  • 设置位置给了我一些字符串。但与文件中的不一样。
猜你喜欢
  • 2011-03-05
  • 2012-02-03
  • 2015-02-07
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
相关资源
最近更新 更多