凱撒加密, Vigenere 密碼 和 一次一密加密方式(Decipher Classic Cryptography)

1. Classic Cryptography

1.1 Private-key Encryption 私有鑰匙加密

1.11 應用場景

  • 祕密通訊
    在這裏插入圖片描述
  • 祕密存儲
    在這裏插入圖片描述

1.12 方法介紹 Three algorithms

a. Gen - Key Generation algorithm (Generate key)
b. Enc - Encryption algorithm (take key and message m ∈ M as inputs and output ciphertext)
c. Dec - Decryption algorithm (take k and ciphertext as input and output the m or error)

For m ∈ M and k output by GEN
DECk(ENCK(M))=m

1.2 The shift cipher 移位暗文

1.21 Caesor cipher - 凱撒加密

加密英文文字
Generate Key: Associate a with 0; b with 1; …; z with 25 𝑘 ∈ {0, … , 25}
Enc: 把明文的每一個字母都向右shift k 位
在這裏插入圖片描述
Dec: Reverse the cipher (cipher - 密文, plaintext - 明文)
明文:XYZABCDEFGHIJKLMNOPQRSTUVW 懂的人看到的
暗文:ABCDEFGHIJKLMNOPQRSTUVWXYZ unauthorized parity

1.22 Modular arithmetic - 模運算

[x mod N] 和 x (mod N) 是不同的
例如 ? = [1 mod 13] ? = 1
然而 ? = 1 (mod 13) =14 這裏 ? 其實 是和 1 除以13 得到相同餘數(都是1) 的數
然後這裏選擇用 N 可以 整除 ? - x的 ?值
然後我們把模運算和凱撒密碼結合
在這裏插入圖片描述
這個相當於把平移位數從k 上升到了 26+k 因爲k 除 26的餘數是 k, 其實實質上變成了左移k
就是改變了平移方向. 這樣的話向右試k是沒有意義的

1.23 shift cipher 是否安全

不安全

  1. 只有26種祕鑰的可能性並且是線性的這意味着破譯者只需要對所有暗文執行相同方式
  2. 可以猜所有的k值因爲當明文足夠長的時候只有解密方式是能解出來有意義的

之前的shift cipher最大的弊端在於線性映射不論你的映射方法多麼高級我只需要對應一位執行那個對的方式就能破譯掉 其實 對於 前一種來說它不是一維的雙方不僅要知道祕鑰還要知道加密方式這與我們之前一節講的open design 有衝突 - 不能依靠別人不知道你的安全系統來保持加密這裏就意味着不能隱藏你的加密算法只能隱藏祕鑰.
同時這裏也暴露出了祕鑰空間過小的問題由此引入我們下面的兩個設計原則

1.3 Kerckhoffs’s (科克霍夫假設)w principle 不能隱藏加密模式

這個原則說不能隱藏加密模式而只能保密祕鑰

  • 祕鑰必須是隨機選擇的並且是保密的
  • 保存祕鑰比保存算法更容易
  • 改變祕鑰比改變算法要簡單
  • 標準化更容易實施 - 想想如果大家都有自己獨特的算法還怎麼普及哇
    更容易部署 (ease of deployment)
    公衆驗證(Public validation)

這裏給我們留下的問題是怎樣在公佈加密模式的情況下升級破譯難度

1.4 Sufficient key space principle 祕鑰空間要足夠大

  • 祕鑰空間要足夠大到防止暴力的詳盡搜索攻擊
  • 如果一種算法或者祕鑰生成算法的祕鑰空間太小就會受到蠻力破解威脅

這裏給我們的啓示是祕鑰空間必須要是指數級別的

1. 5 The Vigenere cipher

基於上面兩條原則 我們所要做的是怎麼在公佈密碼模式的前提下提升破譯難度, 現在能做的就是把線性的轉化爲非線性的-不是通過加密模式而是通過祕鑰和加密模式的配合

這裏採用了將祕鑰和移動相結合的方式, 祕鑰變成了字符串而不再是單個的字符, 通過將明文按照對應祕鑰的字符移動相應的位數得到暗文這樣不僅是一個非線性操作 祕鑰量很大
這樣就對應了上面的兩個原則 , 下面詳細說一下是怎麼回事哈:
在這裏插入圖片描述
在這裏插入圖片描述
第一個字母t爲什麼變成了v呢 是因爲c代表移動2位(c對應的字母位置-1)
這樣通過對照祕鑰和明文得到了暗文同理反推出明文 事實上根據上邊的密碼錶很容易加解密

注意上兩幅圖的加密過程略有不同, 一個是右移一個是左移下面的那個:
在這裏插入圖片描述
多了個 kn mod 26 其實就是向左移, 而第一張圖是沒有這一步的是右移

祕鑰空間=26k k 是 祕鑰的長度 這已將約等於 266 基本不可能蠻力破譯 更別說k不一定
然後他又是非線性的意味着你必須找到祕鑰才能把暗文整體翻譯下來. 因爲位移是不定的哈

那麼 Vigenere cipher 安全麼 - 在很多年間一直被認爲是無比安全的 明天再接着寫破譯.

1.6 Vigenere cipher 或是傳統密碼學的失敗

破譯Vigenere cipher 需要三部

1.61 從非線性解密降維成線性解密

我們先看看這個和凱撒加密的區別在於什麼, 在於移位量不是一樣的了, 但是真的是這樣麼?
如果我們知道了祕鑰長度那麼是不是沒隔一個祕鑰長度對應位置的暗文被位移了相同的量.
在這裏插入圖片描述
從上圖可以看出當祕鑰長度爲14的時候, vudkoi其實是經歷了相同的位移量得來的.
這樣一來我們在有了祕鑰長度後就有了一組組的標準凱撒密碼解密就在即了.

1.62 解密凱撒密碼的關鍵頻率對比(非暴力法)

在這裏插入圖片描述
上面是英文文本中每個字母出現的頻率, 那麼對於一組卡撒密碼 我們可以對照頻率找出明文,
比如說在這一段凱撒暗文中a是頻率最高的那麼就可以假設暗文a對應了明文e, 有了這條線索, 我們就得到了位移量(卡撒密碼中的關鍵因素), 又因爲是卡撒密碼我們直接對其餘的所有暗文進行相同操作就好了, 同時可以對比每個字母出現的頻率找出機率最大是明文對應的進行操作,
所以凱撒密碼不用暴力法也是很好破解的(文本足夠多, 如果就一句話哪有頻率可言)

從這裏我們可以看出當維吉尼亞密碼退化成一組組的凱撒密碼破解就沒什麼難度了.

1.63 破解祕鑰長度 (破解維吉尼亞密碼的關鍵)

那麼怎麼破解祕鑰長度呢, 沒有祕鑰長度我們就根本無法進行破譯.

1. kasisiki 測試法

在英文中,一些常見的單詞如the有機率被密鑰的相同部分加密,即原文中的the可能在密文中呈現爲相同的三個字母。這是因爲他們出現的概率較高很有可能被相同部分加密成相同的暗文, 那麼這個時候祕鑰的長度一定是兩個重複相同詞的距離的因數.
ksisika解祕鑰長度 python

2. Friedman 測試法 ( index of coincidence )

重合指數表示兩個隨機選出的字母是相同的的概率,即隨機選出兩個A的概率+隨機選出兩個B的概率+隨機選出兩個C的概率+……+隨機選出兩個Z的概率。

對英語而言,根據上述的頻率表,我們可以計算出英語文本的重合指數爲

P(A)2 + P(B)2+……+P(Z)2 = 0.65

利用重合指數推測密鑰長度的原理在於,對於一個由凱撒密碼加密的序列,由於所有字母的位移程度相同,所以密文的重合指數應等於原文語言的重合指數。

對於一個給定暗文:
ABCDEABCDEABCDEABC
先嚐試key爲1的時候的重合指數:

首先測試密鑰長度=1:
對密文ABCDEABCDEABCDEABC統計每個字符出現的次數:
A: 4 B: 4 C: 4 D:3 E:3
那麼對於該序列的重合指數就爲:(4/18)2 + (4/18)2 + (4/18)2 +(3/18)2 +(3/18)2 != 0.65

接下來再試 key 長度爲2:
將密文ABCDEABCDEABCDEABC分解爲兩組:
組1:A C E B D A C E B
組2:B D A C E B D A C
我們知道如果密鑰長度真的是2,那麼組1,組2都是一個凱撒密碼.對組1組2分別計算重合指數
如果組1的重合指數接近0.65,組2的重合指數也接近0.65,那麼基本可以斷定密鑰長度爲2。

2. 現代密碼學原則

  1. Formal definitions: 精準的數學模型以及安全的定義
    –Threat model: 現實生活中攻擊者被假設擁有的能力
    –安全保證或者安全目標: 我們要組織攻擊者做什麼事情
  2. Assumptions: 現代密碼學幾乎沒有例外的需要計算性假設
    – 這種假設應該是明確定義的 no ambiguous
  3. Proofs of security: 安全性的證明
    – 跳出 設計 - 突破 - 補丁 這一流程
    – 提供嚴格的證明, 證明在特定的安全定義和假設下是沒有問題的
    – 安全性的證明在如今的密碼學中至關重要

3. 完美的祕密 - Perfect Secrecy

3.1 現代密碼學4中強度不同的攻擊方式

在這裏插入圖片描述

注意在下面的所有攻擊方式中均有已知加密模式

  • open design
  • Kerckhoffs’s principle

3.11 唯密文攻擊 Ciphertext-only attack

攻擊者的能力:
只知道密文也就是上述的 c1, c2 ,c3 不知道以外的其他信息
攻擊者的目的: 按照破譯成功度排序

  • 取得原始明文中的部分資訊。
  • 取得原始明文。
  • 得知解密用的鑰匙。

窮舉法是Ciphertext-only attack的常用方法

3.12 已知明文攻擊 Plaintext-known attack

攻擊者的能力:
知道了某些明文-密文對, 也就是攻擊者掌握了 {(p1,c1), (p2,c2),(p3,c3)}的子集
拿維吉尼亞密碼舉例, 攻擊者很有可能知道了

  1. I love you 對應了 adadadw
  2. 知道加密方式 - 用key的每個字母當做特定的偏移量

很有可能是攻擊者通過某種其它途徑得知了明文 那麼他可以利用相應的關係來破譯, 如果是凱撒密碼到這一步已經結束了, 但是對於維吉尼亞密碼來說由於偏移量升維了知道一段是不夠的, 還需要知道這對應了key的那一部分(因爲攻擊者現在可以推出祕鑰的一部分).
注意:
已知明文攻擊相對於唯密文攻擊 多知道了一點對應信息(往往和key有關)
已知明文攻擊相對於選擇明文攻擊 只知道特定的明文-密文對 而無法構造特定的明文 - 密文

希爾密碼用唯密文攻擊很難識破但是已知明文攻擊相對容易破解

3.13 選擇明文攻擊 Chosen-plaintext attack

攻擊者的能力:
相比之上只能被動地獲取明文-密文對, 這裏攻擊者有了加密機(沒有機密機的權限)的權限可以構造隨意構造對
攻擊者的目的:
通過用明文構造密文的方式來獲得加密算法的一些信息, 並企圖在未來更有效的破解該算法以及相關祕鑰加密的其他明文信息. 在最壞的情況下攻擊者可以直接獲得解密祕鑰.

這裏要解釋下爲什麼這個加密算法沒有公佈, 其實公佈只是爲了普及以大規模實用, 那如果一個盒子封裝好了所有相關算法那我需要告訴大衆的就只是用這個盒子就行, 而沒有必要公佈盒子裏面的內容了, 其實上面公佈給大衆的也就是使用方法, 當有了相應的封裝使用方法也就更簡潔更便於加強破譯的難度.

在這裏具體給個例子就是說攻擊者現在可以 通過嘗試的辦法來獲取密文中的內容, 比如我大概知道地方的通訊中AF是個地名, 那我就去用加密機加密所有地名看它說的到底是哪個, 這其實也是二戰中美軍破獲日軍密文的一次成功案例:
中途島海戰,一次成功的選擇明文攻擊——美軍故意透露出假情報(明文)來誘使日軍(密文),從而得知“AF”指的是中途島而非阿留申羣島. 這裏可以把日軍想象成那個加密機, 美軍給了明文, 這個加密機給出了對應的密文, 美軍利用這選擇明文攻擊獲得了自己想要的信息.

其實這裏還有另一個令人疑惑的地方, 攻擊者怎麼可以選擇明文並讓加密機加密呢?
因爲在公共密鑰學中 公共祕鑰是公開的, 那麼攻擊者就可以選擇明文得到密文了.

注意這個和選擇密文攻擊的區別在於 這個只有加密機的權限而沒有解密的權限信息較少.

3.14 選擇密文攻擊 Chosen-ciphertext attack

攻擊者的能力: 攻擊者的能力又提高了, 不僅有了加密機的訪問權限還有解密的訪問權限, 這就意味着攻擊者不僅能選擇明文得到暗文, 還能夠選擇暗文得到明文, 這樣有了雙重的信息更好去破解加密解密機制.
這裏信息已經被破解了但是加密機制還沒被破解 對應的現實情境就是, 解密機被敵人拿走了, 但是敵人不知道加解密的工作原理只是會用而已, 但是有了相應信息他很有可能破解.

3.2 Perfect Secrecy 完美的祕密

先來看下完美祕密的定義吧

不規範的來說:
觀察密文不應該改變攻擊者對明文分佈瞭解的情況, 或者說是不泄露任何明文相關的信息
規範的來說:
Pr[𝑀 = 𝑚|𝐶 = 𝑐] = Pr[𝑀 = 𝑚] ->已知了密文的情況下,得到明文的概率”和“在不知道密文的情況下,得到明文的概率”是相等的

舉例來說, 考慮下偏移密文:
在這裏插入圖片描述
上面這段的意思是在不知道暗文的情況下明文是one和ten的可能性各1/2, 然而在知道了暗文後呢, 暗文rqh 要麼對應了 ten 那麼 Pr[M=‘ten’|C=‘rqh’]就等於1 要麼 rqh對應了one 那麼上述表達式的結果就是0, 不論怎麼樣都改變了原來攻擊者對明文分佈的瞭解. 舉個實際點的例子就是本來攻擊者猜到AF是洛杉磯的可能性是1/2 因爲就洛杉磯和紐約兩個選擇, 但是當你這個密文出現以後根據密文和明文的對應關係就能直接鎖定一種答案就改變了分佈, 因此其實這裏要求明文和密文是完全獨立的.

上面的舉例告訴我們shift cipher是不可靠的不是完全祕密的, 那麼該怎麼構建完全祕密的呢:

3.3 The one-time pad - 一次一密

知乎經典回答-什麼是一次一密
具體的流程大概是什麼樣子的呢:

  1. 和之前大家共享一個祕鑰不同 這次我們來一個密碼本, 每一頁是一個獨一無二的隨機二進制表祕鑰用完一頁撕掉一頁-一次一密
  2. 對明文進行ASCII或者Unicode編碼
  3. 對編碼後的明文與密碼本上當前一頁(發送接收雙發必須在同一頁)的祕鑰進行異或操作
  4. 將密碼傳給接收方 並把當前一頁祕鑰作廢
  5. 接收方收到密文用當前一頁祕鑰進行異或解碼(異或的可逆性) 並且作廢當前祕鑰頁

這裏面用到的經典的知識點:

  1. k XOR m1 = c1 ------------ k XOR c1 = m1
  2. 一個密文位置是0明文既可能是0有可能是1 同理當時1的時候明文可能是0也可能是1
    完全取決於祕鑰才能得到明文, 所以說看密文就像在看那個隨機生成的密碼本一樣完全
    無法改變攻擊者對明文分佈的認識, 所以在每次撕掉當前密碼頁的情況下是完全保密的

那麼每次都要撕掉好麻煩, 我如果不撕掉還是完全保密的麼?
我們來看一下:
第一次 -> c1=k XOR m1
第二次 -> c2=k XOR m2
那麼根據這兩個密文我們能得到關於原來明文的信息麼?
c1 XOR c2 = m1 XOR m2 好了完蛋了泄露了原文的相關信息不是完全保密的了.

那麼爲什麼我們在實際的工作生活中不這麼用一次一密呢?

  1. 密鑰太長------祕鑰和信息是一樣長的
  2. 密鑰不能重複使用---------一個祕鑰只能使用一次加密一次信息
  3. 密鑰的配送--------祕鑰和信息是等長的, 那如果能機密的配送祕鑰爲什麼不能機密的配送信息呢?
  4. 密鑰的保存--------如果你能夠安全的保存密鑰爲什麼不能安全的保存明文
    這一條實際上是我們以前講過的加密的另一種用途保存信息.
    相對與shift cipher 和 維吉尼亞密文來說 一次一密加密機制是好的密文符合完美保密性但是卻不可實踐因爲它的祕鑰長度和信息長度一樣長. 實際上對於任何符合完美加密的密文,
    一定有 祕鑰的長度不小於銘文的長度.

4. 計算保密 Computational Secrecy

4.1 計算安全的定義

加密模式可行如果只有很小的概率信息被有有限計算資源的竊聽者獲取.
這裏放寬了完美保密:

  1. 允許安全機制有很小的可能性被攻破
  2. 只考慮高效的攻擊者

這裏我們來看一下上面說的tiny possibility 指的是多小: 2-60 大概是發送方和接收方同時被閃電劈中的概率, 大概每100萬年發生一次

這裏我們再看下有限的計算資源的定義: 如果用暴力法去破解祕鑰 每個時鐘信號能獲得一個值
• Desktop computer ≈ 257 keys/year
• Supercomputer ≈ 280 keys/year
• Supercomputer since Big Bang ≈ 2112 keys
‒ Restricting attention to attackers who can try 2112 keys is reasonable…
• Modern key space: 2128 keys or more…

4.2 Encrytion and Plaintext Length 加密和明文長度

  1. 我們想要一種能夠加密任何長度明文的加密模式
  2. 明文長度通常是可以被公佈出去的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章