一、實驗目的
1、完成AES算法中1輪加密和解密操作
2、掌握AES的4個基本處理步驟
3、理解對稱加密算法的“對稱”思想
?二、實驗內容
1、題目內容描述
(1)利用C語言實現字節代換和逆向字節代換,字節查S盒代換
(2)利用C語言實現行移位和逆向行移位,字節行循環移位
(3)利用C語言實現列混合和逆向列混合,字節矩陣乘法
(4)利用C語言實現輪密鑰加,異或
(5)輸入文件名,讀取明文文件,分組實現AES加密(一輪,分組填充時采用空格),將密文存儲在cipher.txt 中。
(6)讀取cipher.txt,實現AES解密(一輪)
(實現GF(28)上的乘法計算,完成一個明文分組的加解密;密鑰固定為"1234567890123456")
- 關鍵代碼的設計、實現與執行
①.首先列出S盒和逆S和的二維數組,也可以是一維的,這個可以自己去網上復制,也可以手動:
②.在S盒創建好的基礎上,將明文進行分組,和希爾密碼很像,在不足4*4的矩陣時進行補足,在此仍然使用的是X進行填補,關鍵代碼如下:
?if (m % msize)//補足
????????for (int i = 0;i<msize-m%msize;i++)
????????????plain+='X';//用X補足
③.字節代換就是在第一步創建的S盒中查詢對應的十六進制的數,做出替換就可以了,直接return(其中S[][]就是建立的S盒,n表示相關明文),而逆字節代換相同的方法進行查詢,只是查詢的從對象從S盒變成了逆S盒,關鍵代碼如下:
s[n/16][n%16];
④.行位移就是在第i行整體向左移i個,而對于逆行位移就是在第i行整體向右移i個,關鍵代碼部分如下:
?for (int i=1;i<4;i++) {
????????int ii[4];
????????for (int j=0;j<4;j++)
????????????ii[j]=matrix[i][(4+j-d*i)%4];//行位移傳進去的d=-1,而逆行位移只是將參數d改為了1
????????for (int j=0; j<4; j++)
????????????matrix[i][j]=ii[j];
}
⑤.列混合是用固定矩陣去左乘輸入數據的每列,由于列是不止一個元素的,所以每次乘得的數要進行相加,但是在密碼學中,就是將得到的數值進行異或,而同樣的逆向列混合就是同樣用該列去乘該固定矩陣的逆矩陣,逆矩陣在前面的實驗中做過,只是將二階矩陣換成了四階矩陣,此處需要用到線性代數的知識,關鍵代碼如下:
?for (int i=1;i<8;i++) //有限域上的乘法部分
{
????????a[i]=a[i-1]<<1;
????????if (a[i]-255>0)
????????????a[i]=a[i]^27;
????????a[i]=a[i]&0xff;
????}
????int z=0;
????while (y!=0) {
????????int flag=y&(~y+1);
????????for (int i=0;i<8;i++)
????????????if ((flag>>i)==1)
????????????????flag=i;
????????z=z^a[flag];
????????y=y-pow(2,flag);
????}
for (int i=0; i<4;i++)//異或部分
????????for (int j=0;j<4;j++) ????a[i][j]=GMul(matrix[0][j],Col[i][0])^GMul(matrix[1][j],Col[i][1])^GMul(matrix[2][j],Col[i][2])^GMul(matrix[3][j],Col[i][3]);//將得到的數進行異或
⑥.輪密鑰加密,就是將輸入矩陣和密鑰矩陣進行按位異或,關鍵代碼如下:
for (int i=0;i<4;i++)
????????for (int j=0;j<4;j++) {
????????????k_w[i][j]=ex_key[n*4+j]/pow(16,6-2*i);
????????????ex_key[n*4+j]-=k_w[i][j]*pow(16,6-2*i);
????????}
????for (int i=0;i<4;i++)
????????for (int j=0;j<4;j++)
????????????matrix[i][j]=(matrix[i][j]^k_w[i][j])&0xff;
由于文件的使用操作在實驗1和實驗2中都由,故不做過多贅述,結果截圖如下:
- 實驗結果分析
根據上述結果,可以看到空格以及符號也會被算作明文的一個部分,也會占用矩陣的一個位置,并也會對它進行加密解密;而且明文不僅可以為字母也可以為漢字,在最后的解密得到的明文仍然有在明文分組時補足的X,當然也可以去掉,此處只是沒有去掉補足的X,方便觀察補足情況。
三、實驗思考
1、實驗過程總結
在實驗過程中,加強了對AES加密每個環節(字節代換,行位移,列混合,輪密鑰加)的理解,同時認識到了計算機處理和人工處理數據的差別;在此過程中也出現了很多問題,如最開始不知道異或操作怎么實現,經百度后發現^符號即可,其次是在列混合部分也是不知如何下手,在反復觀看視頻,理解深層含義并積累相關知識后得以實現。