2012-02-22 11 views
1

みんな!デジタル署名付きハッシュの結果を見るC#

私はC#でいくつかのデータにデジタル署名しようとしています。すべてがエラーなく行われますが、私がRSACryptoServiceProvider.SignHashの結果を見たい場合、私は奇妙な結果を得ます。 ??!私はこのテキストを取得

System.Security.Cryptography.X509Certificates.X509Store store = new System.Security.Cryptography.X509Certificates.X509Store(StoreName.My, StoreLocation.CurrentUser); 
    store.Open(OpenFlags.ReadOnly); 
    X509Certificate2Collection certCollection = store.Certificates.Find(X509FindType.FindBySubjectName, "SOME NAME", true); 

    X509Certificate2Enumerator enumerator = certCollection.GetEnumerator(); 

    X509Certificate2 x509 = null; 
    while (enumerator.MoveNext()){ 
     x509 = enumerator.Current; 
    } 

    store.Close(); 

    RSACryptoServiceProvider csp = null; 
    csp = (RSACryptoServiceProvider)x509.PrivateKey; 

    if (csp == null){ 
     throw new Exception("Valid certificate was not found"); 
    }  

    string sTestText = "SomeTestData"; 
    System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding(); 

    SHA1Managed sha1 = new SHA1Managed(); 
    ASCIIEncoding encoding2 = new System.Text.ASCIIEncoding(); 
    byte[] data = encoding2.GetBytes(sTestText); 
    byte[] hash = sha1.ComputeHash(data); 

    Byte[] baSignedHash = csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")); 

    string sSignedHash = System.Text.ASCIIEncoding.ASCII.GetString(baSignedHAsh); 

    Console.WriteLine("sSignedHash=" + sSignedHash); 

はここに私のコードです sSignedHash =H↨??? C↑X ?????? sPotpisaniHash = J1 ?? Qを???? 7 G ?? D 5 = Dcと6C ????♀?? J P♠♥{♫?? [I↔?????◄??;?????????!? ??}Sx☺> VN?I6?☻ '??▲F ??トン@?E?↕?▬?? ??►kV?' ???☻GX ??} X @ ???)? ?F?7TP?♂& ??

私はさまざまなエンコーディング(UTF8など)を試しましたが、運はありませんでした。何が問題なのかをenyoneは知っていますか?

答えて

2

何が問題なのかを知っていますか?

はい。あなたは不透明なバイナリデータをテキストのように扱います。そうではありません。

あなたは16進表現を得ることができます:それは「実際にテキストデータをエンコードされたバイナリデータ」の違いを理解することは非常に重要です

string text = Convert.ToBase64String(baSignedHash); 

string text = BitConverter.ToString(baSignedHash); 

またはベース-64の表現を(これEncoding.GetStringの出番である)と、(例えば画像データ、実行可能ファイル、暗号化データ、圧縮データ)を「テキストではありませんバイナリデータ」。

+0

ありがとうございました。それは本当に助けになりました。今私は違いを得る。 :) –

1

ハッシュがテキストを表していないため、テキストエンコードは使用しないでください。それは単なる束です。

ハッシュを読み取り可能なものに変換するには、16進エンコードまたはBase64エンコードを使用する必要があります。

Hexには、ハッシュの各バイトが出力の2文字に対応するという利点があります。

string sSignedHash = BitConverter.ToString(baSignedHash).Replace("-", ""); 

Base64は、それがより短いという利点があります。

string sSignedHash = Convert.ToBase64String(baSignedHash); 

入力テキストをエンコードするために、私はnew Utf8Encoding(false, true)を使用することをお勧めします。これはBOMを発行せず、壊れたデータを静かに出力するのではなく、無効な入力に遭遇したときに例外をスローします。

+0

お返事ありがとうございます。あなたの事例もうまくいった! –

関連する問題