「OpenSSLコマンドを用いたデジタル署名」の版間の差分
提供: セキュリティ
(相違点なし)
|
2014年4月28日 (月) 19:19時点における版
OpenSSLコマンドを用いて、デジタル署名の作成(署名)と検証を行う例です。
目次
概要
デジタル署名には、2つの方法があります。
- メッセージに署名するケース
- メッセージのハッシュ値に署名するケース
メッセージのダイジェストをDSAで署名する例
ここでは、「メッセージのハッシュ値に署名するケース 」を扱います。
以下は、foo.txtのデジタル署名を作成し、検証するまでのプロセスです。
echo foobar > foo.txt openssl dsaparam 1024 -in /dev/random -out dsa_param.pem openssl gendsa dsa_param.pem -out dsa_private.pem openssl dsa -in dsa_private.pem -pubout -out dsa_public.pem openssl dgst -sha1 foo.txt | awk '{print $2}' > foo.txt.sha1.sum openssl dgst -dss1 -sign dsa_private.pem -out foo.txt.sig foo.txt.sha1sum openssl dgst -dss1 -verify dsa_public.pem -signature foo.txt.sig foo.txt.sha1sum
テスト用ファイルの作成
署名するファイルを作成します。
echo foobar > foo.txt
dsa パラメータ の作成
DSAパラメータを1セット作成し、 PEM ファイルに出力します。1024ビット長の素数を利用します。
openssl dsaparam 1024 -in /dev/random -out dsa_param.pem
プライベート鍵の作成
DSAパラメータのセットからDSAプライベート鍵を作成します。
openssl gendsa dsa_param.pem -out dsa_private.pem
公開鍵の作成
DSAプライベート鍵からDSA公開鍵を作成します。
openssl dsa -in dsa_private.pem -pubout -out dsa_public.pem
ダイジェストの作成
テスト用ファイル(foo.txt)からダイジェストを作成します。 foo.txt.sha1sum が作成されます。
openssl dgst -sha1 foo.txt | awk '{print $2}' > foo.txt.sha1.sum
ダイジェストの署名
DSA秘密鍵を用いて、ダイジェストファイル(foo.txt.sha1sum)からデジタル署名を作成します。 foo.txt.sig が作成されます。
openssl dgst -dss1 -sign dsa_private.pem -out foo.txt.sig foo.txt.sha1sum
ダイジェストの検証
検証では、以下のファイルが利用されます。
- DSA公開鍵(dsa_public.pem)
- デジタル署名 foo.txt.sig
- ダイジェスト foo.txt.sha1sum
受信側には、以下のデータがあれば十分です。
- 本文 foo.txt
- DSA公開鍵(dsa_public.pem)
- ダイジェスト foo.txt.sha1sum
受信側は、 foo.txt から foo.txt.sha1sum を作成できます。
openssl dgst -dss1 -verify dsa_public.pem -signature foo.txt.sig foo.txt.sha1sum
成功であれば、
Verified OK
と出力されます。
失敗した場合は
Verification Failure
と出力されます。
DSAパラメータをC言語形式で出力する
$ openssl dsaparam -in dsa_param.pem -noout -C static unsigned char dsa1024_p[]={ 0xEC,0x8F,0x27,0xF0,0x28,0xD9,0x18,0xA6,0x50,0x04,0x0A,0x13, 0x5A,0xB9,0x50,0x58,0x9F,0x90,0xE9,0x66,0xC1,0x9A,0x7E,0x01, 0xFF,0x97,0x8B,0xC2,0x6B,0x87,0x2F,0xD9,0x5C,0x8C,0x03,0x31, 0xD6,0x00,0xC9,0x7E,0xE2,0x59,0xA6,0xF9,0x51,0x71,0xA5,0xE6, 0x82,0x03,0x41,0x3D,0x43,0x5F,0x19,0xAE,0xAA,0xC8,0xAC,0x1D, 0x02,0x8E,0xC1,0xB7,0xF5,0x39,0xF4,0x0B,0xF4,0xEC,0xC1,0xB8, 0x35,0xE2,0x76,0x7B,0x68,0xD9,0xED,0x57,0xF5,0x4D,0x0E,0x96, 0x47,0x80,0x4D,0x29,0x07,0x87,0x13,0xBE,0xF1,0x1C,0x0F,0xBF, 0x39,0x8D,0x44,0xE5,0xE6,0x66,0x60,0x0A,0xD8,0x7E,0xC5,0xB8, 0x4A,0xB1,0xDA,0xE4,0x1A,0xC0,0x67,0x5C,0xEE,0x1A,0x15,0x64, 0x12,0x3C,0xBD,0xE5,0x78,0x7A,0xF4,0x71, }; static unsigned char dsa1024_q[]={ 0x83,0xB0,0x1D,0x85,0xFD,0x8D,0x14,0x2A,0x22,0xC0,0xC8,0xFC, 0x21,0xFF,0xAD,0xFC,0xC2,0x5D,0x6E,0x87, }; static unsigned char dsa1024_g[]={ 0x7E,0x06,0xB7,0xD2,0xBD,0x6A,0xC6,0x5F,0x7E,0xE9,0xED,0x36, 0xE6,0xD6,0x76,0xE5,0x6B,0x15,0xF2,0x07,0x70,0x05,0x3C,0x27, 0xC6,0x4E,0xDF,0x9C,0xAE,0xB3,0x8D,0x1D,0xD5,0x9F,0xE8,0x1D, 0xD9,0x62,0x63,0x2D,0xDD,0x43,0xCE,0x80,0x16,0x2A,0x81,0xA5, 0x8E,0x55,0x47,0x03,0xDC,0x6D,0x6C,0x79,0xBB,0x43,0x17,0xC3, 0x01,0xE7,0xF0,0x35,0x39,0x31,0xB2,0x01,0x79,0x14,0x2F,0x86, 0xCF,0x5C,0x8E,0x10,0x04,0x61,0xA5,0x5A,0x57,0x82,0x2B,0xCA, 0x86,0x55,0x80,0x3D,0x77,0xD8,0xE9,0xFB,0x04,0xC2,0x60,0x03, 0xEC,0x31,0x5F,0x58,0x57,0x3F,0xA0,0x06,0x67,0xCD,0x21,0xED, 0x21,0x00,0x50,0x01,0xA1,0x43,0x39,0x5F,0x30,0x40,0xF5,0x27, 0x7D,0xFE,0x24,0xF4,0x67,0x4C,0x6C,0x2F, }; DSA *get_dsa1024() { DSA *dsa; if ((dsa=DSA_new()) == NULL) return(NULL); dsa->p=BN_bin2bn(dsa1024_p,sizeof(dsa1024_p),NULL); dsa->q=BN_bin2bn(dsa1024_q,sizeof(dsa1024_q),NULL); dsa->g=BN_bin2bn(dsa1024_g,sizeof(dsa1024_g),NULL); if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL)) { DSA_free(dsa); return(NULL); } return(dsa); }