前回こんな記事を書いてました。
公開鍵で暗号化した後、RSACryptoServiceProvider.Encrypt()
を使って秘密鍵で復号したかったのですが、この件で断念しました。
ただデジタル署名はしないといけなかったので、今回RSACryptoServiceProvider.SignHash()
ででデジタル署名することにしました。
署名の作成
rsa = new RSACryptoServiceProvider(); using (MD5 md5= new MD5CryptoServiceProvider()) { byte[] bs = md5.ComputeHash(target); hash = rsa.SignHash(bs, CryptoConfig.MapNameToOID("MD5")); }
まずは署名を作成します。
デジタル署名の前準備としてMD5CryptoServiceProvider.ComputeHash()
で、まずは対象となるデータをハッシュ化しておきます。
あとはRSACryptoServiceProvider.SignHash()
でパパパッと署名作成して、おわりっ!簡単!
第二引数には、ハッシュ化に使用したアルゴリズムの識別子を入れます。今回はMD5でハッシュ化したので、CryptoConfig.MapNameToOID("MD5")
でアルゴリズム識別子を取得します。
デジタル署名の検証
string key = "公開鍵を入れてね"; byte[] hash; //署名 using (var rsa = new RSACryptoServiceProvider()) { //公開鍵取得 rsa.FromXmlString(key); using (MD5 md5 = new MD5CryptoServiceProvider()) { var hashedData = md5.ComputeHash(data); return rsa.VerifyHash(hashedData, CryptoConfig.MapNameToOID("MD5"), hash); } }
デジタル署名の検証は、ハッシュ化したデータと署名を比べる必要があります。
まず、MD5CryptoServiceProvider.ComputeHash()
で対象のデータをハッシュ化します。
あとはRSACryptoServiceProvider.VerifyHash()
でパパパッと署名確認して、おわりっ!超簡単!
第一引数はハッシュ化したデータ、第二引数にはハッシュ化に使用したアルゴリズムの識別子、第三引数には署名を入れます。順番で迷いますが、MSDNちゃんと見ておけばわかります。
まとめ
やってみれば解説なんて不要なくらい簡単にできちゃいます。MD5の安全性が低いので、SHA2とかでハッシュ化したほうがホントはいいのですが……これもまた問題があったので、別記事で書かせていただきます。