⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes.cpp

📁 AES加密算法
💻 CPP
字号:
// AES.cpp : Defines the entry point for the console application.
//

// ABCD.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#define NK 4
#define NB 6
#define NR 12
typedef unsigned char word8;//1字节无符号整数
typedef unsigned int word16;//2字节无符号整数

word8 Logtable[256] = //生成元为3的对数表
{ 0,   0,  25,   1,  50,   2,  26, 198,  75, 199,  27, 104,  51, 238, 223,   3, 
100,   4, 224,  14,  52, 141, 129, 239,  76, 113,   8, 200, 248, 105,  28, 193, 
125, 194,  29, 181, 249, 185,  39, 106,  77, 228, 166, 114, 154, 201,   9, 120, 
101,  47, 138,   5,  33,  15, 225,  36,  18, 240, 130,  69,  53, 147, 218, 142, 
150, 143, 219, 189,  54, 208, 206, 148,  19,  92, 210, 241,  64,  70, 131,  56, 
102, 221, 253,  48, 191,   6, 139,  98, 179,  37, 226, 152,  34, 136, 145,  16, 
126, 110,  72, 195, 163, 182,  30,  66,  58, 107,  40,  84, 250, 133,  61, 186, 
43, 121,  10,  21, 155, 159,  94, 202,  78, 212, 172, 229, 243, 115, 167,  87, 
175,  88, 168,  80, 244, 234, 214, 116,  79, 174, 233, 213, 231, 230, 173, 232, 
44, 215, 117, 122, 235,  22,  11, 245,  89, 203,  95, 176, 156, 169,  81, 160, 
127,  12, 246, 111,  23, 196,  73, 236, 216,  67,  31,  45, 164, 118, 123, 183, 
204, 187,  62,  90, 251,  96, 177, 134,  59,  82, 161, 108, 170,  85,  41, 157, 
151, 178, 135, 144,  97, 190, 220, 252, 188, 149, 207, 205,  55,  63,  91, 209, 
83,  57, 132,  60,  65, 162, 109,  71,  20,  42, 158,  93,  86, 242, 211, 171, 
68,  17, 146, 217,  35,  32,  46, 137, 180, 124, 184,  38, 119, 153, 227, 165, 
103,  74, 237, 222, 197,  49, 254,  24,  13,  99, 140, 128, 192, 247, 112, 7};

word8 Alogtable[256] = //生成元为3的反对数表
{ 1,   3,   5,  15,  17,  51,  85, 255,  26,  46, 114, 150, 161, 248,  19,  53, 
95, 225,  56,  72, 216, 115, 149, 164, 247,   2,   6,  10,  30,  34, 102, 170, 
229,  52,  92, 228,  55,  89, 235,  38, 106, 190, 217, 112, 144, 171, 230,  49, 
83, 245,   4,  12,  20,  60,  68, 204,  79, 209, 104, 184, 211, 110, 178, 205, 
76, 212, 103, 169, 224,  59,  77, 215,  98, 166, 241,   8,  24,  40, 120, 136, 
131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206,  73, 219, 118, 154, 
181, 196,  87, 249,  16,  48,  80, 240,  11,  29,  39, 105, 187, 214,  97, 163, 
254,  25,  43, 125, 135, 146, 173, 236,  47, 113, 147, 174, 233,  32,  96, 160, 
251,  22,  58,  78, 210, 109, 183, 194,  93, 231,  50,  86, 250,  21,  63,  65, 
195,  94, 226,  61,  71, 201,  64, 192,  91, 237,  44, 116, 156, 191, 218, 117, 
159, 186, 213, 100, 172, 239,  42, 126, 130, 157, 188, 223, 122, 142, 137, 128, 
155, 182, 193,  88, 232,  35, 101, 175, 234,  37, 111, 177, 200,  67, 197,  84, 
252,  31,  33,  99, 165, 244,   7,   9,  27,  45, 119, 153, 176, 203,  70, 202, 
69, 207,  74, 222, 121, 139, 134, 145, 168, 227,  62,  66, 198,  81, 243,  14, 
18,  54,  90, 238,  41, 123, 141, 140, 143, 138, 133, 148, 167, 242,  13,  23, 
57,  75, 221, 124, 132, 151, 162, 253,  28,  36, 108, 180, 199,  82, 246, 1};

static word8 S[256] = //S盒
{ 99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215, 171, 118, 
202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 
183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 229, 241, 113, 216,  49,  21, 
4, 199,  35, 195,  24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117, 
9, 131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,  47, 132, 
83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207, 
208, 239, 170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168, 
81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 
205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25, 115, 
96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20, 222,  94,  11, 219, 
224,  50,  58,  10,  73,   6,  36,  92, 194, 211, 172,  98, 145, 149, 228, 121, 
231, 200,  55, 109, 141, 213,  78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 
186, 120,  37,  46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138, 
112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158, 
225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85,  40, 223, 
140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 176,  84, 187, 22};

static word8 INS[256] = //逆S盒
{ 82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129, 243, 215, 251, 
124, 227,  57, 130, 155,  47, 255, 135,  52, 142,  67,  68, 196, 222, 233, 203, 
84, 123, 148,  50, 166, 194,  35,  61, 238,  76, 149,  11,  66, 250, 195,  78, 
8,  46, 161, 102,  40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 
114, 248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101, 182, 146, 
108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,  87, 167, 141, 157, 132, 
144, 216, 171,   0, 140, 188, 211,  10, 247, 228,  88,   5, 184, 179,  69,   6, 
208,  44,  30, 143, 202,  63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107, 
58, 145,  17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 
150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,  28, 117, 223, 110, 
71, 241,  26, 113,  29,  41, 197, 137, 111, 183,  98,  14, 170,  24, 190,  27, 
252,  86,  62,  75, 198, 210, 121,  32, 154, 219, 192, 254, 120, 205,  90, 244, 
31, 221, 168,  51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95, 
96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147, 201, 156, 239, 
160, 224,  59,  77, 174,  42, 245, 176, 200, 235, 187,  60, 131,  83, 153,  97, 
23,  43, 4, 126, 186, 119, 214,  38, 225, 105,  20,  99,  85,  33,  12, 125};

static word8 rot[5][4]={
  0, 1, 2, 3,
  0, 1, 2, 3, 
  0, 1, 2, 3,
  0, 1, 2, 4,
  0, 1, 3, 4 };


static word16 Rc[4][30] = //圈常数,用于密钥扩展时按位异或
	{ {0x00, 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}};

static word16 a[4][NB]={0x32,0x88,0x31,0xe0,0x12,0x12,//明文,数据块长度为NB
                       0x43,0x5a,0x31,0x37,0x34,0x34,
					   0xf6,0x30,0x98,0x07,0x56,0x56,
					   0xa8,0x8d,0xa2,0x34,0x78,0x78};

static word16 k[4][NK]={0x2b,0x28,0xab,0x09,//密钥,密钥块长度为NK
	                0x7e,0xae,0xf7,0xcf,
	                0x15,0xd2,0x15,0x4f,
	                0x16,0xa6,0x88,0x3c};

addroundkey(word16 a[4][NB],word16 key[4][NB*(NR+1)],int I)//圈密钥加,返回第I圈状态和该圈密钥的按位异或
{
	
	int i,j;
    for (i=0;i<4;i++)
		for (j=0;j<NB;j++)
		a[i][j]^=key[i][j+I*NB];
	
	return 0;
}

bytesub(word16 a[4][NB])//S盒变换,字节代换
{
    int i,j;
	for (i=0;i<4;i++)
		for (j=0;j<NB;j++)
			a[i][j]=S[a[i][j]];
	return 0;
}

inbytesub(word16 a[4][NB])//逆S盒变换
{
    int i,j;
	for (i=0;i<4;i++)
		for (j=0;j<NB;j++)
			a[i][j]=INS[a[i][j]];
	return 0;
}

shiftrow(word16 a[4][NB])//行移位
{
    int i,j;
	word16 t[NB];
	//for (i=1;i<4;i++)
	//{
	//	for (k=0;k<i;k++)
	//	{
	//		t=a[i][0];
	//	for (j=0;j<NB;j++)
	//		a[i][j]=a[i][(j+1)%4];
	//	a[i][3]=t;
	//	}
	//}
	 for(i = 1; i < 4; i++) {
  for(j = 0; j < NB; j++)
  t[j] = a[i][(j + rot[NB-4][i]) % NB];
  for(j = 0; j < NB; j++)  a[i][j] = t[j];}

  return 0;
}

inshiftrow(word16 a[4][NB])//逆行移位
{
	int i,j;
	word16 t[NB];
	//for (i=1;i<4;i++)
	//{
	//	for (k=0;k<i;k++)
	//	{
	//		t=a[i][3];
	//	for (j=NB-1;j>=0;j--)
	//		a[i][j]=a[i][(j-1)%4];
	//	a[i][0]=t;
	//	}
	//}
	 for(i = 1; i < 4; i++)
	 {
       for(j = 0; j < NB; j++)
		   t[j] = a[i][(NB + j - rot[NB-4][i]) % NB];
	   for(j = 0; j < NB; j++)  a[i][j] = t[j];}
	 


  return 0;
}

word16 mul(word16 a, word16 b) //利用查表法返回a*b
{   
if (a && b)
  return Alogtable[(Logtable[a] + Logtable[b])%255];
else  return 0;
}


mixcolumn(word16 a[4][NB])//列混淆
{
	word16 b[4][NB];
	int i,j;
	for (j=0;j<NB;j++)
		for (i=0;i<4;i++)
			b[i][j] = mul(2,a[i][j]) ^ mul(3,a[(i + 1) % 4][j])
    ^ a[(i + 2) % 4][j] ^ a[(i + 3) % 4][j];
for(i = 0; i < 4; i++)
for(j = 0; j < NB; j++)
   a[i][j] = b[i][j];

	return 0;
}

inmixcolumn(word16 a[4][NB]) //逆列混淆
{
     word16 b[4][NB];
     int i, j;
     for(j = 0; j < NB; j++)
        for(i = 0; i < 4; i++)
            b[i][j] = mul(0xe,a[i][j]) ^ mul(0xb,a[(i+1) % 4][j])
  ^ mul(0xd,a[(i+2) % 4][j]) ^ mul(9,a[(i+3) % 4][j]);
 for(i = 0; i < 4; i++)
    for(j = 0; j < NB; j++)  a[i][j] = b[i][j];
 return 0;
}

keyexpand(word16 w[4][NB*(NR+1)])//密钥扩展
{
	int i,j;
  word16 b[4][1],t;
  for (i=0;i<4;i++)
	  for (j=0;j<NK;j++)
		  w[i][j]=k[i][j];
  for (j=NK;j<NB*(NR+1);j++)
  {
	  if (j%NK)
		  for (i=0;i<4;i++)
			  w[i][j]=w[i][j-1]^w[i][j-NK];
	  else
	  {
          t=w[0][j-1];
		  for (i=0;i<4;i++)
			  b[i][0]=w[(i+1)%4][j-1];
		  b[3][0]=t;
		  		 
		  for (i=0;i<4;i++)
		  
			  w[i][j]=S[b[i][0]]^w[i][j-NK]^Rc[i][j/NK];
		  
	  }
  }
  return 0;
}

encrypt(word16 a[4][NB],word16 w[4][NB*(NR+1)])
{
    //word16 w[4][NB*(NR+1)];
	int i,j,I;

	//密钥扩展
   keyexpand(w);	
 
//加密过程
//初始圈密钥加	
    for (i=0;i<4;i++)
		for (j=0;j<NB;j++)
		a[i][j]^=w[i][j];
		
//从1到NR-1圈的圈变换
	for (I=1;I<NR;I++)
	{
	
		bytesub(a);
	
		shiftrow(a);
       
        mixcolumn(a);
		  
		addroundkey(a,w,I);
	}

	//第NR圈的圈变换
	bytesub(a);

	shiftrow(a);

	addroundkey(a,w,NR);

  return 0;
}

decrypt(word16 a[4][NB],word16 w[4][NB*(NR+1)])
{//解密过程
	int J;
	

   addroundkey(a,w,NR);
     
   inshiftrow(a);
   
   inbytesub(a);
   
   for (J=NR-1;J>0;J--)
   {
	   addroundkey(a,w,J);

	   inmixcolumn(a);

	   inshiftrow(a);

	   inbytesub(a); 

   }

   addroundkey(a,w,0);
   
   return 0;
}

int main(int argc, int * argv[])//主函数
{   
	int i,j;
    word16 w[4][NB*(NR+1)];

	printf("初始明文:\n");
   for (i=0;i<4;i++)
	{
		for (j=0;j<NB;j++)
           printf("%3x",a[i][j]);
		printf("\n");
	}
	printf("所用密钥:\n");
   for (i=0;i<4;i++)
	{
		for (j=0;j<NK;j++)
           printf("%3x",k[i][j]);
		printf("\n");
	}

	encrypt(a,w);

//输出加密后的密文
	printf("加密后的密文:\n");
	for (i=0;i<4;i++)
	{
		for (j=0;j<NB;j++)
           printf("%3x",a[i][j]);
		printf("\n");
	}

	decrypt(a,w);    

   printf("解密后的明文:\n");
   for (i=0;i<4;i++)
	{
		for (j=0;j<NB;j++)
          printf("%3x",a[i][j]);
		printf("\n");
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -