1、aes算法加密 c语言完整程序(AES algorithm encryption C language complete program)#包括 7) ;/添加 GF(2)中的旋转字节。结果=温度;/将结果放入表中。S盒我 =结果;(+)!= 0) ;虚空 CalcSBoxInv(字节* S 盒,字节* sboxinv)我= 0 字节数据;J = 0字节数据;/遍历所有元素在 sboxinv使用 I.做通过使用/搜索方法 J.cleardog();做/ /检查电流是电流 I.逆如果(方法 J = =我)/如果这样,集 sboxinc和显示搜索完毕。sboxinv 我 = J;j255;(+)!
2、= 0) ;(+)!= 0) ;0x03,语句语句,0x03 0x01 0x01 0x02, , ,;/准备矩阵的第一列的两倍,消除需要循环。字节数据的结果 4 ;/ /把每个矩阵的行和列向量的点积。结果 0 = dotproduct(行 0,列) ;结果 1 = dotproduct(行 3,列) ;结果 2 = dotproduct(行 2,列) ;结果 3 = dotproduct(行 1,列) ;/将临时结果复制到原始列。列 0 =结果 0 ;列 1 =结果 1 ;列 2 =结果 2 ;列 3 =结果 3 ;无效字节(字节*字节,字节数)做*方法*字节字节= ;/替代每个字节的状态。字
3、节+;(-计数) ;无效 invsubbytesandxor(字节*字节,字节*键,字节数)做/ / * *字节字节= sboxinv *关键;/ /逆替代每个字节的状态和添加关键。*字节= 2 字节 *键/ 2 直接使用。增加速度。字节+;密钥+;(-计数) ;无效 invshiftrows(字节*状态)字节的温度;/注意:状态是按列排列的。/循环右行第二次。温度=国家 1 + 3 * 4 ;状态 1 + 3 * 4 =状态 1 + 2 * 4 ;状态 1 + 2 * 4 =状态 1 + 1 * 4 ;状态 1 + 1 * 4 =状态 1 + 0 * 4 ;状态 1 + 0 * 4 =温度;
4、/循环第三行右两次。温度=国家 2 + 0 * 4 ;状态 2 + 0 * 4 =状态 2 + 2 * 4 ;状态 2 + 2 * 4 =温度;温度=国家 2 + 1 * 4 ;状态 2 + 1 * 4 =状态 2 + 3 * 4 ;状态 2 + 3 * 4 =温度;/ /周期第四排右三次,即一旦离开。温度=国家 3 + 0 * 4 ;状态 3 + 0 * 4 =状态 3 + 1 * 4 ;状态 3 + 1 * 4 =状态 3 + 2 * 4 ;状态 3 + 2 * 4 =状态 3 + 3 * 4 ;状态 3 + 3 * 4 =温度;无效 ShiftRows(字节*状态)字节的温度;/注意:状
5、态是按列排列的。/循环,第二排,一次。温度=国家 1 + 0 * 4 ;状态 1 + 0 * 4 =状态 1 + 1 * 4 ;状态 1 + 1 * 4 =状态 1 + 2 * 4 ;状态 1 + 2 * 4 =状态 1 + 3 * 4 ;状态 1 + 3 * 4 =温度;/循环第三行左两次。温度=国家 2 + 0 * 4 ;状态 2 + 0 * 4 =状态 2 + 2 * 4 ;状态 2 + 2 * 4 =温度;温度=国家 2 + 1 * 4 ;状态 2 + 1 * 4 =状态 2 + 3 * 4 ;状态 2 + 3 * 4 =温度;/ /周期第四排左三次,右一次,即。温度=国家 3 + 3
6、 * 4 ;状态 3 + 3 * 4 =状态 3 + 2 * 4 ;状态 3 + 2 * 4 =状态 3 + 1 * 4 ;状态 3 + 1 * 4 =状态 3 + 0 * 4 ;状态 3 + 0 * 4 =温度;虚空 InvMixColumns(字节*状态)列混合(状态+ 0 * 4) ;列混合(状态+ 1 * 4) ;列混合(状态+ 2 * 4) ;列混合(状态+ 3 * 4) ;无效的列(字节*状态)列混合(状态+ 0 * 4) ;列混合(状态+ 1 * 4) ;列混合(状态+ 2 * 4) ;列混合(状态+ 3 * 4) ;无效 xorbytes(字节* * bytes2 bytes1
7、,字节,字节数)做* bytes1 = * bytes2;/ /添加在 GF(2) ,即异或。bytes1 + +;bytes2 + +;(-计数) ;虚空 CopyBytes(字节*,*从字节,字节数)做*从;+;来自+;(-计数) ;无效的密钥扩展(字节* Expandedkey)字节数据温度 4 ;字节我;字节 XDATA RCON 4 = 0x01,0x00,0x00,0x00 ;/轮常数。unsigned char xdata *键;unsigned char xdata一 16 ;密钥=;/ /以下为加解密密码,共字节可以选择任意值 16。关键 0 = 0x30;关键 1 = 0x
8、30;关键 2 = 0x30;关键 3 = 0x30;关键 4 = 0x30;关键 5 = 0x30;关键 6 = 0x30;关键 7 = 0x30;关键 8 = 0x30;关键 9 = 0x30;关键 10 = 0x30;关键 11 = 0x30;关键 12 = 0x30;关键 13 = 0x30;关键 14 = 0x30;关键 15 = 0x30;/复制密钥以启动扩展密钥。我= keylength;做* = *密钥 Expandedkey;Expandedkey + +;密钥+;而(i) ;/准备最后 4字节的密钥。Expandedkey = 4;临时 0 = *(Expandedkey
9、+ +) ;临时 1 = *(Expandedkey + +) ;临时 2 = *(Expandedkey + +) ;临时 3 = *(Expandedkey + +) ;/展开键。我= keylength;(我在 24/我们刚好过了一个街区大小吗?else if(我 keylength)= =块)SubBytes(温度,4) ;/替代每个字节。# endif/ /添加字节在 GF(2)的一个 keylength带走。XORBytes(临时 Expandedkey - keylength,4) ;/将结果复制到当前的 4字节。*(Expandedkey + +)=温度 0 ;*(Expand
10、edkey + +)=温度 1 ;*(Expandedkey + +)=温度 2 ;*(Expandedkey + +)=温度 3 ;+ + 4;/ /下一个 4字节。无效 invcipher(字节*块,字节* Expandedkey)圆= rounds-1 字节;Expandedkey + =块*轮;XORBytes(块 Expandedkey,16) ;Expandedkey =块;做invshiftrows(块) ;invsubbytesandxor(块 Expandedkey,16) ;Expandedkey =块;InvMixColumns(块) ;(圆形) ;invshiftrow
11、s(块) ;invsubbytesandxor(块 Expandedkey,16) ;无效密码(字节*块,字节* Expandedkey)/完成一个块(16 字节,128bit)的加密圆= rounds-1 字节;XORBytes(块 Expandedkey,16) ;Expandedkey + =块;做SubBytes(块,16) ;ShiftRows(块) ;列(块) ;XORBytes(块 Expandedkey,16) ;Expandedkey + =块;(圆形) ;SubBytes(块,16) ;ShiftRows(块) ;XORBytes(块 Expandedkey,16) ;无效
12、 aesinit(unsigned char * tempbuf)powtbl =酒店;logtbl = 2;CalcPowLog(powtbl,logtbl) ;tempbuf sbox =;CalcSBox(方法) ;Expandedkey =酒店;酒店/至此用来存贮密码表密钥扩展(Expandedkey) ;sboxinv = 2;/必须 2。2 至此开始只用来存贮 sboxinvCalcSBoxInv(S 盒,sboxinv) ;16 /对一个字节块解密,参数缓冲是解密密缓存,葫芦是要解密的块无效 aesdecrypt(unsigned char *缓冲,unsigned char *
13、葫芦)/ /字节数据温度块;/ / CopyBytes(温度、缓冲块) ;CopyBytes(缓冲,葫芦,块大小) ;invcipher(缓冲,Expandedkey) ;/ / xorbytes(缓冲区、葫芦、块) ;CopyBytes(葫芦,缓冲块) ;16 /对一个字节块完成加密,参数缓冲是加密缓存,葫芦是要加密的块无效 aesencrypt(unsigned char *缓冲,unsigned char *葫芦)CopyBytes(缓冲,葫芦,块大小) ;/ / xorbytes(缓冲区、葫芦、块) ;密码(缓冲,Expandedkey) ;CopyBytes(葫芦,缓冲块) ;/ /
14、加解密函数,参数为加解密标志,要加解密的数据缓存起始指针,要加解密的数据长度(如果解密运算,必须是 16的整数倍。 )unsigned char aesblockdecrypt(有些直接,unsigned char * ChiperDataBuf,unsigned char datalen)unsigned char xdata我;unsigned char数据块;unsigned char xdata sboxbuf 256 ;unsigned char xdata tempbuf 16 ;unsigned long int xdata orignlen = 0;/未加密数据的原始长度如果(
15、直接= 0)*(unsigned char *)& orignlen + 3)= chiperdatabuf 0 ;*(unsigned char *)& orignlen + 2)= chiperdatabuf 1 ;*(unsigned char *)& orignlen + 1)= chiperdatabuf 2 ;*(unsigned char *)& orignlen)= chiperdatabuf 3 ;datalen = datalen-4;其他的memmove(chiperdatabuf + 4,ChiperDataBuf,DataLen) ;orignlen = datale
16、n;chiperdatabuf 0 = orignlen;chiperdatabuf 1 = orignlen 8;chiperdatabuf 2 = orignlen 16;chiperdatabuf 3 = orignlen 24;cleardog();aesinit(sboxbuf) ;/ /初始化如果(直接= = 0)/解密块= datalen / 16;对于(i = 0;i 块;i + +)cleardog();aesdecrypt(tempbuf,chiperdatabuf + 4 + 16 *我) ;memmove(chiperdatabuf,chiperdatabuf + 4,
17、OrignLen) ;cleardog();返回(orignlen) ;其他/ /加密如果(datalen % 16!= 0)块= datalen / 16 + 1;/ / memset(chiperdatabuf + 4 +块16(datalen % 16) ,0x00,datalen % 16) ;/不足 16字节的块补零处理其他的块= datalen / 16;对于(i = 0;i 块;i + +)cleardog();aesencrypt(tempbuf,chiperdatabuf + 4 + 16 *我) ;cleardog();返回(块* 16 + 4) ;/ / # endif以
18、上是文件以下是头文件 C。#则 aes_h#定义 aes_hextern void aesinit(unsigned char * tempbuf) ;extern void aesdecrypt(unsigned char *缓冲,unsigned char *葫芦) ;extern void aesencrypt(unsigned char *缓冲,unsigned char *葫芦) ;extern void aesinit(unsigned char * tempbuf) ;extern void aesdecrypt(unsigned char *缓冲,unsigned char *葫芦) ;extern void aesencrypt(unsigned char *缓冲,unsigned char *葫芦) ;extern char aesblockdecrypt(有些直接,unsigned char * ChiperDataBuf,unsigned char datalen) ;# endif / aes_h这是我根据网上程序改写的。只支持 128位加解密。没有使用占内存很多的查表法。故运算速度会稍慢。