4

公開鍵の形式を変換することに関するこの本当にばかげた問題で私が失った時間を他の誰かが節約できることを願って、これを投稿しています。誰かがより簡単な解決策や問題を見つけたら、私に知らせてください!

私が使用している e コマース システムは、署名とともにいくつかのデータを送信します。また、公開鍵を .pem 形式で提供してくれます。.pem ファイルは次のようになります。

-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe+hkicNP7ROHUssGNtHwiT2Ew HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ+zlM4OUhCCAtSWflB4wC Ka1g88CjFwRw/PB9kwIDAQAB -----END PUBLIC KEY-----

上記を、署名を検証できる「RSACryptoServiceProvider」に変換するマジック コードを次に示します。.NET はどうやら (そして、証明書ファイルに関するいくつかの主要な頭痛の種なしでは驚くほどそれを行うことができないため)、BouncyCastle ライブラリを使用します。

RSACryptoServiceProvider thingee;

using (var reader = File.OpenText(@"c:\pemfile.pem"))
{
    var x = new PemReader(reader);
    var y = (RsaKeyParameters)x.ReadObject();

    thingee = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
    var pa = new RSAParameters();
    pa.Modulus = y.Modulus.ToByteArray();
    pa.Exponent = y.Exponent.ToByteArray();
    thingee.ImportParameters(pa);
}

そして、実際に署名を検証するコード:

var signature = ... //reads from the packet sent by the eCommerce system
var data = ... //reads from the packet sent by the eCommerce system
var sha = new SHA1CryptoServiceProvider();
byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(data));
byte[] bSignature = Convert.FromBase64String(signature);

///Verify signature, FINALLY:
var hasValidSig = thingee.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), bSignature);
4

1 に答える 1

2

潜在的な問題: を使用することEncoding.ASCII.GetBytes(data)は、ほぼ確実にハッシュを取得するための間違った方法です。つまり、上位ビットが設定されていないハッシュのみを送信できます。

これが「パケット」にある場合は、パケットから生データをバイト配列として取得する必要があります。テキストとして表現する場合は、16 進数や base64 などのエンコード形式にする必要があります。ハッシュはどのように見えますか?

于 2009-06-29T15:10:25.760 に答える