AES算法C源代码.docx
- 文档编号:11389257
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:10
- 大小:15.17KB
AES算法C源代码.docx
《AES算法C源代码.docx》由会员分享,可在线阅读,更多相关《AES算法C源代码.docx(10页珍藏版)》请在冰豆网上搜索。
AES算法C源代码
#include<>
#include<>
#include<>
#include<>
#include<>
#defineNb4intRcon[255]={
0x8d,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,
0x2f,0x5e,0xbc,0x63,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,0x8d,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36,0x6c,0xd8,
0xab,0x4d,0x9a,0x2f,0x5e,0xbc,0x63,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,0x8d,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,
0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f,0x5e,0xbc,0x63,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,0x8d,0x01,0x02,0x04,0x08,0x10,0x20,
0x40,0x80,0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f,0x5e,0xbc,0x63,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,0x8d,0x01,0x02,0x04,
0x08,0x10,0x20,0x40,0x80,0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f,0x5e,0xbc,0x63,
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};
{
temp[0]=getSBoxValue(temp[0]);
temp[1]=getSBoxValue(temp[1]);
temp[2]=getSBoxValue(temp[2]);
temp[3]=getSBoxValue(temp[3]);
}
temp[0]=temp[0]^Rcon[i/Nk];
}
elseif(Nk>6&&i%Nk==4)
{
{
temp[0]=getSBoxValue(temp[0]);
temp[1]=getSBoxValue(temp[1]);
temp[2]=getSBoxValue(temp[2]);
temp[3]=getSBoxValue(temp[3]);
}
}
RoundKey[i*4+0]=RoundKey[(i-Nk)*4+0]^temp[0];
RoundKey[i*4+1]=RoundKey[(i-Nk)*4+1]^temp[1];
RoundKey[i*4+2]=RoundKey[(i-Nk)*4+2]^temp[2];
RoundKey[i*4+3]=RoundKey[(i-Nk)*4+3]^temp[3];
i++;
}
}
voidAddRoundKey(intround)
{
inti,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
state[j][i]^=RoundKey[round*Nb*4+i*Nb+j];
}
}
}
voidInvSubBytes()
{
inti,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
state[i][j]=getSBoxInvert(state[i][j]);
}
}
}
Sothefirstrowisnotshifted.
voidInvShiftRows()
{
unsignedchartemp;
voidInvMixColumns()
{
inti;
unsignedchara,b,c,d;
for(i=0;i<4;i++)
{
a=state[0][i];
b=state[1][i];
c=state[2][i];
d=state[3][i];
state[0][i]=Multiply(a,0x0e)^Multiply(b,0x0b)^Multiply(c,0x0d)^Multiply(d,0x09);
state[1][i]=Multiply(a,0x09)^Multiply(b,0x0e)^Multiply(c,0x0b)^Multiply(d,0x0d);
state[2][i]=Multiply(a,0x0d)^Multiply(b,0x09)^Multiply(c,0x0e)^Multiply(d,0x0b);
state[3][i]=Multiply(a,0x0b)^Multiply(b,0x0d)^Multiply(c,0x09)^Multiply(d,0x0e);
}
}
voidInvCipher()
{
inti,j,round=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
state[j][i]=in[i*4+j];
}
}
AddRoundKey(Nr);
for(round=Nr-1;round>0;round--)
{
InvShiftRows();
InvSubBytes();
AddRoundKey(round);
InvMixColumns();
}
InvShiftRows();
InvSubBytes();
AddRoundKey(0);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
out[i*4+j]=state[j][i];
}
}
}
voidSubBytes()
{
inti,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
state[i][j]=getSBoxValue(state[i][j]);
}
}
}
Sothefirstrowisnotshifted.
voidShiftRows()
{
unsignedchartemp;
voidCipher()
{
inti,j,round=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
state[j][i]=in[i*4+j];
}
}
AddRoundKey(0);
for(round=1;round { SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(round); } SubBytes(); ShiftRows(); AddRoundKey(Nr); for(i=0;i<4;i++) { for(j=0;j<4;j++) { out[i*4+j]=state[j][i]; } } } char*encrypt(char*str,char*key) { inti,j,Nl; doublelen; char*newstr; Nk=Nc/32; Nr=Nk+6; len=strlen(str); Nl=(int)ceil(len/16); //printf("Nl: %d\n",Nl); newstr=(char*)malloc(Nl*32); memset(newstr,0,sizeof(newstr)); for(i=0;i { for(j=0;j { Key[j]=key[j]; in[j]=str[i*16+j]; } KeyExpansion(); Cipher(); memcpy(&newstr[i*32],out,32); } returnnewstr; } char*decrypt(char*str,char*key) { inti,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,0,sizeof(newstr)); for(i=0;i { for(j=0;j { Key[j]=key[j]; in[j]=str[i*16+j]; } KeyExpansion(); InvCipher(); memcpy(&newstr[i*32],out,32); } returnnewstr; } intmain() {charstr_1[128];//存明文 charstr_2[128];//存加密密钥 charstr_3[128];//存解密密钥 char*str; char*str2; printf("请输入明文: \n"); scanf("%s",str_1); printf("请输入加密密钥: \n"); scanf("%s",str_2); str=encrypt(str_1,str_2); printf("进行加密后: %s\n\n",str); printf("请输入解密密钥: \n"); scanf("%s",str_3); str2=decrypt(str,str_3); printf("进行解密后: %s\n",str2); getch(); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AES 算法 源代码