AES128加密算法完整實現

概述

本來想把本身AES加密算法的整個實現過程給詳細複述下來,分享給想學習的同窗,也方便本身複習,但後來發現該工做量太大,加上做業太多沒有過多的時間去寫。因此就想把本身在學習的過程當中多遇到的好的文章進行彙總,避免重複性的工做,由於我感受有的文章的介紹和配圖寫的很是好,再次重複也沒有意義。本文裏我會將文章的連接附上,若有侵權,敬請告知!html

由於最近要完成課程做業,實現AES128加解密,本覺得就是一個簡單的算法實現,後來發現AES加密的每一步都挺難,並且都涉及到我沒聽過的概念,因此最近看了不少帖子、資料。最終終於可以解決這個問題。關於AES算法的介紹,網上有不少的帖子,因此我就不進行贅述了,我只是但願將我遇到的一些比較難以理解的點進行詳細的敘述。git

實現AES算法主要包括如下學習步驟:github

    1. GF(2^8)域上的多項式運算
    2. 擴展的歐幾里德算法
    3. 生成S盒
    4. 生成逆S盒
    5. S盒置換
    6. 行移位
    7. 列混合
    8. 生成祕鑰
    9. 循環加密

其中一、二、三、4步都跟S盒生成有關,根據我所看的一些博客,S盒的生成涉及到數論的基礎知識。若是沒有基礎的話,一、2是要專門去學習的,我在這兩步上花費了不少時間。可是在網上也能夠找到不少AES算法,他們用的是現成的S盒,沒有前4步,直接用現成的S盒置換,這樣相對會容易一些。可是本着刨根問底和多學習知識的原則,我仍是去學習了S盒的生成方式。第5步就是將每個字符進行查表替換,沒有什麼難以理解的地方,因此相對而言比較容易。第6步應該是整個過程中最簡單的一步了,就是進行一個循環移位。第7步列混合涉及到矩陣和多項式的乘法,因此仍是有必定難度,。。。算法

若是想從總體上了解AES加密的完整過程,那麼下面幾篇文章無論從敘述仍是插圖上來看都是很不錯的,幾篇文章介紹的方式不一樣,可是原理都是同樣的,對比結合着看會更有幫助:shell

http://www.javashuo.com/article/p-majyrkax-cn.htmlapp

https://blog.csdn.net/u012721519/article/details/79612128函數

http://www.javashuo.com/article/p-dujtalqt-ca.html學習

http://www.alonemonkey.com/2016/05/25/aes-and-des/加密

可是僅從這幾篇文章來看的話,對於像我這樣的小白而言仍是沒有辦法實現的,由於各個步驟介紹的並不具體,尤爲是對於缺乏基本數學知識學習的同窗很難理解。因此這幾篇文章能夠做爲總體進度的把控,接下來看怎麼一步步學習實現。spa

     S盒

我在學習這個算法的時候,在S盒的生成及置換上花費的時間是最多的。多是由於基礎較差,因此須要學習的東西比較多,因此我將這一部分進行了逐項的劃分。關於S盒的生成及置換,這篇博客進行了很是詳細的介紹,可是有一些東西我仍是沒明白,因此又參考了不少其餘文章,才把這一部分搞明白。建議初學者以這篇博客爲基礎進行學習:

https://blog.csdn.net/u011516178/article/details/81221646

下面進行分步的介紹。

      GF(2^8)域上的多項式計算

由於整個過程不少,因此我決定分爲多個文章分別進行敘述,首先是GF(2^8)域上的多項式計算,由於之前也沒有學過相關知識,不少概念都是第一次見到,因此這部分花了很長時間去學習。在學習這個以前,咱們須要知道爲何去學習這個東西,AES加密中的哪一步用到了該知識點呢?

S盒的置換就是將0~2^8中的任意一個字節置換爲另一個,置換的原則是將該元素置換爲在GF(2^8)域上的乘法逆元,什麼是GF(2^8)域?什麼又是逆元呢?這些定義的準確數學描述我不太懂,根據本次應用,我能夠給出粗略說明,GF(2^8)有限域大概就是指定義在該域中的數值通過定義在該域上的函數運算,其結果也都在該域內, 借用網上的一個例子進行說明:

那什麼又是乘法逆元呢,形如:

(a\cdot a_{-1} ) \% p=1

其中p爲有限域的範圍,這裏按理說應該爲2^8,可是卻不能取這個數,由於2^8並不與其內的每個數互質,因此只能選一個更大的質數(具體緣由請參考擴展的歐幾里德算法),AES算法中p的值選的是0x11B, 我也不知道爲何,多是約定俗成的吧,由於若是想找一個稍微比255大的質數,不知道爲何要取293(0x11B)。a 爲有限域內的整數,那麼 a_{-1} 即爲 a 在有限域上的逆元。至此,咱們知道逆元是什麼,可是具體怎麼去求解還不太清楚,這一部分請參照擴展的歐幾里德算法

我接下來繼續說GF(2^8)域上的多項式運算,由於把基本的運算搞清楚是計算GF(2^8)域上乘法逆元的前提,該域上的加減乘除運算是與傳統的運算所不一樣的,具體的多項式運算請參考GF(2^8)域上的多項式運算。固然,也能夠先學習擴展的歐幾里德算法,而後再學習該部分,實現的時候將歐幾里德算法中的四則運算換成GF(2^8)域上的多項式運算就好了。關於GF(2^8)域的計算介紹參考如下幾篇博客介紹:

https://blog.csdn.net/luotuo44/article/details/41645597

http://www.javashuo.com/article/p-axrshgwe-ng.html

http://abcdxyzk.github.io/blog/2018/04/16/isal-erase-3/

在四則運算中,加減運算就是簡單的異或運算,很簡單。而乘除運算則是以乘法運算爲基礎,因此四則運算中最主要的是理解乘法的運算,這篇http://www.javashuo.com/article/p-mxtchask-ng.html文章詳細介紹了乘法運算,以及其實現。

拓展的歐幾里得算法

待掌握了GF(2^8)域的運算知識後,應該去學一下拓展的歐幾里得算法,對於該算法,上面所給出的關於S盒生成的綜述博文裏已經參考相關教材進行了很是詳細的論述,因此關於這部分知識能夠一樣參考這篇博文(參考文獻10),

還能夠參考如下這篇博客:

https://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

若是還不明白,也能夠自行查找其餘關於拓展歐幾里得算法的介紹。

S盒生成及置換

關於S盒的生成及置換,一樣參考文獻10,該文章已經進行了很是詳盡的描述與代碼實現。待本身完成後也能夠參考博客中的結果進行檢驗。

行移位

行移位就是對每行數據進行相應的循環移位,沒有難以理解的地方,應該是整個加密過程最簡單的部分,關於移位的規則,能夠參考文獻一、二、三、4,均有詳細的圖示介紹。下圖來源於文獻4:

列混合

列混合就是將數據矩陣乘上一個矩陣,解密的時候乘上原矩陣的逆矩陣進行解密,秩序要按照步驟一步步來便可,一樣沒有難以理解的地方,按照參考文獻一、二、三、4的介紹進行操做就沒有問題。關於列混合還能夠參照這篇專門介紹的文章[11],其對於列混合又專門的介紹與實現,並且還有檢驗數據。下圖參照文獻4中圖片:

密鑰生成

密鑰的生成過程稍微有些麻煩,須要仔細參考規則,避免搞錯,可是隻須要理解操做規則便可,不須要理論理解,還好參考文獻三、4中都有很是生動的圖示。下圖來源於文獻4:

循環加密

循環加密就是對上述過程重複進行若干次。具體實現參照文獻一、二、三、4。

解密

解密過程就是將上述的過程反過來執行一遍,本來置換的就置換過來;本來移位的就反向移過來;本來乘上矩陣的就乘上她的逆矩陣。。。上面關於每一個加密過程的參考文獻都有相應的解密過程。

實現

關於AES128的加密完整實現,能夠參照代碼https://github.com/xinyu-yang/AES128-CBC,此代碼的實現幾乎都是參照上文的介紹,惟一不一樣的是在加密的時候採用了CBC模式,具體什麼是CBC加密模式,若是不清楚的能夠自行百度。若是有時間我也會把這部分補全。

 

參考文獻:

一、https://blog.csdn.net/zhjchengfeng5/article/details/7786595

二、http://www.javashuo.com/article/p-majyrkax-cn.html

三、https://blog.csdn.net/u012721519/article/details/79612128

四、http://www.javashuo.com/article/p-dujtalqt-ca.html

五、http://www.alonemonkey.com/2016/05/25/aes-and-des/

六、https://blog.csdn.net/luotuo44/article/details/41645597

七、http://www.javashuo.com/article/p-axrshgwe-ng.html

八、http://abcdxyzk.github.io/blog/2018/04/16/isal-erase-3/

九、http://www.javashuo.com/article/p-mxtchask-ng.html

十、https://blog.csdn.net/u011516178/article/details/81221646

十一、https://blog.csdn.net/u012620515/article/details/49893905

十二、https://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

相關文章
相關標籤/搜索