你所能搜到的最全對稱加密術講解 - Symmetric Cryptography

Symmetric Cryptography

1. Symmetric Cryptography 的定義

對稱加密術是定義在 Key-Space, Message - Space (或者plaintext - space) 以及 密文空間之上的一組高效算法 (E, D) E is entryption algorithm D is detryption algorithm.
E 是 一個 從 K-Space 和 M - Space 到 C - Space 的方程
D 是一個 從 K - Space 和 C - Space 到 M - Space 的方程
在這裏插入圖片描述
對稱加密術其實就是加密祕鑰和解密密鑰是相同的加密方法

我們來拿 上節學的 one time pad 來對應下對稱加密術的定義:
先來看看 K M C 分別是什麼吧:
M = C = K {0,1}n
明文 密文 以及祕鑰 都是長度爲 n 的 隨機比特串 (random bit string)
那麼 E, D 分別是什麼呢:
E(k,m)=k XOR m
D(k,m)=k XOR c

這裏OTP 是不可實踐的因爲祕鑰的長度等於信息的長度! 那下面就引入了流密文

2. Stream Cipher - 流密文 - 對稱加密術 1

流密文讓OTP變得可實踐了(practical). 我們也知道變得可用的關鍵是祕鑰長度.

2.1 Strean Cipher 的定義

因此流密文的主要思想是讓隨機祕鑰變成僞隨機祕鑰!
Idea: replace “random” key by “pseudorandom” key
上面的pseudorandom 是一個function:
在這裏插入圖片描述
將長度爲s的隨機比特串映射爲長度爲n的爲隨機比特串

  • {0,1}S 爲seed space 也就是種子空間
  • n>>s
  • G 就是僞隨機數方程

2.2 Stream Cipher 讓 OTP 變得可實踐了

那麼practical 的 one time pad 是什麼樣的呢 entrytion 和 detrytion 方程有什麼改變呢
改變就是 E(k,m)=G(k) XOR M D(k,m)=G(k) XOR C
在這裏插入圖片描述
那麼採用了流密文的OTP還是完美保密的麼? 記得我們前面說的麼 -> 不論任何密文想要實現完全保密key的長度一定不能小於明文的長度很明顯這裏不滿足哦所以不是!

2.3 現實中的流密文: Realworld stream cipher->RC4

2.31 背景介紹

RC4是stream cipher的一個老列子了, 現在已經不再使用了! 曾是被最廣泛使用的流密文, RC4(Rivest Cipher 4) 被廣泛應用於https, WEP(第一個wifi加密標準). 但是RC4對於大多數應用來說還不夠安全因此被Microsoft Edge 和 Internet Explorer 11給禁止了.

2.32 實現原理

  1. 創造密鑰流
    創造密鑰流的過程應該是不可偵測的
    創造密鑰流其實包括了:
    1.1 Key Sheduling Algorithm - KSA 祕鑰調度算法或者是祕鑰初始化算法
    1.2 Pesudorandom Generation Algorithm - PRGA 僞隨機算子生成算法
    1.2 其實也可以是Key Stream Generation Algorithm 密鑰流生成算法
  2. 加密: 將明文的每一位與密鑰流的每一位進行異或
  3. 解密: 將密文的每一位與密鑰流的每一位進行異或
  4. 更改密鑰流 注意是更改密鑰流而不是更改祕鑰 重新調用PRGA而已

KSA -> Initial State S -> PRGA/KGA -> Keystream -> Entrytion or DEtrytion.

上面的加密和解密算法是完全一致的, 加密解密祕鑰也完全一致因此叫對稱加密術.
下面從代碼角度看一下這個破東西
KSA: 攪亂一個有256個元素並且元素值從0-255的數組
1.1 首先創建一個256位從0-255的有序數組
1.2 將key重複擴充至256位長的重複性數組
1.3 用上述獲得的用seed key獲得的數組攪亂第一個由於數組使其看似隨機

代碼上的體現:

void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
    int i=0,j=0;
    //char k[256]={0};
    unsigned char k[256]={0};
    unsigned char tmp=0;
    for(i=0;i<256;i++) {
        s[i]=i;                 上述的1.1
        k[i]=key[i%Len];        上述的1.2 這裏i%Len就是在重複的給k賦值key
    }
    for(i=0;i<256;i++) {
        j=(j+s[i]+k[i])%256;    這裏在給j賦值j是將要吧該元素換到的位置j<256
        tmp=s[i];
        printf("copy for dongdeng");
        s[i]=s[j];//交換s[i]和s[j] 
        s[j]=tmp;               這裏在交換兩個index對應的值把水攪渾
    }
}

Python 版本
在這裏插入圖片描述
PRGA: 用攪渾了的狀態S, 生成和明文長度一樣的密鑰流

void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
    int i=0,j=0,t=0;
    unsigned long k=0;
    unsigned char tmp;
    for(k=0;k<Len;k++)                   這裏的Len 是明文的長度
    {
        i=(i+1)%256;
        j=(j+s[i])%256;                  又在隨機的選位置
        tmp=s[i];
        s[i]=s[j];                       交換當前位置和隨機選好位置的值
        s[j]=tmp;
        t=(s[i]+s[j])%256;               獲取準備從狀態流準取出的祕鑰位的位置
        KS[k]=s[t]                       Keysteam中的第k位得到了                                        
    }
}

Python版本
在這裏插入圖片描述
之後就是用KS和相應的明文進行加密了(這一不可以卸載上面的最後一步解密也是)

2.33 RG4 的 特點

  1. 運行速度快 效率高: 比DES (Data Encryption Standard - 一種典型的塊密碼) 快10倍
  2. 安全上有一些不足:
    2.1 初始的密鑰流不夠隨機: 可以扔掉前100個祕鑰位來修復這個問題
    2.2 祕鑰的重複使用也是RG4的一個大問題

3. Block Cipher - 塊密碼 - 對稱加密術 2

3.1 Block Cipher 的介紹

  • Block Cipher 是非常常見的加密算法, 比如DES 和 AES 都是美國政府覈定的標準加密算法, 從電子郵件加密到銀行交易轉賬應用十分普遍.
  • 是對稱加密的一種典型實例, 因此它的加密解密所用的祕鑰是同一個, 這也是對稱加密的定義.
  • 流密碼是對一串明文一位一位加密得到密文, 然而塊密碼是對一個特定長的快進行加密 最後得到整體密文

3.2 Block Cipher的工作原理

  1. 將一個整數據塊分成一個個特定長度的塊, 如果最後一個塊的長度不夠, 就用特定的算法將它補齊, 比如說增加一個標誌位剩下的位數全部補零.
  2. 對每一個整塊的數據運行加密算法, 這個加密算法本質上就是一種映射算法 -> 將已有的塊映射到一個新的塊, 如果一個塊的長度是64bit 那麼就存在264 種映射關係, 具體採用哪一種映射關係取決於你的key值. DES才用的是64 bit 但是由於可被暴力攻破現在被Advanced Encryption Standard 所取代, 這幾種典型應用下面會介紹.
  3. 加密解密過程和流密碼很像唯一不同的就是一位一位處理 -> 整塊處理但是注意流密文是塊密碼的10倍快
    在這裏插入圖片描述

3.3 Block Cipher的應用

  1. DES: DES 的塊是64bit的 但是祕鑰是56bit的 後來發現不安全已被其他的加密方式取代
    • Well known symmetric cipher
    • Developed in 1977, still much used
    • Shouldn’t be, for anything serious
    • Block encryption, using substitutions, permutations, table lookups
    ----- With multiple rounds
    ----- Each round is repeated application of operations
    • Only serious problem based on short key
  2. AES: 專門用來取代DES的, 塊是128bit的 祕鑰可以使128bit, 192bit 和 256 bit.
    • A relatively new cryptographic algorithm
    • Intended to be the replacement for DES
    • Chosen by NIST 美國國家標準技術研究所
    -----Through an open competition 通過公開競爭獲勝的
    • Chosen cipher was originally called Rijndael
    ----- Developed by Dutch researchers 被荷蘭的研究者研發的
    • Uses combination of permutation and substitution 採用置換和替換相結合的形式
    ----- RC5: 就是上面RC4的進化版採用了塊密碼可能是因爲它的流密碼因爲安全性被淘汰了

3.4 Block Cipher的優缺點

Advantage:

  • Good diffusion: 更容易使一組加密的字符依賴於彼此
  • Immunity to insertions: 被加密的數據以已知的長度到達
  • 很多常見的網絡加密術使用塊密碼完成的

Disadvantage:

  • slower: 再加解密之前需要等待每一個塊到達
  • Worse error propagation: 錯誤會影響整個塊

3.5 目前最流行的塊密碼AES

3.51 Increased popularity of AES

• Gradually replacing DES
----- As was intended
• Various RFCs describe using AES in IPsec (Internet Protocol Security) 網際協議安全
• FreeS/WAN IPsec (for Linux) includes AES (Wide Area Network) 廣域網
• Some commercial VPNs use AES (Virtual Private Network) 虛擬私人網絡
• Used in modern Windows systems
----- Also recent versions of Mac OS

3.52 AES加密流程 - 史上最詳細 (SPN 網絡詳解)

AES 從明文到密文的加密過程是通過 Substitution–permutation network (SPN) 得到的
在這裏插入圖片描述
上圖中包含了兩個算法模塊:

  1. Four building block: 用來用round key加密 改round的塊中的內容的
    ----- AddRoundKey
    ----- SubBytes
    ----- ShiftRound
    ----- MixColumns
  2. Key Sheduling Algorithm: 用來講key生成每一輪的round key

3.521 AEC的核心加密模塊

1. AddRoundKey: 把roundKey和中間狀態進行異或
  1. 先來說下什麼是roundKey, roundKey就是用最原始的key爲當前輪的狀態(block中的內容)產生的加密祕鑰, 其值是根據本身的祕鑰以及前幾輪的所有祕鑰根據相應的流程得出的, 具體的相關方法後面會詳細講解.
  2. 再來說說什麼是中間狀態, 狀態其實就是當前的塊也被叫做狀態, 但是每一輪後塊的值都會發生變化, 起始的塊叫做起始狀態, 進入算法後的塊都叫做中間狀態. 下面就是一箇中間狀態或者初始狀態.

在這裏插入圖片描述

在AES中一個塊是128bit的也就是16Byte的二維數組(4行4列) 每一個位置上有1個字節的數據也就是8bit 也就是兩個16進制數字也就是說每一個位置上是一個兩位的16進制數一個塊總共有16個2位的16進制數
好了接下來看看流程
在這裏插入圖片描述
這就是這一步乾的事情 把中間狀態和用key產生的128bit的round key 的對應位進行異或獲得第一步的輸出.

2. SubBytes 字節替換

把上面的到的結果中的每一位根據S-box替換成對應的其它位
在這裏插入圖片描述
有沒有看到x和y都是16進制的, 那麼根據我的猜測它是根據每個位置的數值把它替換成對應的數值, 因爲每個數值剛好是兩個16進制數, 不然的話想要用到s16,16需要有256個Byte也就是2048bits AES中跟本沒有這麼大的塊

3. ShiftRows 行位移變換

把每一行的元素向前移動所在行的數字個位置
在這裏插入圖片描述
這一步每一列都包含了所有行的信息

4. MixColumn 通過矩陣相乘把一列的每個元素混合在一起

在這裏插入圖片描述
這一步每一個元素都包含了它所在列的所有元素信息 比如 S00 = 02S00+01S10+01S20+03S30

3.522 Key Sheduling Function 用來產生round key

在這裏插入圖片描述

1. K0 的產生

首先用初始的key 把每一列當成一個word這樣就有4個word的K0了 (K0 就是初始的key)
在這裏插入圖片描述

2. 其它round key的產生

第二步用這個K0區產生下一個 round key.
在這裏插入圖片描述
Kn也是由4個word組成的其中每個word都是用上一輪key和前一位的word進行異或得到的. 這裏W4 是最爲特殊的因爲它的前一位是上一位的W3和剩下的word都不同, 它是由W0和處理後的W3異或得到的, 總的來說就是每一位新的word都是由上一輪對應位置的word和該word前面一個word異或得到的.

3. 末尾word處理算法g

下面來看下Key Scheduling Function的點睛模塊 g:
在這裏插入圖片描述

  1. 把每一位向前提一位
  2. 根據S-box把對應位置的word值映射到其它word值
  3. 把每一位和新的4個word的每一位進行異或, 新的4個word的第一個word是根據r當前round數定義
  4. 我們得到了經過算法處理的上一輪round key的最後一個word 並把它第一個word進行異或得到下一輪word1

3.53 AES 的安全性

  • AES 達到了塊密碼所能達到的最高的安全程度
    輸出以複雜的方式依賴於所有輸入:
    (1). 通過AddRoundKey把每個位置進行異或 這一步還是互相獨立
    (2). SubBytes 改變每個位置值的映射關係
    (3). ShiftRows 把每個列融入了每個行的信息
    (4). MixColumn 把每個元素都融合了元素所在列的所有元素值
    (5). 通過不同的round 把上面的再攪和的更亂
    (6). 每個round key 都和原始的key和之前所有的round key有關這也讓數據跟不可破解
    10 rounds for 128-bit keys ------------12 for192-bit keys ------------ 14 for 256-bit keys
  • 但是沒有證據能證明AES能免疫所有攻擊:
    最新的邊緣攻擊-new channel attack

4. Cryptographic modes - 加密模式 -解決插入攻擊

4.1 爲什麼要有加密模式 - 從AES引入加密模式的概念

上面的Block Cipher 是完美的麼? 當然不是下面給你個例子:
在這裏插入圖片描述
每一個block 是7個字節碼並且用同樣的祕鑰加密 會有什麼問題呢
在這裏插入圖片描述
現在開始變得有點奇怪了 發現了麼當明文相同時用同樣的key加密會得到相同的密文. 這有問題麼? 接着看
在這裏插入圖片描述
兩家銀行之間用AES的方式傳遞信息.
在這裏插入圖片描述
其中加解密都同樣的祕鑰, Bank1 加密信息傳給 Bank2, Bank2 解密之後根據明文更新賬戶信息. 目前還沒有問題
在這裏插入圖片描述
問題現在來了如果有意個bad guy 能夠獲取兩個銀行之前的通訊(唯密文攻擊), 但是由於這個賬號是他的他現在就進化成了 已知明文攻擊, 這個時候由於每個block之間是獨立的, 用相同的key加密會獲得相同的密文, 那麼現在這個人就相當於掌握了加密機的權限變成了選擇明文攻擊, 這樣的話由於每個block之間相互獨立, 那麼他就可以自己僞造一個block 用於給自己的賬戶加錢(他可以選擇明文獲得密文現在 所以可以知道對應錢的密文). 所以看到了麼問題出來了, 有兩個:

1. 相同的信息用相同的祕鑰加密會得到相同的密文 這會讓攻擊者掌握信息變成選擇明文攻擊
2. 不同的blocks之間相互獨立, 這導致攻擊者可以隨意加入新的block來非法盈利.

這其實是我們選錯加密模式的問題, 在這裏我們選擇了 Electronic Codebook Mode:
在這裏插入圖片描述
其實AES選擇的是區塊鏈加密模式這也是爲什麼它能抗擊insertion attack的原因, 因爲block之間是相互關聯按順序到來的, 你想改其中的一個你就要都給改了.

4.2 加密模式的介紹

  • 一種加密模式是應用一種特定密文的形式.
    同一個密文可以用於多個加密模式
    但是加密模式選不好會有嚴重的安全問題如AES選擇了ECM
  • 一種加密模式是密文, 祕鑰, 以及反饋(feedback) 的 結合(combination) 其實是一種簡單的操作

4.3 Cipher Block Chain 加密模式 - AES所應用的加密模式

根據上面的敘述我們要解決兩個問題:

  1. 塊之間相互獨立
  2. 兩個相同的塊信息用相同的key加密會得到相同的密文

來看看Block Chain 的特點:

  1. Ties together a group of related encrypted blocks
  2. Hides that two blocks are identical
    這兩條特性 -> Resists insertion attacks
    我們下面來看看是怎麼實現的

4.31 Add feedback 把所有塊都給連起來

在這裏插入圖片描述
在加密過程中加上反饋之前不是每個block都是獨立的經過SPN網絡並得到對應的暗文麼, 現在還是一樣不過輸入的明文不再是對應的塊的明文了而是先把對應的明文與之前的密文進行異或對應的纔是:
在這裏插入圖片描述
之後在進入和round key 異或的 AddRoundKey:

在這裏插入圖片描述
這一步實現的: Each block’s encryption depends on all previous blocks’ contents

4.32 Initialization Vector - 用來避免第一個塊內容相同

上面這樣是可以也解決了兩個塊內容相同用相同的key加密得到的密文相同的問題了(現在不存在相同的信息了)
但是這裏還有個問題, 如果兩個消息的第一個Block的內容相同那麼兩個消息的加密方式不是一模一樣. 而且這種情況其實很容易發生, 尤其是在有信息頭部並且有標準的文件格式的情況下. 所以我們引入了初始化向量.
步驟:

  1. 將第一個block的明文與一個隨機string異或然後進入SPN
  2. 對剩下的blocks實行CBC
    在這裏插入圖片描述
    這一步帶來的好處是:
  3. 加密結果總是獨一無二的 即使兩條消息一模一樣 在沒有IV的時候如果兩條消息一模一樣, 密文也是一樣的.

4.33 加密過程可視化

首先把第一個block的明文與IV進行異或
在這裏插入圖片描述
得到了中間明文, 把他通過加密算法得到 CB1- Cipher Block 1 (包含了PB1和IV信息的密文塊1)
在這裏插入圖片描述
這個CB1是會和PB2進行異或的到中間明文2的
在這裏插入圖片描述
再用中間明文2通過SPN得到包含了PB2, PB1, IV 信息的 CB2 (因爲CB2包含了CB1和PB2的信息)

4.34 解密過程可視化:

IV一般放在信息的頭部信息裏所以可以逆解信息
在這裏插入圖片描述
先看第一個黑色的, 第一個黑色的密文直接用解密算法(不是直接異或哈, 因爲加密算法可不是簡單的異或, 逆着過一遍加密算法就好, 因爲是僞隨機的) 解除帶有IV和PB1信息的中間明文1, 注意這時候CB1也就是第一個密文塊還是有用的用來解下一個中間明文中包含的明文塊信息. 現在我們有了中間明文塊1, 由於它是用PB1和IV直接異或得到那麼我們直接用它和IV異或就能得到PB1了

在這裏插入圖片描述
上面所提的密文塊1其實就是00110111, 在上面的圖中並沒有顯示它而直接給出瞭解出的中間明文1, 現在有了中間明文2了那我們就可以用密文1異或上中間明文2來獲得PB2, 因爲PB2本來就是通過密文1和PB2異或得到的

4.4 其它重要的加密模式

  • Electronic codebook mode (ECB)
  • Cipher block chaining mode (CBC)
  • Cipher-feedback mode (CFB) and Output-feedback mode (OFB)
    Both convert block to stream cipher

5. Uses of Symmetric Cryptography - 對稱加密術的使用

5.1 Secrecy (Confidentiality) - 機密性

只有那些知道合適祕鑰的人才能解密信息

5.2 Authentication - 認證

如果用對稱加密術來確定是誰改變了一段數據的話: 因爲只有兩個人有祕鑰那麼不是我就是你
但是這明顯是有問題的

  1. Problems with non-repudiation
    e.g., I create a data and encrypt it using a secret key known only
    by you and me; later, I deny that the data is created by me.
  2. What if three parties want to share a key? 當有第三者或超過兩個人的時候就不好使了
    公共祕鑰方案 或者 非對稱加密術可以很好地解決這個問題
  3. What if I want to prove authenticity without secrecy? 如果我不想用這個祕密來證明是我做的呢
    Encryption is not necessary. 這個看着很繞, 其實剛開始兩個人的時候成立就是因爲這是個祕密, 非我既你, 但是如果我不想利用保密性去證明是我改的呢, 如果大家都知道這段數據, 我怎麼證明是我改的呢, 這個其實是區塊鏈中的一部分內容.

5.3 Non - alterability 不可更改性

由於每一個塊都包含了前面所有塊的信息, 你改一個就會導致後面全都是錯的, 最後即使轉化成明文了也不可讀, 因爲不是原來有意義的明文了, 如果你想找到哪出錯了可以加上檢驗和就可以知道哪裏出了問題, 同時如果你不想加密數據, 只加密檢驗和也是一樣的能保證數據不被更改, 這句話的意思是說你只想讓別人不能改但是別人可以看.

6. Advantages and Disvantages of Symmetric Encrytion

Advantages

  1. 比非對稱加密術快很多
  2. 不需要很多中心化的權威中心
    儘管祕鑰服務站很有用

Disadvantages

  1. 加密和認證是一步完成的, 也就是說如果我只想認證而不想加密是不可能的 就像上面那個認證問題3一樣
  2. 沒有服務器難以實現不可抵賴性 (公共祕鑰方案 和 非對稱加密方案都有的中心化server)
  3. 祕鑰的分佈會是個問題
  4. 祕鑰的大範圍擴展是個大問題, 因爲和一個人通訊就需要一個祕鑰, 那麼整個互聯網你要擁有多少祕鑰啊
    在這裏插入圖片描述
    本章終於結束了!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章