加密解密的簡介
佇 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 的計算較複雜,所以,實際上咧應用的時陣是先用這種方法建立一个祕密的通道,用這个通道約定一个共通的鎖匙。
以後若欲傳祕密的資料,就用這枝鎖匙來加密。
沒有留言:
張貼留言