Ka-bi̍t Kái-bi̍t Ê Kán-kài

加密解密的簡介

佇 cable modem 佮 MTA 的環境,為著欲保護傳送的資料莫(mài)予人偷聽,會使用加密這个技術。毋過,毋是凊凊彩彩就會使使用這个技術,
參咱人仝款,若是欲共祕密的資訊傳予別人,愛先認予清楚,對方敢會用得信認。佇 cable modem 佮 MTA 遮,是利用數位憑證(sòo-uī pîn-tsìng)
digital certificate 來判斷對方的身份。

因為按呢,咱就愛佇設備內底安裝 certificate,若是咧做實驗的時陣,有可能閣愛換另外一組 certificate。真濟人予這幾張 certificate 舞甲花嗄嗄(sà)
出問題的時陣,毋知欲按怎掠蟲,我咧(teh)想,這是因為無了解到底啥物是 certificate 造成的。

欲了解 certificate ,愛對加密的方式講起,根據我過去的經驗,見擺若是講著數學,逐家就聽甲霧嗄嗄,所以這篇就無欲講數學,直接舉例來講。

代先,先介紹幾个詞


  • 光碼(plaintext):無加密的資訊

  • 暗碼(ciphertext):加密的資訊

  • 鎖匙(key):加密的資訊就親像予人鎖去來仝款,這个鎖匙就是用來加密抑是解密的物件

  • 共通鎖匙加密(Symmetric-key ) / 公用鎖匙加密(Public-key cryptography):

    頂面講著 key 加密抑是解密的物件,無講加密解密的物件,就是因為有這兩種加密的方法
    共通鎖匙加密較好理解,就是加密佮解密用的攏是仝款的鎖匙,這參咱一般使用鎖匙的觀念仝款。

    公用鎖匙加密就是加密佮解密用無仝款的鎖匙。這種方法,一開始愛做一對鎖匙(假設是 A 佮 B), 這兩枝鎖匙攏會使加密佮解密。
    但是,若是用 A 加密,就愛用 B 解密,若是用 B 加密,就愛用 A 解密,。這是利用數學揣的一組鎖匙,若是有興趣會使參考

    使用的時陣是共其中一枝鎖匙公開,彼枝叫做 public key,另外一枝就是 private key 愛家己藏予好勢,certificate 就是用來公佈
    public key 的檔案,這咱以後才閣講。

  • hash function:這个函數(hâm-sòo)會共輸入的資料舞予亂,閣鬥出一个新的,短短的資料。目的是欲予無仝的輸入得著無仝的結果,
    按呢,咱若是欲比較兩个檔案敢有相仝,只要比輸出的資料就好,毋免用原來的資料來比。較捷(tsia̍p)用的 hash function 有:sha1、sha256、md5 ...

  • hash / digest:digest 就是摘要(tiah-iàu),佇咱人的世界是講利用幾句簡單的文字,共文獻的內容表達出來。佇電腦的世界,
    是共資料擲入去hash function,算出來的資料就是 digest / hash。

  • 數位簽章(Digital Signature):這就是利用公用鎖匙加密佮 hash 做出來的。目的是欲予人檢查資料的來源是正確的,資料的內容嘛無毋著。
    方法是按呢,譬如講我有一个資料欲傳出去,我先公開我的 public key,送資料的時陣,順紲算出 hash,而且用 private key 共 hash 加密。
    共資料佮加密的 hash 鬥陣送出去。收著的人若會使解出 hash 按呢就知影這个資料確實是我送出去的,紲落去伊嘛算一擺 hash,若是 hash 仝款,
    按呢就知影這个資料的內容是參我欲送的是相仝的。



紲落來,直接舉例來看加密解密對資料做啥物代誌。

假設有一个檔案 plaintext.txt
食飽未 tsia̍h-pá--buē

若是是用 UTF-8 編碼,佔 28 bytes
# hexdump -C plaintext.txt 
00000000  e9 a3 9f e9 a3 bd e6 9c  aa 20 74 73 69 61 cc 8d  |......... tsia..|
00000010  68 2d 70 c3 a1 2d 2d 62  75 c4 93 0a              |h-p..--bu...|

先用共通鎖匙加密的方式,我用的是 DES-ECB,key = 0x1234567812345678
# openssl des-ecb -e -K 1234567812345678 -in plaintext.txt >ciphertext.txt

加密了後,變成 32 bytes,這是 DES 的特色,伊加密的方式是 8 bytes 一組,所以造出來的攏是 8 的倍數。
# hexdump -C ciphertext.txt 
00000000  71 79 f0 0b aa d8 f8 c7  fb 5f 11 0b 9e eb bb 58  |qy......._.....X|
00000010  26 aa 2c f4 57 b2 b0 3b  bd c5 bd c2 94 5d 4d 83  |&.,.W..;.....]M.|

閣來就是解密,因為是用共通鎖匙加密的方式
欲解密嘛是用仝款的鎖匙,key = 0x1234567812345678
# openssl des-ecb -d -K 1234567812345678 -in ciphertext.txt 
食飽未 tsia̍h-pá--buē

閣來,換用公用鎖匙加密,上捷用的就是 RSA。
一開始,愛先共這對鎖匙拍出來。參 DES 無仝,RSA 的鎖匙是用數學揣出來的。有伊的規律,袂使家己烏白號。
佇遮,用 openssl 揣出一枝 private key,對 private key 共 public key 分出來。
# openssl genrsa -out private.pem 384
# openssl rsa -in private.pem -pubout -out public.pem

先來試加密的功能,用 public key 加密
openssl rsautl -encrypt -pubin -inkey public.pem -in plaintext.txt -out ciphertext2.txt 

用這種方法,逐擺算出來的結果攏無仝,按呢較安全,DES 若是有用 iv (initialization vector) 嘛會使逐擺算出來攏無仝,頂面舉的例(DES-ECB)無用 iv 干焦用著 key。
# openssl rsautl -encrypt -pubin -inkey public.pem -in plaintext.txt | hexdump -C
00000000  4f 32 d5 7b 9b 65 f1 9a  1b 75 12 3f 59 57 77 17  |O2.{.e...u.?YWw.|
00000010  f7 7f 91 1d 02 70 7b 35  5b 13 06 18 c9 17 98 a9  |.....p{5[.......|
00000020  23 d6 37 5c 41 41 54 75  15 79 8f 8e d1 d7 da 9a  |#.7\AATu.y......|

# openssl rsautl -encrypt -pubin -inkey public.pem -in plaintext.txt | hexdump -C
00000000  7f 75 53 6e 7e 88 da 2b  d8 a0 bb 5b ee b3 7c 4f  |.uSn~..+...[..|O|
00000010  43 0a c0 9c 59 f3 e2 3b  25 5e 79 22 26 26 ca 49  |C...Y..;%^y"&&.I|
00000020  ad 5b 84 4b 0d db 77 da  45 67 50 09 85 e7 54 b2  |.[.K..w.EgP...T.|


拄才加密是用 public key 這馬欲解密著愛用 private key
#openssl rsautl -decrypt -inkey private.pem -in ciphertext2.txt 
食飽未 tsia̍h-pá--buē

閣來,換用 private key 做數位簽章
#openssl sha1 -sign private.pem -out sign plaintext.txt

收著資料的人,若欲檢查資料來源佮內容敢有正確,就用 public key 共數位簽章解密
#openssl rsautl -verify -pubin -inkey public.pem -in sign -hexdump 
0000 - 30 21 30 09 06 05 2b 0e-03 02 1a 05 00 04 14 0e   0!0...+.........
0010 - ed 54 1c 2c 2e c3 38 0b-a0 c5 de be b8 b5 41 fa   .T.,..8.......A.
0020 - 49 e1 25 

這个資料是用 ASN.1 的方式編的,會使用 openssl 的 asn1parse 共資料讀出來。
會當看出這个數位簽章用的 hash function 是 sha1, hash 是 0EED541C2C2EC3380BA0C5DEBEB8B541FA49E125
#openssl rsautl -verify -pubin -inkey public.pem -in sign | openssl asn1parse -inform der
    0:d=0  hl=2 l=  33 cons: SEQUENCE          
    2:d=1  hl=2 l=   9 cons: SEQUENCE          
    4:d=2  hl=2 l=   5 prim: OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim: NULL              
   13:d=1  hl=2 l=  20 prim: OCTET STRING      [HEX DUMP]:0EED541C2C2EC3380BA0C5DEBEB8B541FA49E125

頂一步,會使用 public key 解密,就表示來源是正確的。
若欲檢查內容,就用仝款的 hash function 走一擺就知矣。
#openssl sha1 plaintext.txt 
SHA1(plaintext.txt)= 0eed541c2c2ec3380ba0c5debeb8b541fa49e125
算出來的 hash 佮數位簽章的仝款,按呢就表示資料佮原來的是仝款無改變的。


因為 Public-key cryptography 的計算較複雜,所以,實際上咧應用的時陣是先用這種方法建立一个祕密的通道,用這个通道約定一个共通的鎖匙。
以後若欲傳祕密的資料,就用這枝鎖匙來加密。




沒有留言:

張貼留言