Crypto by ali === :::danger 請愛惜共筆,勿進行惡意刪減 ::: ## Lab 0x00 :::spoiler 題解 - QRcode:是一種二維碼,主要用於快速讀取信息。他可以儲存各種類型的數據,如文字、網址、聯絡訊息等。 - Base64:是一種用64個字符來表示任意二進制資料的方法。它主要用於當資料需要以文本形式存儲和傳輸時,包括在URL、Cookie和網頁中嵌入圖像等。 - 圖片優化 - 前端應用 - QRcode和Base64可以相互配合,以達到資料優化、加密或更高效的展示目的。 ::: ## 密碼與資訊安全常識 - 不要使用保密的密碼算法 - 使用低強度的密碼比不進行任何加密更危險 - 任何密碼總有一天會被破解 - 密碼只是資訊安全的一部分 ## 編碼 - Encoding 編碼 - 是資訊從一種形式或格式轉換為另一種形式的過程 - Decoding 解碼 - 編碼的逆過程,即將資料從另一種形式轉換回來 - 中文翻譯都是密碼,卻在密碼學中有不同意義 - cipher 有經過加密(某種演算法而形成,具有密鑰) - code 則是編碼(換一種格式,一旦對照表被盜取,內容不會再更新,明文將一覽無遺) - 編碼不會修改任何資料內容 - 編碼沒有任何加密的效果 - 單純就是 **換個方式來表達資料** 而已 ### 摩斯密碼 ![](https://hackmd.io/_uploads/rkzin_6T2.png) ### Lab 0x01 ## 古典密碼學 ![](https://hackmd.io/_uploads/HJtiftpp2.png) ### 移項式加密 - 字元本身不會改變,但**字元位置**依照一定規則進行**移動、變換** ![](https://hackmd.io/_uploads/BJv-XYT62.png) #### 密碼棒 1. 由一條加工過、且帶有<font color="#FFD306">夾帶訊息的皮革</font>繞在一個木棒所組成 2. 在<font color="#548C00">古希臘</font>,文書記載著巴斯達人用此於<font color="#548C00">軍事</font>上的訊息傳遞 3. 密碼接受者須使用<font color="#FFD306">一個相同尺寸的棒子</font>讓他將密碼條繞在上面解讀 密碼棒加密 1. 將要加密的明文分為N個一組 2. 再從每組選出一個字母連起來 3. 最後形成一段無規律的密文 ```! 1. 將要加密的明文分為N個一組 原文 THEREISALWAYSONLYONETRUTH(明文長度為25) 將要加密的明文分為5個一組 (要選擇合適的長寬,因為超過需要填充字元,而填充的字元越多越容易被識破) 將要加密的明文由左到右變成為5*5的陣列 THERE ISALW AYSON LYONE TRUTH 2. 再從上到下抄一遍的到密文 TIALTHSYYREASOURLONTEWNEH ``` 密碼棒解密 ```! TIALTHSYYREASOURLONTEWNEH 1. 將密文由上至下分成5*5的陣列 T H E R E I S A L W A Y S O N L Y O N E T R U T H 2. 再將陣列由左至右讀取獲取明文 THEREISALWAYSONLYONETRUTH ``` ##### Lab 0x02 ## 替換式加密 - 將"字元"或"字元組"按規則**替換**為別的"字元"、"字元組"或"符號" ![](https://hackmd.io/_uploads/BJBfLtTa3.png) ### 單表加密 - 明文字元與密文字元呈現"一對一"的關係 - 同一個明文字元只會加密成同一個密文字元 #### 凱薩密碼 凱撒密碼最早由古羅馬軍事統帥蓋烏斯·尤利烏斯·凱撒在軍隊中用來傳遞加密資訊 - 是一種替換加密技術 - 明文中的所有字母都在字母表上按照一個固定數目進行偏移後被替換成密文。 - 例如,當偏移量是3的時候 - 所有的字母A被替換成D,B被替換成E,以此類推。 ![](https://hackmd.io/_uploads/rki3UY662.png) #### 密碼盤 1. 最早的密碼機械 2. 十五世紀的義大利建築師里昂亞伯提發明 3. 可以更方便的進行凱薩解密 [密碼盤](https://inventwithpython.com/cipherwheel/) 1. 內圈為**明文** 2. 外圈為**密文** 3. **由內而外**進行加密 範例:將HELLO加密,偏移量為K ![](https://hackmd.io/_uploads/r1_uqcp62.png =50%x) 1. 因為偏移量為K,所以先將旋轉內圈A指向旋轉外圈K 2. 加密的第一個字母為H,內圈找到明文H,對應到外圈的密文R 3. 加密的第二個字母為E,內圈找到明文E,對應到外圈的密文O 4. 加密的第三、四個字母為L,內圈找到明文L,對應到外圈的密文V 5. 加密的第一個字母為O,內圈找到明文O,對應到外圈的密文Y ##### Lab 0x03 #### 阿特巴希密碼 Atbash - 阿特巴希密碼將字母表整個扭轉 - 第一個字母"A"與最後一個"Z"相替換 - 第二個"B"與倒數第二個"Y"相替換,如此類推 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Z Y X W V U T S R Q P O N M L K J I H G F E D C B A #### 簡易替換密碼 - 可以理解為一種建立替換表的方式 - 傳統上會先把一個關鍵詞寫在字母表的最前面,再刪去重複字母,這樣就能得到一個替換表 範例 1. Keyword:"HELLO" HELLOABCDEFGHIJKLMNOPQRSTUVWXYZ HEL~~L~~OABCD~~E~~FG~~H~~IJK~~L~~MN~~O~~PQRSTUVWXYZ HELOABCDFGIJKMNPQRSTUVWXYZ 2. Keyword:"FJCU" ABCDEFGHIJKLMNOPQRSTUVWXYZ FJCUABDEGHIKLMNOPQRSTVWXYZ 3. Keyword:"NISRA" ABCDEFGHIJKLMNOPQRSTUVWXYZ NISRABCDEFGHJKLMOPQTUVWXYZ - 可以對替換表再進行<font color="#FFD306">偏移</font>(凱薩密碼)或<font color="#FFD306">翻轉</font>(阿特巴西密碼) 範例: 下表**偏移**3 ABCDEFGHIJKLMNOPQRSTUVWXYZ <font color="#FFD306">FJCU</font>ABDEGHIKLMNOPQRSTVWXYZ **偏移**過後 ABCDEFGHIJKLMNOPQRSTUVWXYZ XYZ<font color="#FFD306">FJCU</font>ABDEGHIKLMNOPQRSTVW 下表**翻轉** ABCDEFGHIJKLMNOPQRSTUVWXYZ <font color="#FFD306">NISRA</font>BCDEFGHJKLMOPQTUVWXYZ **翻轉**過後 ABCDEFGHIJKLMNOPQRSTUVWXYZ ZYXWVUTQPOMLKJHGFEDCB<font color="#FFD306">ARSIN</font> #### 波雷費密碼 Playfair cipher - 第一步 對明文進行預處理 1. 將明文分成兩個字元一組 2. 若一組內的字母相同,將"X"插入兩字母之間,重新分組 3. 若最後一組剩下一個字,也加入"X" ![](https://hackmd.io/_uploads/rJQVlsT63.png =80%x) - 第二步 做一個簡易替換密碼 先選取一個關鍵字,然後製作一個簡易替換密碼 (因為波雷費密碼為5X5的表格,只能容納25個英文字母,故後續的加解密中將"J"視為"I") 範例: 關鍵字:PLAYFAIR <font color="#FF0000">PLAYFIR</font>BCDEGH<font color="#00EB00">~~J~~</font>KMNOQSTUVWXZ - 第三步 建立5X5的表格 "PLAYFIRBCDEGHKMNOQSTUVWXZ" - 第四步 加密 加密規則: 1. 若兩個字元不在同一直行或同一橫列:在矩陣中找出另外兩個字母,使這四個字母成為一個長方形的四個角 2. 若兩個字元在同一橫行:取這兩個字母右方的字母(若字母在最右方則取最左方的字母) 3. 若兩個字元在同一直列:取這兩個字母下方的字母(若字母在最下方則取最上方的字母) ##### Lab 0x04 #### 字頻分析 不管是什麼語言,字母都會以固定且可靠的頻率出現。 這種現象運用在破解密碼上稱為"字頻分析" - 大部分語言中,字母或字符使用的頻率並不是平均的 - 以英文為例,很明顯母音的使用頻率更高 - <font color="#FFD306">E</font>TAOINSHRDLU ![](https://hackmd.io/_uploads/Hk2XXsTa2.png =60%x) - 弱點 * 給了攻擊者可乘之機 * 因為單表加密只是將字元做替換,所以<font color="#FFD306">頻率並不會改變</font> * 如果我們知道一段英文是由單表加密所得,我們對這段英文做字頻分析,發現"X"出現的頻率最高,那我們合理猜測"X"很有可能替換了"E" ##### Lab 0x05 ### 多表加密 #### 維吉尼亞密碼 - 1553年由義大利密碼學家發明 - 19世紀誤傳為法國外交官維吉尼亞所創,故稱"維吉尼亞密碼" - 我們可以將"維吉尼亞密碼"理解為多個"凱薩密碼" - 加密規則 ![](https://hackmd.io/_uploads/HkP4mBCph.png =60%x) 範例:  1. 先選擇一個<font color="#FFD306">關鍵字</font>,假設"<font color="#FFD306">CSIE</font>" 2. 假設要加密的<font color="#00EB00">明文</font>為"<font color="#00EB00">NISRA</font>" 3. 延長<font color="#FFD306">關鍵字</font>直到超過<font color="#00EB00">明文</font> 4. 對<font color="#00EB00">明文</font>以<font color="#FFD306">關鍵字母</font>為偏移量,依次進行凱薩加密 明文:NISRA 關鍵字:CSIE<font color="#FF0000">C</font> 加密後:PAAVC ![](https://hackmd.io/_uploads/H18cQSCa3.png =55%x) - 凱薩密碼加密明文全部依照相同的偏移量 - 而在維吉尼亞密碼中,每加密一個字母就需做一次凱薩密碼(除非連續兩個相同關鍵字,如"HELLO"之"LL") ##### Lab 0x06 #### 希爾密碼 - 巧妙的運用了線性代數的技巧讓字母彼此之間開始互動起來,藉以增加系統的安全等級,因而得到更好更實用的一個密碼系統。 - 加密規則 1. 先將每個字母當作26進制數字:A=0,B=1,C=2... 2. 每個由n個字母組成的塊(被視為n分量向量)乘以可逆的nxn矩陣,取模數為26 3. 以key=GYBNQKURP,明文為ACT為例 ![](https://hackmd.io/_uploads/rkPkBHC63.png =15%x)明文:GYBNQKURP ![](https://hackmd.io/_uploads/BkH-rSAa2.png =6%x)key:ACT 把它相乘再做mod26 ![](https://hackmd.io/_uploads/S1PtBSApn.png =55%x) - 解密方式 ![](https://hackmd.io/_uploads/r1_zUSRa2.png =55%x) ![](https://hackmd.io/_uploads/SynzLS0an.png =55%x) ##### Lab 0x07 ## 現代密碼學(補充) - 對稱加密與非對稱加密 * 對稱加密:加密和解密使用相同的密鑰 ![](https://hackmd.io/_uploads/ry7A8rAah.png =60%x) * 非對稱加密:使用不同的密鑰進行加密和解密 ![](https://hackmd.io/_uploads/BkPfwBRp2.png =60%x) - 數位簽名和認證 * 數位簽名的作用和原理 * 公開金鑰基礎設施(PKI)和數位證書 ### 常見的加密方式 - AES * 區塊加密方法 * 替換和混淆運算 * 安全性和效能 - RSA * 非對稱加密方法 * 公開金鑰和私有金鑰 - ECC * 高效的非對稱加密方法 * 橢圓曲線的特性和運算 ## 密碼學應用 - 數據加密和隱私保護 * 在網路傳輸和儲存中的應用 * 加密通信和數據安全性 - 數位支付和電子貨幣 * 加密貨幣的原理和運作 * 數位支付系統的安全性 - 雲計算和區塊鏈 * 加密在雲計算中的作用 * 區塊鏈技術的安全性和加密 ## 未來挑戰 - [Your Encryption Isn't Quantum Safe](https://www.youtube.com/watch?v=ecvCfTPRBrI)