OpenSSLコマンドを用いたデジタル署名

提供: セキュリティ
2014年4月29日 (火) 14:04時点におけるDaemon (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

OpenSSLコマンドを用いて、デジタル署名の作成(署名)と検証を行う例です。Digital Signature Algorithm(DSA)による署名です。RSAによる署名は、RSA署名をご参照ください。

概要

デジタル署名には、2つの方法があります。

  • メッセージに署名するケース
  • メッセージのハッシュ値に署名するケース

メッセージのダイジェストをDSAで署名する例

Digital Signature Algorithm(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);
        }

関連項目




スポンサーリンク