2016-06-21 4 views
0

Я генерирую открытый ключ и секретный ключ и хочу сохранить открытый ключ в строковом поле. Сохранение его в файл отлично работает. но как я могу получить его в строку ...Сохранение PgpPublicKey в строке

private string SaveAndReturn(PgpPublicKey publicKey, bool armor = true) 
    { 
     var fileStream = new FileInfo([email protected]"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. Как я получаю ту же строку в текстовом файле

Строка из кода выше:

??? г} у л: |.?? 5 тест ??? Wh ?? $ ??? _ ?? сН ??? л ~ ?? + ?? Bc $? Р.Н. ?? г?. ?? м? С ???? 0? Z ??? к ??? G ?? mzBQ $ U? E ?? V |/?, l ??? = ???? ???? ?? 5 %% 9 ?? ае S |?? 8Lh \ ??? |? Рв ?? G * 8 ???? N9' ??? + (|? R ?? Q @ R ?? _9D

Если я использую кодировку ASCII, строка

?? Втч {?? ;? CGX ?? Hồ) ??? С ~ ???? т Ros 4 ??? :?????.? ?????? Е фФ U г + = р ??? # л ????? в ?? B} ???? - о ?? д ??? i5 Испытание? Wh? ? U? + U ??????????? v ?????? BJEwp * 0? '? Lz2 ?? 6 ?? P, A ??? Q ?? 2M ?? 3? W ?? 9 ??? * ???? M% |?? U ^> ?????? д? & ?? В ?? N

Текст из файла Pub2.asc

----- BEGIN PGP ОТКРЫТОГО КЛЮЧА БЛОК ----- Версия: BCPG C# v1.8.1.0

mIsEV2h5lwEEAJakqTE + XcRBQ0b2P2vjNuDrgi9IcCsgEGdD3bpH6d1W8CSR + YkZ Е.В./PwmNI1dyh8Ex + zqHQKwaPCIfEQhNjF2sIJKVyTtjpZ4YukoRto3PBjdse0zAB 2Freiv7Ha9ct0wSQRwID2haKbXpCUSQN5/j8xbx90y60ddxsOoV8C7A1AAUTtAR0 ZXN0iJwEEAECAAYFAldosdcACgkQPIdhk1pxnGAhxwQAg4NRYbuSDg5WVw3G1tVm 1xM746 + O5J6B5RHnaQvFePpVVUm/tpLyCbHPNeYlJao5FeHRYWWpU4d8OExo4phc iv7JfHBCx9tHKso4uccS3ROaTjknw + jwuLErKLN8UvjaUUBSn8wVXzlEDVXSRYCt Vnwv/Sxsxe7mgT2qBJSYcKY = = PYEC ----- END PGP PUBLIC KEY BLOCK -----

+0

Вы используете 'ArmoredOutputStream' при записи файла, а' MemoryStream, как поток() 'на Струна? В вашем методе get string попробуйте установить 'stream' в новый' ArmoredOutputStream', например 'var stream = new ArmoredOutputStream (stream);' как быстрый взлом, чтобы увидеть, что получилось – ethorn10

+0

Я попытался добавить этот var stream = new MemoryStream() как Стрим; stream = new ArmoredInputStream (поток); Когда я запустил это, я получаю исключение: «System.NotSupportedException» в BouncyCastle.Crypto.dll на следующей строке publicKey.Encode (stream); – katie77

+0

'ArmoredOutputStream' не' ArmoredInputStream' – ethorn10

ответ

0

position из MemoryStream все еще установлен в конце строки вы писали в него , Вам нужно сбросить позицию до 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?

+0

Установка позиции дает мне строку. Но это не то же самое, что в файле. – katie77

Смежные вопросы