2009-06-29 8 views
4

私は公開鍵の形式を変換することに関連するこの馬鹿げた問題について、他の人が時間を節約することを願ってこれを投稿しています。誰かがより簡単な解決策や問題を見ているなら、私に教えてください!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); 

答えて

1

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

これが「パケット」内にある場合は、パケットから生データをバイト配列として取得する必要があります。 がテキストとして表されるの場合、エンコードされた形式にする必要があります。 16進またはベース64。ハッシュの外観はどうですか?

+0

うーん...あなたは正しいかもしれない - 私はそれがおそらくBase64でエンコードされていると思う。それに乾杯! 残念ながら、銀行が私たちのシステムを生産するまで私は生きているテストをすることができません。だから私はちょうどそれが私の偽の署名のために偽を返すことを確かめました。 1週間以内にTRUEの署名案件をテストすることができ、うまくいかない場合はフォローアップを投稿します。 本当にこれを理解しようとすると4時間も無駄になります... –

関連する問題