2016-06-21 2 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 인코딩을한다고 생각합니다.

??? Z} U L : 어떻게 위의 코드에서

문자열 텍스트 파일과 같은 문자열을 얻을 수 |?.????? (5) 시험? ㅁ ?? $ ??? _ ?? cH | L || + | Bc $? rN? g?. ?? m? s? 0? Z? k? -G? m · B · Q $ U · E · V |/λ, l '= p! (8) (8) (8) (8) (9) (9) (9) ? I는 ASCII 인코딩을 사용하는 경우는 _9D

, 문자열

? ㅁ {?? 이다? CGX ?? HO) C ?? ~ ???? t ROS 4 ??? : E · fF · U · r · + = = p · L · A · A · B} - Ff.?6 ?????????????????????????????????????????????????????????????? 뭐라구? ? U? + U? U? V? BJEwp * 0? '? lz2? 6? P, A? Q? 2M? 3? a ≤ W ≤ 9 ≠ M ≥ M ≥ | U |> q | Pub2.asc에서 &? V? N

텍스트 파일

----- BEGIN PGP PUBLIC KEY BLOCK ----- 버전 : BCPG의 C#을 v1.8.1.0

mIsEV2h5lwEEAJakqTE + + XcRBQ0b2P2vjNuDrgi9IcCsgEGdD3bpH6d1W8CSR YkZ EV/PwmNI1dyh8Ex + zqHQKwaPCIfEQhNjF2sIJKVyTtjpZ4YukoRto3PBjdse0zAB 2Freiv7Ha9ct0wSQRwID2haKbXpCUSQN5/j8xbx90y60ddxsOoV8C7A1AAUTtAR0 ZXN0iJwEEAECAAYFAldosdcACgkQPIdhk1pxnGAhxwQAg4NRYbuSDg5WVw3G1tVm 1xM746 + O5J6B5RHnaQvFePpVVUm/tpLyCbHPNeYlJao5FeHRYWWpU4d8OExo4phc,363,210 iv7JfHBCx9tHKso4uccS3ROaTjknw + jwuLErKLN8UvjaUUBSn8wVXzlEDVXSRYCt Vnwv/Sxsxe7mgT2qBJSYcKY = = PYEC ----- END PGP PUBLIC KEY BLOCK -----

+0

에서 유용한 정보를 통해 찾을 수 있습니다,하지만 스트림으로'MemoryStream을()'에 그 끈? get string 메소드에서, 우리가 얻은 것을보기 위해 빠른 해킹으로'var streams = new ArmoredOutputStream (stream); '과 같은 새로운'ArmoredOutputStream'에'stream'을 설정해보십시오. – ethorn10

+0

var stream = new MemoryStream() 스트림으로; stream = new ArmoredInputStream (stream); 이 스크립트를 실행하면 Exception이 throw됩니다. 다음 줄의 BouncyCastle.Crypto.dll에서 'System.NotSupportedException'publicKey.Encode (stream); – katie77

+0

'ArmoredOutputStream'이 아닌'ArmoredInputStream' – ethorn10

답변

0

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

당신은 또한 파일을 작성할 때 당신은`ArmoredOutputStream`를 사용하는 How do you get a string from a MemoryStream?

+0

위치를 설정하면 문자열이 생깁니다. 그러나 파일에있는 것과 같지 않습니다. – katie77

관련 문제