AES.docx
- 文档编号:24543777
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:19
- 大小:148.45KB
AES.docx
《AES.docx》由会员分享,可在线阅读,更多相关《AES.docx(19页珍藏版)》请在冰豆网上搜索。
AES
实验程序如下:
#defineNb4
#defineNr10
intstate[4][Nb]={0x32,0x88,0x31,0xe0,0x43,0x5a,0x31,0x37,0xf6,0x30,0x98,0x07,0xa8,0x8d,0xa2,0x34};
intw[11][4][Nb];
intSbox[16][16]=
{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,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,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,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,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,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};
//l轮密钥加(AddRoundKey)
//进行了轮密钥加后的输出命令写在了主函数中
AddroundKey(intstate[4][Nb],intk)
{
inti,j;
for(i=0;i<4;i++)
for(j=0;j state[i][j]=state[i][j]^w[k][i][j]; } //字节代替(SubBytes) SubBytes(intstate[4][Nb]) { inti,j,x,y; { for(i=0;i<4;i++) for(j=0;j { x=state[i][j]/16; y=state[i][j]%16; state[i][j]=Sbox[x][y]; } } {//进行字节代替后的输出命令 for(i=0;i<4;i++) { for(j=0;j printf("%.2x",state[i][j]); printf("\n"); } } } //行移位(ShiftRows) ShiftRows(intstate[4][Nb]) { inti,j,temp[Nb]; { for(i=0;i<4;i++) { for(j=0;j temp[j]=state[i][(j+i)%Nb]; for(j=0;j state[i][j]=temp[j]; } } {//进行行移位以后的输出命令 for(i=0;i<4;i++) { for(j=0;j printf("%.2x",state[i][j]); printf("\n"); } } } //列混淆(Mixcolumns) MixColumns(intstate[4][Nb]) { inti,j,k,m,n,s,t,p,q,e; intr=0; intnewstate[4][Nb]; intmatrix[Nb][4]={0x02,0x03,0x01,0x01,0x01,0x02,0x03,0x01,0x01,0x01,0x02,0x03,0x03,0x01,0x01,0x02}; intLbox[16][16]= {0x00,0x00,0x19,0x01,0x32,0x02,0x1a,0xc6,0x4b,0xc7,0x1b,0x68,0x33,0xee,0xdf, 0x03,0x64,0x04,0xe0,0x0e,0x34,0x8d,0x81,0xef,0x4c,0x71,0x08,0xc8,0xf8,0x69, 0x1c,0xc1,0x7d,0xc2,0x1d,0xb5,0xf9,0xb9,0x27,0x6a,0x4d,0xe4,0xa6,0x72,0x9a, 0xc9,0x09,0x78,0x65,0x2f,0x8a,0x05,0x21,0x0f,0xe1,0x24,0x12,0xf0,0x82,0x45, 0x35,0x93,0xda,0x8e,0x96,0x8f,0xdb,0xbd,0x36,0xd0,0xce,0x94,0x13,0x5c,0xd2, 0xf1,0x40,0x46,0x83,0x38,0x66,0xdd,0xfd,0x30,0xbf,0x06,0x8b,0x62,0xb3,0x25, 0xe2,0x98,0x22,0x88,0x91,0x10,0x7e,0x6e,0x48,0xc3,0xa3,0xb6,0x1e,0x42,0x3a, 0x6b,0x28,0x54,0xfa,0x85,0x3d,0xba,0x2b,0x79,0x0a,0x15,0x9b,0x9f,0x5e,0xca, 0x4e,0xd4,0xac,0xe5,0xf3,0x73,0xa7,0x57,0xaf,0x58,0xa8,0x50,0xf4,0xea,0xd6, 0x74,0x4f,0xae,0xe9,0xd5,0xe7,0xe6,0xad,0xe8,0x2c,0xd7,0x75,0x7a,0xeb,0x16, 0x0b,0xf5,0x59,0xcb,0x5f,0xb0,0x9c,0xa9,0x51,0xa0,0x7f,0x0c,0xf6,0x6f,0x17, 0xc4,0x49,0xec,0xd8,0x43,0x1f,0x2d,0xa4,0x76,0x7b,0xb7,0xcc,0xbb,0x3e,0x5a, 0xfb,0x60,0xb1,0x86,0x3b,0x52,0xa1,0x6c,0xaa,0x55,0x29,0x9d,0x97,0xb2,0x87, 0x90,0x61,0xbe,0xdc,0xfc,0xbc,0x95,0xcf,0xcd,0x37,0x3f,0x5b,0xd1,0x53,0x39, 0x84,0x3c,0x41,0xa2,0x6d,0x47,0x14,0x2a,0x9e,0x5d,0x56,0xf2,0xd3,0xab,0x44, 0x11,0x92,0xd9,0x23,0x20,0x2e,0x89,0xb4,0x7c,0xb8,0x26,0x77,0x99,0xe3,0xa5, 0x67,0x4a,0xed,0xde,0xc5,0x31,0xfe,0x18,0x0d,0x63,0x8c,0x80,0xc0,0xf7,0x70, 0x07}; intEbox[16][16]= { 0x01,0x03,0x05,0x0f,0x11,0x33,0x55,0xff,0x1a,0x2e,0x72,0x96,0xa1,0xf8,0x13, 0x35,0x5f,0xe1,0x38,0x48,0xd8,0x73,0x95,0xa4,0xf7,0x02,0x06,0x0a,0x1e,0x22, 0x66,0xaa,0xe5,0x34,0x5c,0xe4,0x37,0x59,0xeb,0x26,0x6a,0xbe,0xd9,0x70,0x90, 0xab,0xe6,0x31,0x53,0xf5,0x04,0x0c,0x14,0x3c,0x44,0xcc,0x4f,0xd1,0x68,0xb8, 0xd3,0x6e,0xb2,0xcd,0x4c,0xd4,0x67,0xa9,0xe0,0x3b,0x4d,0xd7,0x62,0xa6,0xf1, 0x08,0x18,0x28,0x78,0x88,0x83,0x9e,0xb9,0xd0,0x6b,0xbd,0xdc,0x7f,0x81,0x98, 0xb3,0xce,0x49,0xdb,0x76,0x9a,0xb5,0xc4,0x57,0xf9,0x10,0x30,0x50,0xf0,0x0b, 0x1d,0x27,0x69,0xbb,0xd6,0x61,0xa3,0xfe,0x19,0x2b,0x7d,0x87,0x92,0xad,0xec, 0x2f,0x71,0x93,0xae,0xe9,0x20,0x60,0xa0,0xfb,0x16,0x3a,0x4e,0xd2,0x6d,0xb7, 0xc2,0x5d,0xe7,0x32,0x56,0xfa,0x15,0x3f,0x41,0xc3,0x5e,0xe2,0x3d,0x47,0xc9, 0x40,0xc0,0x5b,0xed,0x2c,0x74,0x9c,0xbf,0xda,0x75,0x9f,0xba,0xd5,0x64,0xac, 0xef,0x2a,0x7e,0x82,0x9d,0xbc,0xdf,0x7a,0x8e,0x89,0x80,0x9b,0xb6,0xc1,0x58, 0xe8,0x23,0x65,0xaf,0xea,0x25,0x6f,0xb1,0xc8,0x43,0xc5,0x54,0xfc,0x1f,0x21, 0x63,0xa5,0xf4,0x07,0x09,0x1b,0x2d,0x77,0x99,0xb0,0xcb,0x46,0xca,0x45,0xcf, 0x4a,0xde,0x79,0x8b,0x86,0x91,0xa8,0xe3,0x3e,0x42,0xc6,0x51,0xf3,0x0e,0x12, 0x36,0x5a,0xee,0x29,0x7b,0x8d,0x8c,0x8f,0x8a,0x85,0x94,0xa7,0xf2,0x0d,0x17, 0x39,0x4b,0xdd,0x7c,0x84,0x97,0xa2,0xfd,0x1c,0x24,0x6c,0xb4,0xc7,0x52,0xf6, 0x01}; { for(k=0;k { r=0; for(j=0;j { r=0; for(i=0;i<4;i++) { p=matrix[j][i]/16; q=matrix[j][i]%16; m=state[i][k]/16; n=state[i][k]%16; e=Lbox[p][q]+Lbox[m][n]; if(e<256) { s=e/16;t=e%16; } else { s=(e-255)/16;t=(e-255)%16; } r=r^Ebox[s][t]; } newstate[j][k]=r; } } for(i=0;i<4;i++) for(j=0;j<4;j++) state[i][j]=newstate[i][j]; } {//列混淆以后的输出 for(i=0;i<4;i++) { for(j=0;j printf("%.2x",state[i][j]); printf("\n"); } } } //密钥扩展 KeyExpansion(intkey[4][Nb]) { { inti,j,k,x,y; inttemp[4]; intRcon[11][4]={0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00, 0x04,0x00,0x00,0x00, 0x08,0x00,0x00,0x00, 0x10,0x00,0x00,0x00, 0x20,0x00,0x00,0x00, 0x40,0x00,0x00,0x00, 0x80,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00, 0x36,0x00,0x00,0x00}; for(i=0;i<4;i++) for(j=0;j w[0][i][j]=key[i][j];//k=0 for(k=1;k<11;k++) for(i=1;i<4;i++) for(j=0;j<4;j++) { temp[j]=w[k-1][(j+1)%4][3]; w[k][j][0]=temp[j]; x=w[k][j][0]/16; y=w[k][j][0]%16; w[k][j][0]=Sbox[x][y]; w[k][j][0]=w[k][j][0]^Rcon[k][j]^w[k-1][j][0]; w[k][j][i]=w[k-1][j][i]^w[k][j][i-1]; } } } //主函数 main() { intkey[4][Nb]={0x2b,0x28,0xab,0x09,0x7e,0xae,0xf7,0xcf,0x15,0xd2,0x15,0x4f,0x16,0xa6,0x88,0x3c}; inti,j,m=0; //输出原始的128位明文 { printf("输入的明文: \n"); for(i=0;i<4;i++) { for(j=0;j printf("%.2x",state[i][j]); printf("\n"); } getchar(); } //输出选定的128位密钥 { printf("输入的密钥: \n"); for(i=0;i<4;i++) { for(j=0;j printf("%.2x",key[i][j]); printf("\n"); } printf("\n"); getchar(); } //输出第一轮开始之前轮密钥加以后的结果,即第一轮的开始 printf("\n"); printf("第1轮的开始: \n"); KeyExpansion(key); AddroundKey(state,m); for(i=0;i<4;i++) { for(j=0;j printf("%.2x",state[i][j]); printf("\n"); } getchar(); //第一到第九轮加密 for(m=1;m { { //输出SubBytes处理后的 printf("第%d轮SubBytes处理后: \n",m); SubBytes(state); getchar(); //输出shiftrows处理后的 printf("第%d轮shiftrows处理后: \n",m); ShiftRows(state); getchar(); //输出mixcolumns处理后的 printf("第%d轮mixcolumns处理后: \n",m); MixColumns(state); getchar(); //输出本轮密钥 { printf("第%d轮密钥: \n",m); for(i=0;i<4;i++) { for(j=0;j printf("%.2x",w[m][i][j]); printf("\n"); } printf("\n"); getchar(); printf("\n"); } //输出轮密钥加以后的结果,即下一轮的开始 AddroundKey(state,m); printf("第%d轮的开始(即%d轮加密结果): ",m+1,m); for(i=0;i<4;i++) { printf("\n"); for(j=0;j printf("%.2x",state[i][j]); } printf("\n"); } getchar(); } //第十轮加密 m=10; printf("第10轮SubBytes处理后: \n"); SubBytes(state); getchar(); printf("第10轮shiftrows处理后: \n"); ShiftRows(state); getchar(); printf("第10轮密钥: \n"); for(i=0;i<4;i++) { for(j=0;j printf("%.2x",w[m][i][j]); printf("\n"); } printf("\n"); getchar(); AddroundKey(state,m); printf("经过10轮加密后最后得到的密文: "); for(i=0;i<4;i++) { printf("\n"); for(j=0;j printf("%.2x",state[i][j]); } getchar(); } 实验结果如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AES
![提示](https://static.bdocx.com/images/bang_tan.gif)