ZAKO-PG

こんなザコがプログラマーなの?

.NET(C#)でデジタル署名をするには?コードで解説!

スポンサーリンク

f:id:cookie11109:20180814102831p:plain
前回こんな記事を書いてました。

zako-pg.hatenablog.com


公開鍵で暗号化した後、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ちゃんと見ておけばわかります。

RSACryptoServiceProvider.VerifyHash Method (Byte[], Byte[], HashAlgorithmName, RSASignaturePadding) (System.Security.Cryptography)

まとめ

やってみれば解説なんて不要なくらい簡単にできちゃいます。

MD5の安全性が低いので、SHA2とかでハッシュ化したほうがホントはいいのですが……これもまた問題があったので、別記事で書かせていただきます。