1. 程式人生 > >最強加密演算法?AES加解密演算法Matlab和Verilog實現

最強加密演算法?AES加解密演算法Matlab和Verilog實現

目錄

  • 背景

  • AES加密的幾種模式

  • 基本運算

  • AES加密原理

  • Matlab實現

  • Verilog實現

  • Testbench


本文首發於公眾號【兩猿社】,重點講述了AES加密演算法的加密模式和原理,用MATLAB和Verilog進行加解密的實現。

美劇《矽谷》第六季居然已經完結了!小猿追了6年的劇就這麼結束了,然而結局感覺並不那麼喜劇。比爾·蓋茨和Twitter前CEO也在最後一集本色出演了。

《矽谷》每一季的內容都緊跟當時科技前沿,最後一季也不例外,焦點聚集於資訊保安。經過Richard升級之後的超級AI—Son of Anton2.0,因為能自動破解現存世界上任何一種加密演算法,使得世界上再無隱私可言,而迫使Pied Piper宣佈解散,至此全季終。劇中提到了一種加密演算法:ECC P-256。

ECC是橢圓曲線密碼學(Elliptic Curve Cryptography)的簡稱,而P-256是“P-256”橢圓曲線。

聽上去挺唬人,這個P-256加密安全性怎麼樣呢?

早在2011年,美國國家標準技術研究院(NIST)審查了有關攻擊密碼演算法的學術文獻,並對不同演算法提供的實際安全性提出了建議。

可以看到,P-256的安全性和AES-128等同。在同等金鑰長度金鑰條件下,AES的加密安全性超過Hash、RSA和ECC。

AES加密究竟是個什麼演算法呢?

廢話不多說,我們直接進入正題!

(小猿儘可能用淺顯易懂的方式講解,但文中也不可避免的出現了一些公式和計算,篇幅較長,具有一定專業性。如果您僅想要獲取原始碼,請直接跳到文末。)

*ps:**關注公眾號【兩猿社】,回覆【AES】可獲取Matlab和Verilog原始碼,還有NIST FIPS原版AES spec哦!*


背景

隨著5G等高新技術的快速普及,大眾生活水平和認知的同步提高,資訊保安逐漸引起普通受眾的重視。再加上硬體加密相比軟體加密的天生優勢,國內加密晶片也開始嶄露頭角,在IC行業中擁有了一席之位。

AES (Advanced Encryption Standard)是由NIST標準化的對稱分組密碼,是對稱加密事實上的標準(上文提到的ECC屬於非對稱加密)。由於上一代的DES演算法金鑰長度小(56bits),容易被破解而被AES取代。可以發現,目前市面上幾乎所有的大型SOC晶片中,AES的身影必不可少。

在AES中,資料塊固定128bits長度,加解密的金鑰長度有三種,分別是128bits,192bits和256bits。本文以AES-128bits為例講解。其他兩種金鑰長度在實現上僅是金鑰擴充套件和輪數的差別。

將以32bits為一個字長進行分組,由於資料固有128bits,資料的分組長度Nb常為4,金鑰分組長度Nk分別為4(128bits)、6(192bits)和8(256bits)。


AES加密的幾種模式

  • ECB(Electronic Code Book)

ECB是最簡單的塊密碼加密模式,加密前根據加密塊大小(如AES為128位)分成若干塊,將使用相同的金鑰和相同的演算法對每個塊進行加密,解密同理。

ECB模式由於每塊資料的加密是獨立的,因此加密和解密都可以平行計算,ECB模式最大的缺點是加密相同的明文會得到相同的密文。


  • CBC(Cipher-block chaining)

CBC模式對於每個待加密的密碼塊在加密前會先與前一個密碼塊的密文異或然後再用加密器加密。第一個明文塊與初始化向量(IV)異或,IV具有與加密塊相同的大小。通常,IV是隨機數,而不是定數。

明文分為多個塊,需要新增填充資料。首先,我們將對IV使用明文塊異或。然後,將結果經過AES核加密得到密文塊。在下一個塊中,將使用加密結果與明文塊進行異或,一直到最後一個塊。

在這種模式下,即使加密相同的明文塊,也將獲得不同的密文塊。


  • CFB(Cipher feedback)

與ECB和CBC模式只能夠加密塊資料不同,CFB能夠將塊密文(Block Cipher)轉換為流密文(Stream Cipher),它仍需要IV。

首先,需加密IV,將其與明文塊進行異或運算得到密文。然後將加密結果再加密,與明文進行異或。由於此模式不會直接加密明文,僅使用密文與明文進行異或運算以獲取密文。因此,在這種模式下,不需要填充資料。

而且它可以並行解密資料。此模式類似於CBC,如果有壞塊,它將影響所有後續塊。


  • OFB(Output feedback)

OFB是先用塊加密器生成金鑰流(Keystream),然後再將金鑰流與明文流異或得到密文流,解密是先用塊加密器生成金鑰流,再將金鑰流與密文流異或得到明文,由於異或操作的對稱性所以加密和解密的流程是完全一樣的。

它與CFB不同,它始終對IV進行加密。它不能並行加密/解密IV。


  • CTR(Counter)

在CTR操作模式下,計數值作為加密器(Encrypt)的輸入塊,即為IV,計數器的值(Counter,Counter + 1,…,Counter + N – 1)被加密。它也是流加密器。

計數器的大小與所用塊的大小相同。如圖所示,將加密器的輸出塊與明文塊異或。所有加密塊都使用相同的加密金鑰。這種模式下,它不會受到壞塊的影響。非常像OFB模式。但是CTR每次都會使用計數器進行加密,而不是使用IV。因此,如果可以直接獲得計數器,則可以並行加密/解密資料。

注:上文所提到的塊加密器即FIPS第197號文中所描述的 AES加密演算法,即AES加密核。


基本運算

咳咳,好了,上面是什麼玩意兒不管了,沒關係,讓我們重新開始學加法和乘法吧......

行行行,你看一遍能懂算我輸。

AES演算法中,所涉及到的計算都是在有限域GF(\(2^8\))上的。

GF(\(2^8\))域是由8位2進位制陣列成,其空間大小為256(00~ff),因此記為\(2^8\)。

在有限域中進行的加法運算和乘法運算不同於我們平常使用的基本算術運算,下面是它的幾個特點:

1) 對於GF(\(2^8\))域來說,多項式的係數只可能是0或1。
2) 合併同類項時,各系數進行的是沒有進位的二進位制相加運算,與異或運算相同。
3) GF(\(2^8\))域沒有減法運算,域中減法運算就等同於加法運算。


  • GF(\(2^8\))域加法

單位元的相加實則是異或操作。
1⊕1=0
1⊕0=1
0⊕0=0
多位元相加則對應係數異或:


  • GF(\(2^8\))域乘法

有限域GF(\(2^8\))上的乘法運算較為複雜,依然滿足分配律和結合律。

GF(\(2^8\))域中的兩個多項式做乘法後,其最高次項會在0~14之間,需要對一個最高次項為8的固定不可約分多項式取模。

在AES演算法中運算都是以位元組為單位的,其不可約分多項式固定為
\[m(x)=x^8+x^4+x^3+x+1\]
二進位制形式表示為{0000001}{00011011},十六進位制為{01}{1b}。

取模運算後使最終結果的多項式x的最高次項不大於7,才能適應AES演算法的位元組運算要求。如果做乘法之後的最高次項不大於7,則不需要做取模運算。

由於有限域中乘法運算符合交換律和分配律,多項式與任何數的乘法運算都可以分解為多個乘{02}與{01}後的有限域加法運算,與{02}的乘法運算可以用移位實現,與{01}的乘法運算結果則是其本身。

AES演算法中每個計算單位都是8位,乘法分解之後最高次項最大為\(x^8\)(\(x^7\)•{02}),移位後的等效多項式如下:
\[m(x)=b_7x^8+b_6x^7+b_5x^6+b_4x^5+b_3x^4+b_2x^3+b_1x^2+b_0x\]

如果\(x^8\)項係數\(b_7\)為0,則證明結果無溢位;為1則證明結果溢位,需要與{01}{1b}取模運算。由於已經事先知道最高項為8次方項,與{01}取模後的結果為0。因此只用考慮與{1b}的取模運算,而最高次項此時最大為7次方,與{1b}的取模運算和異或操作等同。

加法很簡單吧,你說什麼,乘法看不懂?沒關係,接著往下看。


AES加密原理

AES-128bits加密演算法中共有十輪迭代變換,每一輪迭代包含4個計算,分別是位元組替換(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)及輪金鑰加(AddRoundKey)。

可以表示為:

Round (State,RoundKey)
{
    SubBytes   (state);
    ShiftRows  (state);
    MixColumns (state);
    AddRoundKey(state); 
}

  • 加密步驟

明文在輸入加密核之後,經過第一次輪金鑰加,開始輪函式的迭代,即依次通過位元組替換,行移位,列混合和輪金鑰加運算;而在最後一輪即第十輪變換時,省去了列混合這一步驟。

解密的步驟剛好相反,順序不同。密文通過一次輪金鑰加之後,進入解密輪函式,依次是行移位,位元組替換,輪金鑰加和列混合的逆運算(由於輪金鑰加為異或運算,其逆運算也是異或運算,所以它的逆運算不變),最後一輪同樣也沒有逆列混合。

注意加密和解密所用的擴充套件後金鑰順序是相反的,且加解密的最後一個操作都是輪金鑰加,這樣可以防止攻擊者繞過金鑰而直接對系統進行攻擊,使演算法具有很好的安全性。


  • 位元組替換

位元組替換(SubBytes)是AES演算法中惟一的非線性運算,使用替換表(S-Box)對矩陣中的每一個位元組元素進行獨立運算。且s-box是可逆的。為了實現方便,使用S-Box替換的方式進行。verilog中使用查詢表實現。

轉換方式為:假設輸入的位元組為{\(a_7\) \(a_6\) \(a_5\) \(a_4\) \(a_3\) \(a_2\) \(a_1\) \(a_0\)}
則經過S-Box之後的輸出值為S[\(a_7\) \(a_6\) \(a_5\) \(a_4\)][\(a_3\) \(a_2\) \(a_1\) \(a_0\)]

例如:如輸入二進位制位元組為{10110100},十六進位制為{B4},參照S-Box替換表替換後的值為S[B][4]=8D,再經過Inverse S-Box可得到替換前的值 =B4(AES解密中的逆變換會在下一篇講解)。


  • 行移位

行移位(ShiftRows)是實現4×4矩陣內部位元組的置換。

實際操作是:第零行不改動,將第一行每個字向左迴圈移1 byte,第二行每個字向左迴圈移2 byte,第三行每個字向左迴圈移3 byte。


  • 列混合

列混合(MixColumns)是對GF(\(2^8\))域某些算術性質的等效,是狀態矩陣與域中一個固定多項式做乘法運算,然後與多項式(\(x^4+1\))取模,其中固定多項式a(x)為:
\[a(x)=(03)x^3+(01)x^2+(01)x+(02)\]
()中的數為十六進位制位元組。則列混合表示為:
\[s'(x)=a(x)•s(x)\]

用矩陣乘法表示為:

可以看出,固定矩陣的值由3個十六進位制位元組組成,即{01}、{02}、{03},列混合中的加法運算和乘法運算都是有限域中的算術運算。所以符合以下規則:

1) 某個位元組的值乘以{02},則是將該位元組向左移1 bit,如果該位元組最高位為1(移位後溢位),則要將乘2後的值異或{1b},二進位制形式為{00011011};
2) GF(\(2^8\))域中的乘法運算滿足分配律,例如:
\[07•S_0,_0=(01⊕02⊕04)S_0,_0=S_0,_0⊕(02•S_0,_0)⊕(04•S_0,_0)\]


  • 輪金鑰加

輪金鑰加(AddRoundKey)的計算原理相對簡單,將輸入狀態矩陣中對應的元素與輸入的金鑰或者擴充套件後的金鑰相異或。


  • 金鑰擴充套件

金鑰擴充套件(KeyExpansion)是用輸入的128位(AES-128)金鑰做為初始金鑰,使用特定的計算方法產生新的擴充套件金鑰的操作。

對AES-128來說,金鑰擴充套件共有10輪,每一輪產生4個32bits的子金鑰,一共產生10×4×32bits的子金鑰。

上圖(a)中,k矩陣為輸入的128bits初始金鑰,按每列4個位元組的方式分為4個32bits的字,將這4個初始金鑰組合成的字\(w_1\),\(w_2\),\(w_3\),\(w_4\)作為加密時第一次輪金鑰加的輪金鑰。然後依次以下面的方法求出\(w_j\)。

1) 若j不為4的整數倍,則\(w_j\)由下式確定:
\[w_j=w_j-_4⊕w_j-_1\]
2) 若j為4的整數倍,則\(w_j\)由下式確定:
\[w_j=w_j-_4⊕g(w_j-_1)\]

\(g(w)\)函式如(b)所示,操作如下:

1) 首先將w中的元素迴圈左移1 byte。
2) 每個元素在S-Box進行替換。
3) 與32bits常量{RC[j/4],00,00,00}異或,其中RC是一個固定的一維陣列,RC值如下:RC={00,01,02,04,08,10,20,40,80,1B,36}

ps:原本的RC值有10個(沒有RC[0]即00),而此處加上00是為了公式中表示陣列時的便利。在g函式的運算過程中,由於j的值最小為4,j/4的值最小為1,所以不會產生影響。

現在加密輪函式和金鑰擴充套件都已經知道了,那按照加密流程中一步步計算,即可得到加密後的密文。

由於篇幅原因,本文只對加密原理進行講解,解密原理即逆運算原理如有需要會在後續更新,可關注後續文章。


matlab實現

matlab驗證結果。(原始碼獲取關注公眾號【兩猿圈】,回覆【AES】)


Verilog實現

本設計為AES-128bits,輸入的128bits明文和初始金鑰,對明文(密文)進行十輪加解密之後輸出密文(明文)。

  • 模組結構

該設計包含資料收發模組、Sbox和Inv_Sbox模組、金鑰擴充套件模組以及加解密模組。其中在加密模式下,由於每位元組明文對應一個Sbox,則加密時需要16個Sbox(金鑰擴充套件在開始加密前就已經完成,所用的4個Sbox可複用),解密模式下需要16個Inv_Sbox和4個Sbox(金鑰擴充套件)。


  • 介面訊號

考慮到AES-128模式下金鑰及明文或密文的寬度都是128bits,如果使用FPGA直接綜合,輸入和輸出至少需要384個IO口,因此為了節約IO口,本設計使用32bits寬度進行資料的傳輸。


Testbench

Testbench結構包括髮送模型send_model,接收模型receive_model,模擬模型即參考模型refer_model和自動對比模型auto_com。

呼,終於完了,現在你瞭解AES加密了嗎?


關注公眾號【兩猿社】,微訊號 : twomonkeysclub
回覆【AES】,獲取Matlab和Verilog原始碼。
在這裡,我會分享網際網路、IC程式設計知識,以及一些有趣的想法和經歷。

相關推薦

加密演算法AES解密演算法MatlabVerilog實現

目錄 背景 AES加密的幾種模式 基本運算 AES加密原理 Matlab實現 Verilog實現 Testbench 本文首發於公眾號【兩猿社】,重點講述了AES加密演算法的加密模式和原理,用MATLAB和Verilog進行加解密的實現。 美劇《矽谷》第六季居然已經完結了!小猿追了6年的劇就這麼結束

C#之演算法加密一:AES解密

AES:是高階加密標準,在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準主要是代替原先的DES,以及被多方分析且廣為全世界所使用。   AES加密資料塊分組長度必須是128位元,金鑰長度可以使128位元,192位元,256位元中的任意一個(

使用python實現RSA解密演算法(包含讀取檔案操作),檔案內容為16進位制字串,同時實現對學號姓名的加密——(SCU應用密碼學實驗)

#-*- coding:UTF-8 -*- ''' time: 2018-5-30 content:RSA python 3.6 mac os ''' from random import randint import random im

nodejs aes解密128演算法,base64編碼

function encryption(data) { var iv = ""; var clearEncoding = 'utf8'; var cipherEncoding = 'base64'; var cipherChun

【JAVA】常用解密演算法總結及JAVA實現【BASE64,MD5,SHA,DES,3DES,AES,RSA】

BASE64 這其實是一種編解碼方法,但是隻要我們能夠將原文變成肉眼不可識別的內容,其實就是一種加密的方法。 BASE64 的編碼都是按字串長度,以每 3 個 8 bit 的字元為一組,然後針對每組,首先獲取每個字元的 ASCII 編碼,然後將 ASCII 編碼轉換成 8

rsa加密演算法解密所踩過的坑

package cn.com.yusys.yusp.uaa.security; /** * @專案名稱: yusp-commons * @類名稱: RSAUtil * @類描述: * @功能描述: * @建立人: [email protected] * @建立時間: 2018-02

【網路安全】解密演算法詳解

資料簽名、加密是前後端開發經常需要使用到的技術,應用場景包括不限於使用者登入、資料交易、資訊通訊等,不同的應用場景也會需要使用到不同的簽名加密演算法,或者需要搭配不一樣的 簽名加密演算法來達到業務目標。常用的加密演算法有: 對稱加密演算法; 非對稱加密演算法; 雜湊演算法,加鹽雜湊演算法(單向加密); 數

3DES解密演算法

在日常設計及開發中,為確保資料傳輸和資料儲存的安全,可通過特定的演算法,將資料明文加密成複雜的密文。目前主流加密手段大致可分為單向加密和雙向加密。   單向加密:通過對資料進行摘要計算生成密文,密文不可逆推還原。演算法代表:Base64,MD5,SHA;   雙向加密:與單向加密相

安全體系(零)—— 解密演算法、訊息摘要、訊息認證技術、數字簽名與公鑰證書

鋒影 email:[email protected] 如果你認為本系列文章對你有所幫助,請大家有錢的捧個錢場,點選此處贊助,贊助額0.1元起步,多少隨意 本文講解對稱加密、非對稱加密、訊息摘要、MAC、數字簽名、公鑰證書的用途、不足和解決的問題。 0.概

資料傳輸加密——非對稱加密演算法RSA+對稱演算法AES(適用於java,androidWeb)

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 資料傳輸加密   在開發應用過程中,客戶端與服務端經常需要進行資料傳輸,涉及到重要隱私資訊時,開發者自然會想到對其進行加密,即使傳輸過程中被“有心人”擷取,也不會將資訊洩露。對於加密

RSA非對稱解密演算法的使用

加密金鑰和解密金鑰相同時則稱為對稱加密。由於加密金鑰和解密金鑰相同,它們也被稱為Shared Key。如AES等。 加密金鑰(公鑰)和解密金鑰(私鑰)不相同時則稱為非對稱加密,別稱公鑰密碼。如RSA等。 非對稱加密例子: 假設張三擁有的公鑰Pu和私鑰Pr,其公鑰是公開的,誰

Java☞DES解密演算法簡介及實現

Java加密解密之對稱加密演算法DES   資料加密演算法(Data Encryption Algorithm,DEA)是一種對稱加密演算法,很可能是使用最廣泛的金鑰系統,特別是在保護金融資料的安全中,最初開發的DEA是嵌入硬體中的。通常,自動取款機(Aut

Crypto++ /解密演算法

編譯 Crypto++ cryptlib 適合VC6 VC7 VC8 VC9 VC10 Crypto++ Library is a free C++ class library of cryptographic schemes. 可以到下面的網址下載最新原始碼: Cry

RSA演算法解密---crypto++庫OpenSSL庫

1. OpenSSL庫 a、 方式一: #include<string.h>#include <openssl/rsa.h>#pragma comment(lib,"libeay32.lib")#pragma comment(lib,"ssleay3

常見解密演算法及opensll的使用

上篇寫了關於jni的使用blog,本文主要在於使用c++實現一些加解密演算法,然後供android開發使用; 首先補充加解密的知識及基本概念 對稱加密VS非對稱加密、公鑰VS私鑰、簽名/驗證、資訊摘要  公鑰加密資料,然後私鑰解密的情況被稱為加密解密,私鑰加密資料,公鑰

C# 可逆解密演算法

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EmptyProjec

密碼學之各種解密演算法比較

對稱加密演算法 對稱加密演算法用來對敏感資料等資訊進行加密,常用的演算法包括: DES(Data Encryption Standard):資料加密標準,速度較快,適用於加密大量資料的場合。 3DES(Triple DES):是基於DES,對一塊資料用三個不同的金鑰進行三次加密,強度更高。 AES(Adva

三種MD5解密演算法

首先有一個列舉用來判斷用什麼那種MD5加密 /// <summary> /// MD5 加密位數 /// </summary> public enum MD5_Type { /// <

C#/JAVA/PHP 互通DES解密演算法(ECB模式支援8位)

import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingE

php 基於PKCS7演算法解密

/** * PKCS7Encoder class * * 提供基於PKCS7演算法的加解密介面. */ class PKCS7Encoder { public static $block_size = 32; /** * 對需要加密的明文進行填充補位 *