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