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

 

5-5 RSA 公鑰 系統操作

內容:

  • 5-5-1 公鑰系統命令彙集

  • 5-5-2 產生 RSA 鑰匙配對 - genrsa

  • 5-5-3 RSA 管理命令

  • 5-5-4 RSA 操作命令

  • 5-5-5 RSA 加密與簽章範例

5-5-1 公鑰 系統命令彙集

同樣的,OpenSSL 也將許 RSADH DSA 三種較常用的公開鑰匙系統,製作成相關命令,使用者可以直接操作。本書於第四章將會介紹到相關原理與製作技巧。吾人於 OpenSSL 交談環境中,可觀察到哪它提供有哪些命令,如下:

OpenSSL> ?

openssl:Error: '?' is an invalid command.

 

Standard commands

asn1parse      ca             ciphers        crl            crl2pkcs7

dgst           dh             dhparam        dsa            dsaparam

ec             ecparam        enc            engine         errstr

gendh          gendsa         genrsa         nseq           ocsp

passwd         pkcs12         pkcs7          pkcs8          prime

rand           req            rsa            rsautl         s_client

s_server       s_time         sess_id        smime          speed

spkac          verify         version        x509

以上並非所有命令皆是,吾人將公開鑰匙密碼的相關命令歸納與說明如下:

  • genrsa:(RSA 演算法)利用 RSA 演算法產生一個鑰匙檔案(包含公開鑰匙與私有鑰匙)。

  • rsa:(RSA 演算法)處理 RSA 鑰匙的格式轉換。

  • rsautl:(RSA 演算法)使用  RSA 演算法執行加密、解密、簽署與驗證等運算。

  • gendh:(DH 演算法)產生 DH 鑰匙材料。

  • daparan:(DH 演算法)產生與處理 DH 鑰匙參數。

  • dh:(DH 演算法)處理 DH 鑰匙產生格式的轉換。

  • dsaparam:(DSA演算法)產生與處理 DSA 鑰匙參數,利用它產生 DSA 鑰匙。

  • dsa:(DSA 演算法)處理 DSA 鑰匙的格式轉換與解譯。

  • gendsa:(DSA 演算法)依據 DSA 參數產生一個 RSA 鑰匙。

上述命令大多僅針對產生公開鑰匙,以及相關鑰匙材料,至於如何利用公開鑰匙系統簽署與驗證文件,將於 0-9 節介紹。

5-5-2產生 RSA 鑰匙配對 – genrsa

OpenSSL 提供有 genrsarsarsautl 等三種 RSA 演算法命令。其中 genrsa 主要功能是產生 RSA 公開鑰匙與私有鑰匙配對,命令格式如下:

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea]

       [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

  • -out filename:密鑰輸出檔案,內定值是 PEM 格式。

  • -passout arg:對私有鑰匙加密的通行碼輸入。

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

  • -f4 -3:公開鑰匙 e 的選項。指定 -3 則表示 e=3;如指定 –f4,則 e=65537(內定值)。

  • numbits:指定鑰匙長度,大多是 1024 2048

操作範例。吾人欲產生一對 1024 位元鑰匙配對,並儲存於 rsaprivate.pem 檔案(包含公開與私有兩支鑰匙,一般稱為私有鑰匙檔案)內,其中私有鑰匙利用 DES 演算法加密,由鍵盤輸入通行碼作為加密鑰匙,操作如下:(Windows 系統下操作)

H:\SecureLab>openssl genrsa -out rsaprivate.pem -passout pass:12345 -des 1024

Loading 'screen' into random state - done

Generating RSA private key, 1024 bit long modulus

..................++++++

...................++++++

e is 65537 (0x10001)

 

H:\SecureLab>dir/b rsaprivate.pem

rsaprivate.pem

5-5-3 RSA 管理命令 - rsa

此命令是用來對已產生的鑰匙檔案管理,譬如重新設定通行碼、加密演算法、取出公開鑰匙或進行檔案格式轉換等等,命令格式如下:

openssl rsa [-inform fmt] [-outform fmt] [-in filename] [-passin arg]

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

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

  • -inform fmt-outform fmt:鑰匙檔案的輸入與輸出格式,其中 fmt 編碼可選擇 dDER)、pPEM)、tText)、nNET)、p12PKCS #12)或 eEngine)等格式。

  • -passin arg-passout arg:前者是用於輸入通行碼,來取出私有鑰匙;後修改私有鑰匙的通行碼。

  • -des-des3-idea:變更對私有鑰匙加密的演算法,需配合 –passout 選項輸入通行碼,否則執行螢幕會出現要求輸入通行碼語句。

  • -text-noout-modulus:選擇鑰匙參數的輸出格式。其中 -text 則以明文格式輸出,-noout 則表示不會輸出任何鑰匙參數道輸出檔案中,-modulus 表示輸出模組格式。

  • -pubin –pubout:公開鑰匙輸出或輸入選項,內定值是公開鑰匙輸出(-pubout)。

範例操作。之前吾人利用 genrsa 產生一個鑰匙檔案,接著再利用 rsa 管理命令,將他轉換成一般文件格式(Textrsaprivate.txt),觀察其內容如何,操作如下:

H:\SecureLab\study>openssl rsa -in rsaprivate.pem -passin pass:12345 –text rsaprivate.txt

接著,再觀察 rsaprivate.txt 檔案內容,如下:

H:\SecureLab\study>type rsaprivate.txt

Private-Key: (1024 bit)

modulus:

    00:b8:e9:23:ce:62:4b:1a:d8:aa:57:2f:6b:28:83:

    a2:44:98:67:40:03:a8:2d:2e:23:99:88:a6:a8:9c:

    62:07:98:f8:9c:95:24:c6:1b:5a:07:2e:eb:49:b0:

    38:f5:28:b7:4b:a8:eb:9d:34:bb:64:96:e8:80:28:

    59:52:e7:bd:22:79:2a:66:cd:25:d9:58:4e:c9:47:

    1a:ee:b1:2c:4b:4e:80:61:b7:2c:1d:49:96:5f:b5:

    1a:07:e3:5f:47:73:14:42:b7:b7:56:d5:76:05:0d:

    3f:d9:b1:f3:62:e3:b1:1f:13:ed:8e:29:29:95:56:

    01:8b:26:f3:0b:99:2e:0a:0d

publicExponent: 65537 (0x10001)

privateExponent:

    00:ac:0d:a2:97:82:b6:47:80:9a:df:0c:ec:34:82:

    67:16:54:88:9d:f3:c9:24:60:ee:17:0a:23:a8:77:

    fa:6e:ff:53:34:bf:41:bc:63:ee:dd:08:37:3e:15:

    8e:a9:ee:fc:be:95:aa:c6:58:2e:95:66:25:68:3a:

    23:03:15:45:d1:9c:97:94:5b:31:47:3f:61:ac:20:

    49:b0:1f:15:94:3e:cf:e5:56:b0:1a:4f:49:53:76:

    99:1e:6d:24:8d:a1:a5:43:ab:9e:12:41:dd:db:d2:

    09:e6:0a:21:c1:39:50:6a:06:0a:7d:46:69:f0:cf:

    86:a5:50:85:7f:8c:17:25:b1

prime1:

    00:e2:c1:fd:c2:47:ce:84:f3:6d:ef:93:73:8f:3c:

    91:91:f9:3c:9e:4e:db:65:fc:11:80:77:14:c3:46:

    25:1d:a5:1d:04:0f:f3:37:3b:2f:7c:3e:db:06:2c:

    1d:64:de:d5:6f:1b:1f:1e:b7:7f:96:5f:11:9e:75:

    f2:54:2d:3b:7f

prime2:

    00:d0:c1:a4:1f:8c:78:ad:bc:f0:80:20:27:db:19:

    57:03:27:f7:0a:a2:94:a0:b4:11:fd:08:d3:28:f3:

    b9:cf:04:05:e8:fa:ab:e8:da:ce:ea:c4:cf:80:45:

    2a:ae:8e:29:e9:a6:e0:8d:b7:0d:f7:b0:a0:8f:ea:

    77:9e:8b:b0:73

exponent1:

    00:97:2b:b2:eb:d1:89:49:b3:2b:e8:5b:09:e0:45:

    05:db:26:28:96:75:85:e8:c0:9a:3e:65:a4:ee:e6:

    15:9a:64:d8:2a:3c:23:ed:ff:44:11:f5:a9:78:bc:

    f2:3f:ac:1a:e8:3e:51:89:dd:d5:6e:3f:24:f4:da:

    36:da:8d:69:2b

exponent2:

    00:a5:35:ba:c7:e5:09:d4:a5:c4:c8:01:aa:c9:31:

    02:b5:d2:b9:26:47:88:cc:ad:f5:d6:85:57:67:ff:

    8b:3b:94:79:80:ea:71:86:b5:34:30:84:55:9b:b4:

    21:95:47:99:4f:fa:eb:97:fc:19:27:bf:37:32:ee:

    62:80:ad:18:95

coefficient:

    51:28:5a:d1:9a:a7:60:ba:6c:94:83:44:b0:bd:d8:

    8b:9b:9f:db:05:0c:1e:d6:f5:64:97:93:46:ff:1f:

    0f:78:ea:d5:ea:4c:ba:aa:8d:27:44:68:5b:64:93:

    b7:08:f5:71:0b:3c:81:c9:7d:b7:82:8b:70:92:ef:

    47:2a:10:4d

-----BEGIN RSA PRIVATE KEY-----

MIICXgIBAAKBgQC46SPOYksa2KpXL2sog6JEmGdAA6gtLiOZiKaonGIHmPiclSTG

G1oHLutJsDj1KLdLqOudNLtkluiAKFlS570ieSpmzSXZWE7JRxrusSxLToBhtywd

SZZftRoH419HcxRCt7dW1XYFDT/ZsfNi47EfE+2OKSmVVgGLJvMLmS4KDQIDAQAB

AoGBAKwNopeCtkeAmt8M7DSCZxZUiJ3zySRg7hcKI6h3+m7/UzS/Qbxj7t0INz4V

jqnu/L6VqsZYLpVmJWg6IwMVRdGcl5RbMUc/YawgSbAfFZQ+z+VWsBpPSVN2mR5t

JI2hpUOrnhJB3dvSCeYKIcE5UGoGCn1GafDPhqVQhX+MFyWxAkEA4sH9wkfOhPNt

75NzjzyRkfk8nk7bZfwRgHcUw0YlHaUdBA/zNzsvfD7bBiwdZN7VbxsfHrd/ll8R

nnXyVC07fwJBANDBpB+MeK288IAgJ9sZVwMn9wqilKC0Ef0I0yjzuc8EBej6q+ja

zurEz4BFKq6OKemm4I23DfewoI/qd56LsHMCQQCXK7Lr0YlJsyvoWwngRQXbJiiW

dYXowJo+ZaTu5hWaZNgqPCPt/0QR9al4vPI/rBroPlGJ3dVuPyT02jbajWkrAkEA

pTW6x+UJ1KXEyAGqyTECtdK5JkeIzK311oVXZ/+LO5R5gOpxhrU0MIRVm7QhlUeZ

T/rrl/wZJ783Mu5igK0YlQJAUSha0ZqnYLpslINEsL3Yi5uf2wUMHtb1ZJeTRv8f

D3jq1epMuqqNJ0RoW2STtwj1cQs8gcl9t4KLcJLvRyoQTQ==

-----END RSA PRIVATE KEY-----

上述參數可歸納如下:(請參考第四章說明)

  • 模數(modulus:即是 RSA 演算法的參數 n

  • 公開指數值(publicExponent:公開鑰匙的指數 e,內定值為 65537

  • 私有指數值(privateExponent:私有鑰匙的指數 d,經由 RSA 演算法產生。

  • 質數 1prime1:即是參數 p

  • 質數 2prime2:即是參數 q

  • 指數 1exponent1:即是 ψ(p)

  • 指數 2exponent1:即是 ψ(q)

  • 共通有效值(coefficient:即是 ψ(n)

也可以由 rsaprivate.pem 檔案內取出公開鑰匙,並儲存於 rsapublic.pem 檔案,假設不直接輸入通行碼,執行後螢幕會出現要求輸入通行碼,操作如下:(可利用前範例方法,觀察公開鑰匙檔案的內容如何。)

H:\SecureLab\study>openssl rsa -in rsaprivate.pem -pubout -out rsapublic.pem

Enter pass phrase for rsaprivate.pem:#####     【通行碼輸入 12345

writing RSA key

 

H:\SecureLab\study>dir/b rsapublic.pem

rsapublic.pem

5-5-4 RSA 操作命令 – rsautl

產生了 RSA 鑰匙配對之後,吾人就可以利用 rsautl 來針對文件加密、簽署或驗證的工作。基本上,rsautl 並沒有提供雜湊演算法功能,對於大量資料需要其他演算法配合才行,否則僅能處理資料長度低於鑰匙長度的文件。命令格式如下:

openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin] [-sign] [-verify]

            [-encrypt] [-decrypt] [-pkcs] [-ssl] [-raw] [-hex-dump] [-asn1parse]

  • -inkey file:指定取出鑰匙的鑰匙檔案。

  • -pubin:與 inkey 配合,取出公開鑰匙。

  • -certin:與 inkey 配合,指定鑰匙檔案是數位憑証格式。

  • -keyform:指定鑰匙格式,內定值是PEM

  • -sign-verfy-encrypt-decrypt:利用鑰匙(公開鑰匙或私有鑰匙)對輸入檔案,執行簽章、驗證、加密或解密處理。

  • -pkcs-ssl-raw:指定輸入資料補齊方式。一般要求輸入資料的長度與加密鑰匙相同,加密後密文輸出也與鑰匙相同長度。但許多情況不會剛好如此,輸入資料太短需補齊與鑰匙相同長度,太長需分割成若干區段,最後那個區段也需補齊。但補齊方式也有: –pkcs –ssl 表示輸入資料少於鑰匙長度 11 字元,-raw 為不執行補齊操作,但三者密文輸出都與鑰匙相同長度。

  • -hexdump-ans1parse:將輸出訊息以 16 進位碼表示或 ASN.1DER 編碼)解析格式顯示。

5-5-5 RSA 加密與簽章範例

假設利用之前範例產生了 rasprivate.pem rsapublic.pem 兩支 RSA 配對鑰匙,接著吾人利用公開鑰匙向明文 data.txt 加密後,得到 cipher.txt。再利用私有鑰匙解密得到 plain.txt,接著比較 data.txt plain.txt 兩檔案內容是否相同,如此可驗證 RSA 演算法的操作是否正確。

  • 步驟 1:顯示原明文檔案內容。

H:\SecureLab>type data.txt

012345678901234567890123456789

  • 步驟 2:利用公開鑰匙加密,得到密文 cipher.txt

H:\SecureLab>openssl rsautl -in data.txt -out cipher.txt -inkey rsapublic.pem -pubin -encrypt

Loading 'screen' into random state - done

H:\SecureLab>dir/b cipher.txt

cipher.txt

  • 步驟 3:利用私有鑰匙解密,得到明文 plaint.txt

H:\SecureLab>openssl rsautl -in cipher.txt -out plain.txt -inkey rsaprivate.pem -decrypt

Loading 'screen' into random state - done

Enter pass phrase for rsaprivate.pem:####             【輸入私鑰的通行碼】

  • 步驟 4:觀察 plaint.txt data.txt,兩檔案內容是否相同。

H:\SecureLab>type plain.txt

012345678901234567890123456789

吾人再利用 Linux 系統,執行一個 RSA 簽署資料範例。首先 rsa 命令利用私有鑰匙(rsaprivate.pem)簽署明文檔案 data.txtOpenSSL 會將簽署碼與原明文輸出到指定檔案上(sign.txt)。假設 sign.txt 傳遞給對方之後,對方欲證明該檔案並非他人偽造,則利用發送端的公開鑰匙(rsapublic.pem),驗證簽署檔案,如果成功的話,則將原明文內容寫入 plain.txt 檔案內。操作如下:

[tsnien@csu_linux study]$ openssl rsautl -sign -inkey rsaprivate.pem -in data.txt -out sign.txt

[tsnien@csu_linux study]$ ls -l sign.txt

Enter pass phrase for rsaprivate.pem:                        【輸入通行碼】

-rw-rw-r-- 1 tsnien tsnien 64  8  5 14:06 sign.txt

[tsnien@csu_linux study]$ openssl rsautl -verify -pubin -inkey rsapublic.pem -in sign.txt -out plain.txt

[tsnien@csu_linux study]$ cat plain.txt

012345678901234567890123456789

 

 

主講人:粘添壽博士

 

資訊與網路安全技術