25

多くのフォーラムや例を見直しましたが、何も助けませんでした。私は任意のwebserviceから署名を確認する必要があります。私は検証のための公開鍵を持つtest.crtファイルを持っています。パブリックキーをCRTファイルから読み込み、署名を確認する方法は?

static bool Verify(string text, string signature) 
{ 
    X509Certificate2 cert = new X509Certificate2(
     HttpContext.Current.Server.MapPath("test-server.cert")); 
    RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key; 

    // Hash the data 
    SHA1Managed sha1 = new SHA1Managed(); 
    UnicodeEncoding encoding = new UnicodeEncoding(); 
    byte[] data = encoding.GetBytes(text); 
    byte[] sign = Convert.FromBase64String(signature); 
    byte[] hash = sha1.ComputeHash(data); 

    return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign); 
} 

しかし、結果は常に偽である:(

私は、OpenSSLの例があります。

openssl base64 -d -in signature -out signature.bin 
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway 
+0

私は、テキストのための署名を生成し、それをすぐに確認するシンプルなアプリを作成しました。ここで確認できます:https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

上記の方法はOKです。署名と確認に適切な証明書を使用していますか? –

+3

ウェブアプリでも同じことをやったので、ウェブではありません。どのようにWebサービスからあなたのアプリケーションに署名を渡すのですか? –

答えて

1

は、私が障害の原因になる可能性があり、使用UnicodeEncodingの疑いをASCIIEncodingのバイトの下に示されているようにとUnicodeEncodingはASCIIが8ビットのエンコーディングであり、WindowsのUnicodeエンコーディングが16ビットであるという理由で同じではありません。他の質問ではCan not get signatureあなたはASCIIEncodingを使用しています。 UnicodeEncodingを使用してerifyは明らかに一致しません。

string text = "Hello"; 
Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length); 
Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length); 

出力

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10 
関連する問題