密碼學實驗報告_第1頁
密碼學實驗報告_第2頁
密碼學實驗報告_第3頁
密碼學實驗報告_第4頁
密碼學實驗報告_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、目錄AES加密算法實現(xiàn)2一實驗?zāi)康?二實驗原理2三實驗步驟2四實驗結(jié)果6五實驗心得8六源代碼:9RSA加解密算法實現(xiàn)18一實驗?zāi)康模?8二實驗要求:18三RSA函數(shù)主要代碼18四運算結(jié)果顯示:21五實驗心得21AES加密算法實現(xiàn)一 實驗?zāi)康?.深入理解AES加密/解密算法理論的基礎(chǔ)上,設(shè)計一個AES加密/解密軟件系統(tǒng);2完成一個明文分組的加解密,明文和密鑰是十六進制,長度都為128比特(32個16進制數(shù)),輸入明文和密鑰,輸出密文,進行加密后,能夠進行正確的解密;二 實驗原理AES的區(qū)塊長度固定為128 比特,密鑰長度則可以是128,192或256比特;大多數(shù)AES計算是在一個特別的有限域完成

2、的。AES加密過程是在一個4×4的字節(jié)矩陣上運作,這個矩陣又稱為“狀態(tài)矩陣”,其初值就是一個明文區(qū)塊(矩陣中一個元素大小就是明文區(qū)塊中的一個Byte)。加密時,各輪AES加密循環(huán)(除最后一輪外)均包含4個步驟:1.SubBytes 通過一個非線性的替換函數(shù),用查找表的方式把每個字節(jié)替換成對應(yīng)的字節(jié)。2.ShiftRows 將矩陣中的每個行進行循環(huán)式移位。3.MixColumns 列混淆。這個步驟使用線性轉(zhuǎn)換來混合每列的四個字節(jié)。4.AddRoundKey 矩陣中的每一個字節(jié)都與該次回合輪密鑰(round key)做XOR運算;每個子密鑰由密鑰生成方案產(chǎn)生。三 實驗步驟(一)加密1.密

3、鑰生成void keyexpansion(unsigned char S_BOX16,unsigned char keys44)unsigned char Rcon11 = 0,1,2,4,8,16,32,64,128,27,54;unsigned char past4;register int i,j;/打開密鑰文件if(fp=fopen("Key.txt","r")=NULL)printf("CAN NOT OPEN THE FILE!n");return ;printf("n請輸入密鑰!n");for(i =

4、 0;i <= 3;i +)for(j = 0;j <= 3;j +)fscanf(fp,"%02x",&keysji);printf("%02x ",keysji);for(i = 4;i <= 43;i +) /make the other 40 keys if(i % 4 = 0) /如果能被4整除,特殊處理for(j = 1;j <= 4;j +) /把前一個密鑰移位賦值給數(shù)組pastj - 1 = keysj % 4i -1;for(j = 0;j <= 3;j +)if(j = 0)keysji = S_

5、BOXpastj / 16pastj % 16 Rconi / 4 keysji - 4;elsekeysji = S_BOXpastj / 16pastj % 16 keysji - 4;elsefor(j = 0;j <= 3;j +)keysji = keysji - 4 keysji - 1;2.字節(jié)變換void bytesub(unsigned char S_BOX16,unsigned char B4)register int i,j;for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = S_BOXBij / 16Bij

6、% 16;3. 行移位void shiftrow(unsigned char B4)int i,temp;temp = B10;for(i = 0;i <= 2;i +)B1i = B1i + 1;B13 = temp;for(i = 0;i <= 1;i +)temp = B2i;B2i = B2i + 2;B2i + 2 = temp;temp = B33;for(i = 3;i >=1;i -)B3i = B3i - 1;B30 = temp;4. 列混合運算unsigned char xtime (unsigned char input) / x乘法('02&

7、#39;乘法) int temp;temp = input<<1;if(input & 0x80)temp = 0x1b;return temp; void mixcolumn(unsigned char input4) /列混合 int i, j;unsigned char output44;for(j = 0;j <= 3;j+)for(i = 0;i <= 3;i+)outputij = xtime(inputi%4j) /0x02乘法 ( input ( i + 1 ) % 4j xtime( input ( i + 1 ) % 4j ) ) /0x03

8、乘法 input ( i + 2 ) % 4j /0x01乘法 input ( i + 3 ) % 4j; /0x01乘法for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)inputij = outputij;(二) 解密運算1.逆行移位void invshiftrow(unsigned char B4)int i,temp;temp = B13;for(i = 3;i >= 1;i -)B1i = B1i - 1;B10 = temp;for(i = 0;i <= 1;i +)temp = B2i;B2i = B2i + 2;B2i

9、+ 2 = temp;temp = B30;for(i = 0;i <= 2;i +)B3i = B3i + 1;B33 = temp;2.逆列混合運算void invmixcolum(unsigned char input4) int i, j;unsigned char output44;for(j=0; j< 4; j+)for(i=0; i<4; i+)outputij = (xtime(xtime(xtime(inputi % 4j) xtime(xtime(inputi % 4j)xtime(inputi % 4j) /0x0E乘法 (xtime(xtime(xt

10、ime(input ( i + 1 ) % 4j) xtime(input ( i + 1 ) % 4j) input ( i + 1 ) % 4j) /0x0B乘法 (xtime(xtime(xtime(input ( i + 2 ) % 4j) xtime(xtime(input ( i + 2 ) % 4j) input ( i + 2 ) % 4j) /0x0D乘法 (xtime(xtime(xtime(input ( i + 3 ) % 4j) input ( i + 3 ) % 4j); /0x09乘法for(i = 0;i <= 3;i +)for(j = 0;j <

11、= 3;j +)inputij = outputij;3.逆字節(jié)變換void invbytesub(unsigned char N_S_BOX16,unsigned char B4)register int i,j;for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = N_S_BOXBij / 16Bij % 16;四 實驗結(jié)果我將明文設(shè)為13 43 67 69 88 d5 f6 8d 64 23 90 a2 e0 f5 b4 34,密鑰設(shè)為23 43 45 78 28 af cd ab f7 d4 88 09 c3 4f 3c 57,運行

12、結(jié)果如下:五 實驗心得本程序是處理的AES分組大小和密鑰長度都為128位,迭代輪數(shù)為10輪。由于我能力有限,下載的程序還有很多不足之處,比如不能自動運行產(chǎn)生16輪的輪密鑰,只能說是完成了AES的基本功能,我也希望能將它的功能變得更強大,但多次修改后均沒有成功。通過多次調(diào)試,對SubBytes,ShiftRows,MixColumns,AddRoundKey等加密過程,InvMixColumns,InvShiftRows,InvSubBytes等解密過程的編程運行過程有了清晰的認識,深入理解了AES的加密和解密過程,對算法、密碼保密性和安全性有了新的認識,收獲很多。六 源代碼:#include

13、<stdio.h>#include <stdlib.h>FILE *fp;unsigned char xtime (unsigned char input);void keyexpansion(unsigned char S_BOX16,unsigned char keys44);void bytesub(unsigned char S_BOX16,unsigned char B4);void shiftrow(unsigned char B4);void mixcolumn(unsigned char input4);void invbytesub(unsigned

14、char N_S_BOX16,unsigned char B4);void invshiftrow(unsigned char B4);void invmixcolum(unsigned char input4);int jiami(unsigned char S_BOX16);int jiemi(unsigned char S_BOX16,unsigned char N_S_BOX16);/密鑰生成void keyexpansion(unsigned char S_BOX16,unsigned char keys44)unsigned char Rcon11 = 0,1,2,4,8,16,3

15、2,64,128,27,54;unsigned char past4;register int i,j;/打開密鑰文件if(fp=fopen("Key.txt","r")=NULL)printf("CAN NOT OPEN THE FILE!n");return ;printf("n請輸入密鑰!n");for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)fscanf(fp,"%02x",&keysji);printf("%02x &q

16、uot;,keysji);for(i = 4;i <= 43;i +) /make the other 40 keys if(i % 4 = 0) /如果能被4整除,特殊處理for(j = 1;j <= 4;j +) /把前一個密鑰移位賦值給數(shù)組pastj - 1 = keysj % 4i -1;for(j = 0;j <= 3;j +)if(j = 0)keysji = S_BOXpastj / 16pastj % 16 Rconi / 4 keysji - 4;elsekeysji = S_BOXpastj / 16pastj % 16 keysji - 4;elsefo

17、r(j = 0;j <= 3;j +)keysji = keysji - 4 keysji - 1;/列混合運算用到的乘2函數(shù)unsigned char xtime (unsigned char input) / x乘法('02'乘法) int temp;temp = input<<1;if(input & 0x80)temp = 0x1b;return temp;/列混合運算void mixcolumn(unsigned char input4) /列混合 int i, j;unsigned char output44;for(j = 0;j <

18、;= 3;j+)for(i = 0;i <= 3;i+)outputij = xtime(inputi%4j) /0x02乘法 ( input ( i + 1 ) % 4j xtime( input ( i + 1 ) % 4j ) ) /0x03乘法 input ( i + 2 ) % 4j /0x01乘法 input ( i + 3 ) % 4j; /0x01乘法for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)inputij = outputij;/行移位void shiftrow(unsigned char B4)int i,temp

19、;temp = B10;for(i = 0;i <= 2;i +)B1i = B1i + 1;B13 = temp;for(i = 0;i <= 1;i +)temp = B2i;B2i = B2i + 2;B2i + 2 = temp;temp = B33;for(i = 3;i >=1;i -)B3i = B3i - 1;B30 = temp;/字節(jié)變換void bytesub(unsigned char S_BOX16,unsigned char B4)register int i,j;for(i = 0;i <= 3;i +)for(j = 0;j <=

20、3;j +)Bij = S_BOXBij / 16Bij % 16;/逆行移位void invshiftrow(unsigned char B4)int i,temp;temp = B13;for(i = 3;i >= 1;i -)B1i = B1i - 1;B10 = temp;for(i = 0;i <= 1;i +)temp = B2i;B2i = B2i + 2;B2i + 2 = temp;temp = B30;for(i = 0;i <= 2;i +)B3i = B3i + 1;B33 = temp;/逆列混合運算void invmixcolum(unsigned

21、 char input4) int i, j;unsigned char output44;for(j=0; j< 4; j+)for(i=0; i<4; i+)outputij = (xtime(xtime(xtime(inputi % 4j) xtime(xtime(inputi % 4j)xtime(inputi % 4j) /0x0E乘法 (xtime(xtime(xtime(input ( i + 1 ) % 4j) xtime(input ( i + 1 ) % 4j) input ( i + 1 ) % 4j) /0x0B乘法 (xtime(xtime(xtime(i

22、nput ( i + 2 ) % 4j) xtime(xtime(input ( i + 2 ) % 4j) input ( i + 2 ) % 4j) /0x0D乘法 (xtime(xtime(xtime(input ( i + 3 ) % 4j) input ( i + 3 ) % 4j); /0x09乘法for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)inputij = outputij;/逆字節(jié)變換void invbytesub(unsigned char N_S_BOX16,unsigned char B4)register int i

23、,j;for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = N_S_BOXBij / 16Bij % 16;int jiami(unsigned char S_BOX16)unsigned char e,B44;unsigned char keys444;int i,j;if(fp=fopen("Plaintext.txt","r")=NULL)printf("can't open the Plaintext.txt!n");return 0;printf("請輸

24、入信息!n");for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)fscanf(fp,"%02x",&e);Bji = e;printf("%02x ",e);getchar();fclose(fp);keyexpansion(S_BOX,keys);for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = keysij;int level;for(level = 1;level <= 9;level +) /1到9輪循環(huán)bytesub

25、(S_BOX,B);shiftrow(B);mixcolumn(B);for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = keysilevel * 4 + j;bytesub(S_BOX,B);/第10輪循環(huán)shiftrow(B);for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = keysi40 + j;if(fp=fopen("Ciphertext.txt","w")=NULL)printf("can't open the

26、 Plaintext.txt!n");return 0;printf("n加密后的信息為:n");for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)fprintf(fp,"%02x ",Bji);printf("%02x ",Bji);putchar('n');fclose(fp);return 0;int jiemi(unsigned char S_BOX16,unsigned char N_S_BOX16)unsigned char B44;unsigned

27、char keys444;unsigned char temp;int i,j;if(fp=fopen("Ciphertext.txt","r")=NULL)printf("can't open the Ciphertext.txt!n");return 0;printf("請輸入信息!n");for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)fscanf(fp,"%02x ",&temp);Bji = temp;printf(&qu

28、ot;%02x ",temp);fclose(fp);keyexpansion(S_BOX,keys);for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = keysij + 40;int level;for(level = 1;level <= 9;level +)invshiftrow(B);invbytesub(N_S_BOX,B);for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = keysi40 - level * 4 + j;invmixcolum(B);i

29、nvshiftrow(B);invbytesub(N_S_BOX,B);for(i = 0;i <= 3;i +)for(j = 0;j <= 3;j +)Bij = keysij;if(fp=fopen("jiemi_Plaintext.txt","w")=NULL)printf("can't open the jiemi_Plaintext.txt!n");return 0;printf("n解密的輸出的信息為:n");for(i = 0;i <= 3;i +)for(j = 0;j

30、<= 3;j +)fprintf(fp,"%02x ",Bji);printf("%02x ",Bji);putchar('n');fclose(fp);return 0;int main()unsigned char S_BOX1616 = 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,0xAD,

31、0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,0x52, 0x3B, 0xD6, 0xB3,

32、0x29, 0xE3, 0x2F, 0x84,0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3,

33、0xD2,0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,0xE7, 0xC8, 0

34、x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,0xE1, 0xF8, 0x98, 0x11, 0x69, 0

35、xD9, 0x8E, 0x94,0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16;unsigned char N_S_BOX1616 = 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,0x7C, 0xE3, 0x39, 0x

36、82, 0x9B, 0x2F, 0xFF, 0x87,0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x

37、98, 0x16,0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,0xC1, 0xA

38、F, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,0x6F, 0xB7, 0x62, 0x0E, 0xA

39、A, 0x18, 0xBE, 0x1B,0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xE

40、F,0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D;int choose;loop:printf("加密請輸入-1n");printf("解密請輸入-2n");printf("退出請輸入-0nn");printf

41、("您的選擇是:");scanf("%d",&choose);switch(choose)case 1: jiami(S_BOX);goto loop;case 2: jiemi(S_BOX,N_S_BOX);goto loop;case 0: exit(0);default : exit(0);return 0;RSA加解密算法實現(xiàn)一實驗?zāi)康模菏煜SA加密、解密的算法;懂得加密在通信中的重要作用。熟悉密碼工作模式。二實驗要求:通過借鑒已有的代碼段,在其基礎(chǔ)上自己添加具體一些函數(shù)定義及參數(shù)定義,實現(xiàn)RSA加密的基本過程。理解RSA加解密算法,使用VC實現(xiàn)加密算法和解密算法。三RSA函數(shù)主要代碼#include<io

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論