about 2 years ago

密碼學筆記


這本書用圖解的方式介紹密碼學,章節涵蓋廣泛且內容扎實,系統性地從密碼學基本要素開始,逐一從需求->密碼技術誕生->破解弱點,從原理到應用場景,前後連貫深入淺出,十分值得閱讀
以下是閱畢後整理了一份筆記

簡介

密碼學涵蓋了四大要素

  1. 機密性:將明文轉為密文
  2. 完整性:確保資料沒有被竄改
  3. 認證:確認資料發送人的正確性
  4. 不可否認性:資料發送後不可否認

為了達到上述四項要素,密碼學家有了一系列的工具對稱加密公鑰加密單向散列消息認證數位簽章
其相對關係為


接著有四項安全常識

  1. 不要使用保密密碼算法,使用公開且高強度的加密技術-有時候我們以為把東西藏的好好的就不會有事,但往往這樣的思維會產生更大的安全漏洞,此書不斷強調這一點
  2. 自行開發加密算法很困難
  3. 任何密碼都有被破解的一天
  4. 社交工程-信息安全在於流程而非產品,而人也是一個很大的因子
歷史密碼
  1. 凱薩加密:將字母對應橫移 => 暴力破解
  2. 簡單替換密碼:將字母對應列成表格 => 詞頻分析法破解
  3. Enigma:使用接線版(每日分配)+三個轉子(對應26個字母,裡頭線路可變化,可轉動設定起始位置,每次輸入都會旋轉)+反射器(將兩線路對接->輸入字母永遠不會是輸出字母)
    加密方式透過
    a. 先將轉子移動到每日分配(有本子對應)位置
    b. 使用三個字元當作密鑰,輸入兩遍,產生密鑰密文
    c. 將轉子移動到密鑰對應的三個字元
    d. 輸入明文,產生密文
    解密方式跟加密方式雷同
    a. 先將轉子移動到每日分配(有本子對應)位置
    b. 輸入密鑰密文,產生密鑰
    c. 將轉子移動到密鑰對應的三個字元
    d. 輸入密文,產生明文
對稱加密

XOR在對稱加密中是個很重要的運算,明文A密鑰B產生密文A XOR B,如要解密只需在XOR密鑰運算一次 A XOR B XOR B = A即可得到密文。

  1. 一次性加密:產生一段與明文等長的隨機數列當成密鑰,與明文做XOR即得到密文,這個一次性加密無法被破解!即使用暴力破解,窮舉出多個等長的明文,攻擊者無法判定哪個才是正確的明文。 cons:密鑰配送問題、密鑰過長
  2. DES & 3DES:DES透過Feistel網絡結構加密,簡單來說就是將明文拆成多組,A流通過輪函數後做XOR加密B,接著B加密A,交替次數不限,只要解密時次數相同即可 3DES只是將DES做加密解密再加密(可用多把秘鑰或是同一把),增強複雜度,但是兩者都不建議使用了!
  3. AES(Advance Encrypt Standard):由美國國家標準局(NIST)所選拔的算法,廣邀密碼學家投稿算法,這些算法都公開且免費讓大眾使用,最後選中的算法為 Rijndael算法,主要是利用SPN結構,將明文轉為陣列形式,通過平移、換行與密鑰XOR轉變密文。
分組密碼

當明文長度大於密鑰時,如何有效的加密就是個問題,分組密碼,將明文切段,加密方式可以透過下附模式

  1. ECB:各組明文個別加密,缺點是相同明文輸出相同密文,容易遭受攻擊,建議不要使用
  2. CBC:明文和前一組密文加密,而第一組密文與IV(初始值)加密
  3. CFB:明文與前一組密文加密後再XOR
  4. OFB:初始值一步一步加密,每一步加密後與一組明文XOR產生密文
  5. CTR:使用Counter計算,每一步加密後與明文XOR產生密文,和OFB類似
公開密鑰-RSA

基本的公式為

步驟為 找出兩個大質數pq,生成L=lcm(p-1,q-1),用隨機數找出E符合gcd(L,E) =1,找出模反數D符合E*D mod L =1
公開密鑰加密最大問題在於中間人攻擊,如何確保公鑰的認證是個問題

單向散列函數

也就是Hash,算法設計要符合輸入可惟任意長度但是輸出需要短且固定長度且具備
特性1. 弱踫撞性:已知某一消息的散列值,找出具備相同散列值的另一消息是困難的
特性2. 強碰撞性:找出兩相同散列值得不同消息是困難的
特性3. 單向性:從輸出不可回推輸入
實踐方式有:

  1. MD4/MD5:不安全了
  2. SHA1:不安全(160)
  3. SHA2:SHA1演進,可選擇不同強度256,384,512,可用
  4. SHA3:Keccak演算法,採用新的海綿加密結構,輸入長度不受限

針對單向散列的攻擊有

  1. 暴力解:針對弱踫撞性,令用文件的冗余性,在相同語意下找出替換的消息,如已知一消息"給我一百萬",此時駭客企圖找出"給我一億元"、"給我100000000元"、"給我台幣一億元"等
  2. 生日攻擊:針對強碰撞性,找出任一兩相同的散列值比想像中簡單些,如同"只要一群人中兩個人生日相同,不管哪一天都可以"的機率遠本想像高(1-364/365*363/365....) 註記:因為鴿槽理論(n+1隻鳥與n個槽),碰撞必然存在
消息認證

消息認證(Message Auth Code)與單向散列雷同,都是對消息產生一不易碰撞的數列,差別在於消息認證是與密鑰相關連的單向散列函數,最大好處是多了認證,因為只有知道共同對稱密鑰的兩人能夠產生並識別該消息認證,確保資料的來源
實踐方式可透過SHA算法-HMAC,AES/公鑰加密也都可以實作
攻擊:
重放攻擊,服務器收到多組非等冪訊息,解決方式可以透過加入時間戳、nonce(一次性隨機數列)
密鑰推測攻擊:密鑰必須使用高強度、隨機產生的才安全

下篇連結

← Golang - 仿造Polymophism、實作BST 密碼學筆記下 →
 
comments powered by Disqus