私は公開鍵の形式を変換することに関連するこの馬鹿げた問題について、他の人が時間を節約することを願ってこれを投稿しています。誰かがより簡単な解決策や問題を見ているなら、私に教えてください!PEMファイルからパブリックキーをロードする署名の確認方法
私が使用している電子商取引システムは、署名とともにいくつかのデータを送信します。彼らはまた、私に.pem形式の公開鍵を与えます。
----- ----- PUBLIC KEYをBEGIN MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe + hkicNP7ROHUssGNtHwiT2Ew HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ + zlM4OUhCCAtSWflB4wC Ka1g88CjFwRw/PB9kwIDAQAB ----:.pemのファイルには、次のようになります-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);
うーん...あなたは正しいかもしれない - 私はそれがおそらくBase64でエンコードされていると思う。それに乾杯! 残念ながら、銀行が私たちのシステムを生産するまで私は生きているテストをすることができません。だから私はちょうどそれが私の偽の署名のために偽を返すことを確かめました。 1週間以内にTRUEの署名案件をテストすることができ、うまくいかない場合はフォローアップを投稿します。 本当にこれを理解しようとすると4時間も無駄になります... –