AES算法C源代码.doc

上传人:豆**** 文档编号:34213259 上传时间:2022-08-14 格式:DOC 页数:10 大小:73.50KB
返回 下载 相关 举报
AES算法C源代码.doc_第1页
第1页 / 共10页
AES算法C源代码.doc_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《AES算法C源代码.doc》由会员分享,可在线阅读,更多相关《AES算法C源代码.doc(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、如有侵权,请联系网站删除,仅供学习与交流AES算法C源代码【精品文档】第 10 页#include#include#include#include#include#define Nb 4 /分组大小为4int Nr=0; /轮数定义为0,实际值在程序中获取int Nk=0;/密钥长度定义为0,实际值在程序中获取int Nc = 128;/Nc为密钥长度,只能为128,192或256/ in:存储明文的数组/ out:存储密文的数组/ state:存储中间状态的数组unsigned char in16,out32,state44;unsigned char RoundKey240;/存储轮密钥的

2、数组unsigned char Key32;/存储输入的密钥int getSBoxInvert(int num)/逆S盒子 int rsbox256 = 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0

3、xc2, 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, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0

4、xda, 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, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0

5、xf2, 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, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0

6、xfe, 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, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0

7、x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d ;return rsboxnum;int getSBoxValue(int num)/S盒子 int sbox256 = /0 1 2 3 4 5 6 7 8 9 A B C D E F 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76

8、, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 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

9、, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 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

10、, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 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

11、, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 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

12、, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 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 ; return sboxnum;/ The round constant word array, Rconi, co

13、ntains the values given by / x to th e power (i-1) being powers of x (x is denoted as 02) in the field GF(28)/ Note that i starts at 1, not 0).int Rcon255 = 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,

14、 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,

15、 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97,

16、 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,

17、 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,

18、 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb ;/密钥扩展,生成Nb(Nr+1)的轮密钥,用于每轮的解密密钥void KeyExpansion() int i,j; unsigned char temp4,k; /第一个密钥为密钥本身 for(i=0;iNk;i+) Rou

19、ndKeyi*4=Keyi*4; RoundKeyi*4+1=Keyi*4+1; RoundKeyi*4+2=Keyi*4+2; RoundKeyi*4+3=Keyi*4+3; / 其它密钥由第一个密钥进行扩展得到 while (i (Nb * (Nr+1) for(j=0;j 6 & i % Nk = 4) temp0=getSBoxValue(temp0); temp1=getSBoxValue(temp1); temp2=getSBoxValue(temp2); temp3=getSBoxValue(temp3); RoundKeyi*4+0 = RoundKey(i-Nk)*4+0 t

20、emp0; RoundKeyi*4+1 = RoundKey(i-Nk)*4+1 temp1; RoundKeyi*4+2 = RoundKey(i-Nk)*4+2 temp2; RoundKeyi*4+3 = RoundKey(i-Nk)*4+3 temp3; i+;/ This function adds the round key to state./ The round key is added to the state by an XOR function.void AddRoundKey(int round) int i,j; for(i=0;i4;i+) for(j=0;j4;j

21、+) stateji = RoundKeyround * Nb * 4 + i * Nb + j;/ The SubBytes Function Substitutes the values in the/ state matrix with values in an S-box.void InvSubBytes() int i,j; for(i=0;i4;i+) for(j=0;j4;j+) stateij = getSBoxInvert(stateij);/ The ShiftRows() function shifts the rows in the state to the left.

22、/ Each row is shifted with different offset./ Offset = Row number. So the first row is not shifted.void InvShiftRows() unsigned char temp; / Rotate first row 1 columns to right temp=state13; state13=state12; state12=state11; state11=state10; state10=temp; / Rotate second row 2 columns to right temp=

23、state20; state20=state22; state22=temp; temp=state21; state21=state23; state23=temp; / Rotate third row 3 columns to right temp=state30; state30=state31; state31=state32; state32=state33; state33=temp;/ xtime is a macro that finds the product of 02 and the argument to xtime modulo 1b #define xtime(x

24、) (x7) & 1) * 0x1b)/ Multiplty is a macro used to multiply numbers in the field GF(28)#define Multiply(x,y) (y & 1) * x) (y1 & 1) * xtime(x) (y2 & 1) * xtime(xtime(x) (y3 & 1) * xtime(xtime(xtime(x) (y4 & 1) * xtime(xtime(xtime(xtime(x)/ MixColumns function mixes the columns of the state matrix./ Th

25、e method used to multiply may be difficult to understand for the inexperienced./ Please use the references to gain more information.void InvMixColumns() int i; unsigned char a,b,c,d; for(i=0;i4;i+) a = state0i; b = state1i; c = state2i; d = state3i; state0i = Multiply(a, 0x0e) Multiply(b, 0x0b) Mult

26、iply(c, 0x0d) Multiply(d, 0x09); state1i = Multiply(a, 0x09) Multiply(b, 0x0e) Multiply(c, 0x0b) Multiply(d, 0x0d); state2i = Multiply(a, 0x0d) Multiply(b, 0x09) Multiply(c, 0x0e) Multiply(d, 0x0b); state3i = Multiply(a, 0x0b) Multiply(b, 0x0d) Multiply(c, 0x09) Multiply(d, 0x0e);/ InvCipher is the

27、main function that decrypts the CipherText.void InvCipher() int i,j,round=0; /Copy the input CipherText to state array. for(i=0;i4;i+) for(j=0;j0;round-) InvShiftRows(); InvSubBytes(); AddRoundKey(round); InvMixColumns(); / The last round is given below. / The MixColumns function is not here in the

28、last round. InvShiftRows(); InvSubBytes(); AddRoundKey(0); / The decryption process is over. / Copy the state array to output array. for(i=0;i4;i+) for(j=0;j4;j+) outi*4+j=stateji;/ The SubBytes Function Substitutes the values in the/ state matrix with values in an S-box.void SubBytes() int i,j; for

29、(i=0;i4;i+) for(j=0;j4;j+) stateij = getSBoxValue(stateij);/ The ShiftRows() function shifts the rows in the state to the left./ Each row is shifted with different offset./ Offset = Row number. So the first row is not shifted.void ShiftRows() unsigned char temp; / Rotate first row 1 columns to left

30、temp=state10; state10=state11; state11=state12; state12=state13; state13=temp; / Rotate second row 2 columns to left temp=state20; state20=state22; state22=temp; temp=state21; state21=state23; state23=temp; / Rotate third row 3 columns to left temp=state30; state30=state33; state33=state32; state32=

31、state31; state31=temp;/ xtime is a macro that finds the product of 02 and the argument to xtime modulo 1b #define xtime(x) (x7) & 1) * 0x1b)/ MixColumns function mixes the columns of the state matrixvoid MixColumns() int i; unsigned char Tmp,Tm,t; for(i=0;i4;i+) t=state0i; Tmp = state0i state1i stat

32、e2i state3i ; Tm = state0i state1i ; Tm = xtime(Tm); state0i = Tm Tmp ; Tm = state1i state2i ; Tm = xtime(Tm); state1i = Tm Tmp ; Tm = state2i state3i ; Tm = xtime(Tm); state2i = Tm Tmp ; Tm = state3i t ; Tm = xtime(Tm); state3i = Tm Tmp ;/ Cipher is the main function that encrypts the PlainText.voi

33、d Cipher() int i,j,round=0; /Copy the input PlainText to state array. for(i=0;i4;i+) for(j=0;j4;j+) stateji = ini*4 + j; / Add the First round key to the state before starting the rounds. AddRoundKey(0); / There will be Nr rounds. / The first Nr-1 rounds are identical. / These Nr-1 rounds are execut

34、ed in the loop below. for(round=1;roundNr;round+) SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(round); / The last round is given below. / The MixColumns function is not here in the last round. SubBytes(); ShiftRows(); AddRoundKey(Nr); / The encryption process is over. / Copy the state array to

35、 output array. for(i=0;i4;i+) for(j=0;j4;j+) outi*4+j=stateji;char *encrypt(char *str, char *key) int i,j,Nl;double len;char *newstr; Nk = Nc / 32; Nr = Nk + 6; len= strlen(str); Nl = (int)ceil(len / 16); /printf(Nl:%dn, Nl); newstr = (char *)malloc(Nl*32); memset(newstr,0,sizeof(newstr); for(i=0;iN

36、l;i+) for(j=0;jNk*4;j+) Keyj=keyj; inj=stri*16+j; KeyExpansion(); Cipher();memcpy(&newstri*32, out, 32); return newstr;char *decrypt(char *str, char *key) int i,j,len,Nl;char *newstr; Nk = Nc / 32; Nr = Nk + 6; len= strlen(str); Nl = (int)ceil(len / 16); newstr = (char *)malloc(16*Nl); memset(newstr

37、,0,sizeof(newstr); for(i=0;iNl;i+) for(j=0;jNk*4;j+) Keyj=keyj; inj=stri*16+j; KeyExpansion(); InvCipher(); memcpy(&newstri*32, out, 32); return newstr;int main() char str_1128;/存明文 char str_2128;/存加密密钥char str_3128;/存解密密钥 char *str;char *str2; printf(请输入明文:n); scanf(%s,str_1); printf(请输入加密密钥:n);scanf(%s,str_2);str= encrypt(str_1, str_2); printf(进行加密后:%snn, str);printf(请输入解密密钥:n); scanf(%s,str_3); str2 = decrypt(str,str_3); printf(进行解密后:%sn, str2); getch(); return 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com