資訊與網路安全技術 第 五章 密碼系統實習環境 - OpneSSL  上一頁      下一頁

 

5-7 DSA 公鑰 系統操作

內容:

  • 5-7-1 產生 DSA 鑰匙參數 - dsaparam

  • 5-7-2 產生 DSA 鑰匙配對 - gendsa

  • 5-7-3 管理 DSA 鑰匙 - dsa

DSADigital Signature Standard)是美國國家標準的數位簽章演算法,請參考本書第七章介紹。DSA 系統除了具有產生公開鑰匙配對外,也提供簽署與驗證功能。OpenSSL 也相對提出了 gendsadsa dsaparam 三只命令,以下分別說明之。

5-7-1 產生 DSA 鑰匙參數 – dsaparam

DSA 鑰匙參數包含有 pq g(請參考第七章介紹),無論產生鑰匙配對、簽署文件或驗證都需使用到這 3 個參數,而且它必須公開的,又稱為公共鑰匙。許多應用系統,將某些固定區域之間通訊都採用相同的公共鑰匙,來產生不同的鑰匙配對,如此也不會影響系統的安全性。產生 DSA 鑰匙參數後,可利用 gendsa 命令產生鑰匙配對,或再利用 dsaparam 命令產生亦可。命令 dsaparam 格式如下:

openssl dsaparam [-inform DER | PEM] [-outform DER | PEM] [-in filename]

       [-out filename] [-noout] [-text] [-C] [-rand file(s)] [-genkey]

       [-engine id] [numbits]

  • -inform-outform:指定輸入/輸出檔案的編碼格式。

  • -in-out:指定輸入/輸出檔案名稱。

  • -noout-text-C:轉換輸入檔案成另一種資料型態。

  • -rand:指定亂數產生因子。

  • -genkey:產生公開鑰匙配對(取代 gendsa 功能)。

  • numbits:鑰匙位元數,一般 512 1024

操作範例:吾人欲產生一套 512 位元的 DSA 鑰匙參數,並儲存於 dsa512.pem 檔案內。接著再觀察這些參數以 C 語言的宣告語法(其它鑰匙檔案也可利用此方法觀察其資料結構)。命令輸入如下:

H:\SecureLab\study>openssl dsaparam -out dsa512.pem 512

H:\SecureLab\study>openssl dsaparam -in dsa512.pem -C -noout

static unsigned char dsa512_p[]={

        0xBE,0xFC,0x35,0xAB,0x5B,0xEC,0x03,0x7C,0x17,0xD6,0xE9,0xEF,

        0x7C,0xAC,0x63,0xA3,0xCF,0xE8,0xEE,0x20,0xDF,0xDB,0xE9,0x45,

        0xE5,0x3D,0x30,0x61,0x5B,0xF5,0xD0,0x33,0x98,0x56,0xE4,0xC1,

        0x7D,0x17,0xEF,0xA6,0xFE,0x42,0x18,0x6B,0xC0,0xAC,0x86,0x31,

        0x57,0xBB,0x8D,0xD1,0x31,0xC6,0x4C,0x8B,0xFC,0x7A,0xBD,0x96,

        0x8C,0x2A,0xCF,0x01,

        };

static unsigned char dsa512_q[]={

        0xED,0xA9,0x17,0x06,0xF3,0x6A,0x06,0x83,0xB2,0x07,0x8E,0xAA,

        0x4E,0x5F,0x98,0x5E,0x1E,0x9C,0xDA,0x83,

        };

static unsigned char dsa512_g[]={

        0x5D,0xCE,0x41,0x7A,0x75,0x03,0x06,0xD9,0x9F,0x2D,0x0F,0x99,

        0xB5,0x09,0xE6,0xDD,0x91,0xE8,0xB5,0x9C,0x13,0x26,0x78,0x47,

        0xAD,0x32,0x25,0xC1,0x71,0x27,0x33,0xE5,0x86,0x68,0xCD,0x36,

        0x7A,0x3B,0x15,0xFF,0x7F,0xB1,0x1A,0x61,0x58,0xF7,0x48,0xA1,

        0xB3,0xBF,0x08,0xE7,0x8F,0x33,0xD5,0xF9,0x77,0x71,0x6E,0x5E,

        0x66,0x9B,0xA9,0x9E,

        };

DSA *get_dsa512()

        {

        DSA *dsa;

 

        if ((dsa=DSA_new()) == NULL) return(NULL);

        dsa->p=BN_bin2bn(dsa512_p,sizeof(dsa512_p),NULL);

        dsa->q=BN_bin2bn(dsa512_q,sizeof(dsa512_q),NULL);

        dsa->g=BN_bin2bn(dsa512_g,sizeof(dsa512_g),NULL);

        if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))

                { DSA_free(dsa); return(NULL); }

        return(dsa);

        }

產生上述 C 語言的資料結構後,即可連結到應用系統程式上,OpenSSL 即是利用此方法,將產生的鑰匙參數與應用結合。同樣的,吾人也可觀察所參數的共用參數如何,操作如下:

H:\SecureLab\study> openssl dsaparam -in dsa512.pem -text

DSA-Parameters: (512 bit)

    p:

        00:8f:e3:07:dc:9c:2f:39:bc:5d:1e:a4:e2:f4:60:

        82:1b:b4:e9:2c:4e:75:f3:11:62:19:40:8c:d4:67:

        ec:06:65:da:72:05:fc:cd:70:5d:03:b1:55:1a:ae:

        bb:31:90:53:0b:f0:cb:d5:2a:9e:0f:d0:89:f7:38:

        0e:f2:3b:e1:99

    q:

        00:a1:97:5f:02:14:a2:f5:c4:fd:bc:24:ff:ed:c8:

        9d:9b:2b:f9:05:89

    g:

        53:ab:86:95:27:0f:84:f4:ea:4a:8c:bf:23:8b:16:

        34:10:1f:6d:71:58:e9:04:53:dc:3f:c3:4b:58:2d:

        6d:61:8d:fe:2e:8e:44:73:d4:00:4d:94:3f:62:6e:

        60:f2:8c:c9:1a:e9:71:41:75:b1:e5:f4:89:fd:af:

        1f:44:39:af

-----BEGIN DSA PARAMETERS-----

….

-----END DSA PARAMETERS-----

由上述檔案內容可以看出,利用 dsaparam 命令所產生的共用參數 pq g。ㄧ般組織單位大多僅採用一套共用參數,組織內所使用的鑰匙配對,都是利用同一共用參數(或稱共用鑰匙)所產生。

5-7-2產生 DSA 鑰匙配對 – gendsa

得到 DSA 參數之後,則可利用 gendsa 來產生 DSA 公開鑰匙與私有鑰匙,其命令格式如下:

openssl gendsa [-out filename] [-des] [-des3] [-idea] [-rand file(s)]

       [-engine id] [paramfile]

  • -out filename:輸出儲存公開鑰匙與私有鑰匙的檔案名稱。

  • -des-des3-idea:向私有鑰匙加密的演算法。

  • paramfile:輸入 DSA 參數檔案之名稱,事先利用 dsaparam 命令產生。

操作範例:吾人利用 dsaparam 產生鑰匙參數檔案後(dsa512.pem),再利用它產生 DSA 鑰匙配對,並儲存於 dsa512.key 檔案內,其中私有鑰匙經過 AES-256 演算法加密,加密鑰匙是利用通行碼 12345678,操作如下:

H:\SecureLab>openssl gendsa -out dsa512.key -aes256 -passout pass:12345678 dsa512.pem

吾人可觀察 dsa512.key 檔案內容,如下:

H:\SecureLab\study>type dsa512.key

-----BEGIN DSA PRIVATE KEY-----

Proc-Type: 4,ENCRYPTED

DEK-Info: AES-256-CBC,9A5FE4253DFA98444F115F71B29029BA

 

ORQkpmSxqRm3NRpGUZ7raK7O5E3BsLgFOCKwnO+0fs7qF2aAayo3bVG9NsZg5okl

Lj2d+E6cfkH6r2ml2FP4pTZZt/A+lltpbj4+CIaS0Hxhg7KzkX79ql6gMwEedo3Z

hFkfwAHKBF8E26dWFaGmzjdoGGLZk/oVEk5u18274evaWkSoq+qyKSOCjTUR9ZwL

B/OaDXuR6FwyLwk2alBlNmaOVqiJvYNUmOA941+9Y44SJfJtxNRkx5KUMl20ODQH

oTAGjKoxKUJkURTxwsGLwaNEXzznYtSwq/RRA5+PILivS+r9TpyWH3AeGBYA+IyQ

GjbPVdi788J0LxSnuxkUiw==

-----END DSA PRIVATE KEY-----

5-7-3 管理 DSA 鑰匙 - dsa

OpenSSL 製作了 dsa 命令用於管理 DSA 簽署系統,譬如變更私有鑰匙加密演算法或通行碼、改變鑰匙檔案格式、等等相關操作。命令格式如下:

openssl dsa [-inform PEM | DER] [-outform PEM | DER] [-in filename]

       [-passin arg] [-out filename] [-passout arg] [-des] [-des3] [-idea]

       [-text] [-noout] [-modulus] [-pubin] [-pubout] [-engine id]

  • -inform-outform:指定輸入/輸出檔案格式。

  • -in-out:指定輸入/輸出檔案名稱。

  • -passin-passout:前者輸入通行碼以打開私有鑰匙;後者設定私有鑰匙的加密通行碼。

  • -pubin-pubout:輸入或輸出公開鑰匙。

  • -text-noout-modulus:解析訊息輸出選項。Text 轉換文字格式;noout 不輸出編碼的鑰匙資料;modulus 輸出 DSA 公開參數。

操作範例:在前面範例中,已經產生了 dsa512.key 私有鑰匙,吾人在利用它產生相對應的公開鑰匙,操作如下。

H:\SecureLab>openssl dsa -in dsa512.key -pubout -out dsapub.key -passin pass:12345678

觀察公開鑰匙(dsapub.key)之內容如下:

H:\SecureLab\study>type dsapub.key

-----BEGIN PUBLIC KEY-----

MIHxMIGoBgcqhkjOOAQBMIGcAkEAvvw1q1vsA3wX1unvfKxjo8/o7iDf2+lF5T0w

YVv10DOYVuTBfRfvpv5CGGvArIYxV7uN0THGTIv8er2WjCrPAQIVAO2pFwbzagaD

sgeOqk5fmF4enNqDAkBdzkF6dQMG2Z8tD5m1Cebdkei1nBMmeEetMiXBcScz5YZo

zTZ6OxX/f7EaYVj3SKGzvwjnjzPV+Xdxbl5mm6meA0QAAkEAkeuPWqH2YCF2RpHr

Q0Wb1gdnALnqA8dOuO47c+fYyOZe59CBfBAmTczuUaMvjDiSfnKS3AgEUpZYvLDY

D5vJdg==

-----END PUBLIC KEY-----

操作範例:吾人想修改 dsa512.key 的加密通行碼(原來是 12345678),重新設定為2468123,操作如下:

H:\SecureLab\study>openssl dsa -in dsa512.key -passin pass:12345678 -out newdsa.key -passout pass:2468123

 

 

 

主講人:粘添壽博士

 

資訊與網路安全技術