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

📄 aes1.cpp

📁 这是一个关于AES加密的算法类库
💻 CPP
字号:
#include "aes.h"

//constructor
Caes::Caes()
{
	Nk=8;//4 6 8
	Nb=4;
	Nr=14;//10 12 14

//128bit key for test
//key=2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
/*
key[0]=0x2b;
key[1]=0x7e;
key[2]=0x15;
key[3]=0x16;
key[4]=0x28;
key[5]=0xae;
key[6]=0xd2;
key[7]=0xa6;
key[8]=0xab;
key[9]=0xf7;
key[10]=0x15;
key[11]=0x88;
key[12]=0x09;
key[13]=0xcf;
key[14]=0x4f;
key[15]=0x3c;
*/

//128bit key for test
//key=000102030405060708090a0b0c0d0e0f
/*
key[0]=0x00;
key[1]=0x01;
key[2]=0x02;
key[3]=0x03;
key[4]=0x04;
key[5]=0x05;
key[6]=0x06;
key[7]=0x07;
key[8]=0x08;
key[9]=0x09;
key[10]=0x0a;
key[11]=0x0b;
key[12]=0x0c;
key[13]=0x0d;
key[14]=0x0e;
key[15]=0x0f;
*/

/*
//192bit key for test
key[0]=0x8e;
key[1]=0x73;
key[2]=0xb0;
key[3]=0xf7;
key[4]=0xda;
key[5]=0x0e;
key[6]=0x64;
key[7]=0x52;
key[8]=0xc8;
key[9]=0x10;
key[10]=0xf3;
key[11]=0x2b;
key[12]=0x80;
key[13]=0x90;
key[14]=0x79;
key[15]=0xe5;
key[16]=0x62;
key[17]=0xf8;
key[18]=0xea;
key[19]=0xd2;
key[20]=0x52;
key[21]=0x2c;
key[22]=0x6b;
key[23]=0x7b;
*/

//256 bit key=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
key[0]=0x00;
key[1]=0x01;
key[2]=0x02;
key[3]=0x03;
key[4]=0x04;
key[5]=0x05;
key[6]=0x06;
key[7]=0x07;
key[8]=0x08;
key[9]=0x09;
key[10]=0x0a;
key[11]=0x0b;
key[12]=0x0c;
key[13]=0x0d;
key[14]=0x0e;
key[15]=0x0f;
key[16]=0x10;
key[17]=0x11;
key[18]=0x12;
key[19]=0x13;
key[20]=0x14;
key[21]=0x15;
key[22]=0x16;
key[23]=0x17;
key[24]=0x18;
key[25]=0x19;
key[26]=0x1a;
key[27]=0x1b;
key[28]=0x1c;
key[29]=0x1d;
key[30]=0x1e;
key[31]=0x1f;

//256bit key for test
/*
key[0]=0x60;
key[1]=0x3d;
key[2]=0xeb;
key[3]=0x10;
key[4]=0x15;
key[5]=0xca;
key[6]=0x71;
key[7]=0xbe;
key[8]=0x2b;
key[9]=0x73;
key[10]=0xae;
key[11]=0xf0;
key[12]=0x85;
key[13]=0x7d;
key[14]=0x77;
key[15]=0x81;
key[16]=0x1f;
key[17]=0x35;
key[18]=0x2c;
key[19]=0x07;
key[20]=0x3b;
key[21]=0x61;
key[22]=0x08;
key[23]=0xd7;
key[24]=0x2d;
key[25]=0x98;
key[26]=0x10;
key[27]=0xa3;
key[28]=0x09;
key[29]=0x14;
key[30]=0xdf;
key[31]=0xf4;
*/
//256bit key for test

//used for test mixColumn()
/*
key[0]=0xd4;
key[1]=0xbf;
key[2]=0x5d;
key[3]=0x30;
key[4]=0xe0;
key[5]=0xb4;
key[6]=0x52;
key[7]=0xae;
key[8]=0xb8;
key[9]=0x41;
key[10]=0x11;
key[11]=0xf1;
key[12]=0x1e;
key[13]=0x27;
key[14]=0x98;
key[15]=0xe5;
*/
//used for test mixColumn()

KeyExpansion();


//the array Rcon[]'s initialization
int i;
Rcon[1]=0x01000000;
for(i=2;i<8;i++)
	Rcon[i]=2*Rcon[i-1];
Rcon[8]=0x80000000;
Rcon[9]=0x1b000000;
Rcon[10]=0x36000000;
//Rcon[11]=0x000000;
// the array Rcon[]'s initialization
}

Caes::Caes(int Nk, int Nb, BYTE* inkey)
{

int i;

//the array Rcon[]'s initialization
Rcon[1]=0x01000000;
for(i=2;i<8;i++)
	Rcon[i]=2*Rcon[i-1];
Rcon[8]=0x80000000;
Rcon[9]=0x1b000000;
Rcon[10]=0x36000000;
//the array Rcon[]'s initialization

Caes::Nk=Nk;
Caes::Nb=Nb;

if(Caes::Nk==4)  Caes::Nr=10;
if(Caes::Nk==6)  Caes::Nr=12;
if(Caes::Nk==8)  Caes::Nr=14;

int j;
for(j=0; j<4*Nk; j++)
	key[j]=*(inkey+j);

KeyExpansion();

}

BYTE Caes::add(BYTE x, BYTE y)
{
return x^y;
}

WORD Caes::add(WORD x, WORD y)
{
	return x^y;
}

BYTE Caes::multiply(BYTE x, BYTE y)
{
	int i;
	WORD z=0,w;
	w=(WORD)x;

	for(i=0;i<8;i++)
	{
		if(y&0x01)
			z=z^w;
		w=w<<1;
		y=y>>1;
	}

	WORD m=283;//the irreducible polynomial
//	BYTE q=0;//quotion

	m=m<<7;

	for(i=0;i<8;i++)
	{
		if((z>>(15-i))&0x01)
		{
			z=z^m;
//			q=q|0x01;
		}
//		q=q<<1;
		m=m>>1;
	}
	
	return (BYTE)z;
}

WORD Caes::multiply(WORD x, WORD y)
{
	int i;
	DWORD z=0,w;
	w=(DWORD)x;

//求x*y
	for(i=0;i<16;i++)
	{
		if(y&0x0001)
			z=z^w;
		w=w<<1;
		y=y>>1;
	}
/*
//求 x*y mod m
	DWORD m=283;//the irreducible polynomial
//	WORD q=0;//quotion

	m=m<<23;

	for(i=0;i<24;i++)
	{
		if((z>>(31-i))&0x0001)
		{
			z=z^m;
//			q=q|0x01;
		}
//		q=q<<1;
		m=m>>1;
	}
*/	
	if(z>=0x10000)
		z=z^0x11b ;

	return (WORD)z;
}

BYTE Caes::div(BYTE x, BYTE y)
{
	if(x<y) return 0;
	
	BYTE q=0;
	int m=0,n=0,k;
	while((x&0x80)==0)
	{
		m++;
		x=x<<1;
	}
	while((y&0x80)==0)
	{
		n++;
		y=y<<1;
	}

	k=n-m;

	for(;k>=0;k--)
	{
		q=q<<1;
		if((x&0x80)!=0)
		{
			q=q|0x01;
			x=x^y;
		}

		x=x<<1;
	}
	
return q;
}

WORD Caes::div(WORD x, WORD y)
{
	if(x<y) return 0;
	
	WORD q=0;
	int m=0,n=0,k;
	while((x&0x8000)==0)
	{
		m++;
		x=x<<1;
	}
	while((y&0x8000)==0)
	{
		n++;
		y=y<<1;
	}

	k=n-m;

	for(;k>=0;k--)
	{
		q=q<<1;
		if((x&0x8000)!=0)
		{
			q=q|0x01;
			x=x^y;
		}

		x=x<<1;
	}
	
return q;
}

void Caes::Update(WORD *un, WORD *vn, WORD q)
{ 
	WORD tn;

	tn = add(*un,multiply(*vn , q));
	*un= *vn;
	*vn = tn;
}

void Caes::eEuclid(BYTE *u)
{
//u is a byte data, so it must be smaller than 283;
	WORD u1 = 1;
	WORD u3 = 283;
	WORD v1 = 0;
	WORD v3 = (WORD)(*u);
	WORD q;

	if(*u==0) return;

	while (v3>0) 
	{
		q = div(u3 , v3);
		Update(&u1, &v1, q);
		Update(&u3, &v3, q);
	}

	v1=div(add(u3 ,multiply(u1 , (WORD)283)) ,(WORD)*u);

//v1 mod 283
	int i;
	u3<<=7;
	for(i=0;i<8;i++)
	{
		if((v1<<i)&0x8000)
			v1^=u3;
		u3>>=1;
	}

	*u=(BYTE)v1;

}

void Caes::subByte(BYTE *u)
	{
		BYTE w,v;
		int i;
		//*u's inverse
		eEuclid(u);

		v=0x63;

//the highest(即7) bit of the byte;
		w=*u;
		w&=0xf8;//
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x80;//
			w>>=1;
		}

		
//6 bit of the byte 
		w=*u;
		w&=0x7c;//
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x40;//
			w>>=1;
		}


//5 bit
		w=*u;
		w&=0x3e;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x20;
			w>>=1;
		}

//4 bit
		w=*u;
		w&=0x1f;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x10;
			w>>=1;
		}

// 3 bit
		w=*u;
		w&=0x8f;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x08;
			w>>=1;
		}


//2 bit
		w=*u;
		w&=0xc7;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x04;
			w>>=1;
		}

//1 bit
		w=*u;
		w&=0xe3;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x02;
			w>>=1;
		}

//0 bit
		w=*u;
		w&=0xf1;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x01;
			w>>=1;
		}


		(*u)=v;

	}

void Caes::invSubByte(BYTE *u)
	{
		BYTE w,v;
		int i;

		v=0x00;
		(*u)^=0x63;

//the highest(即7) bit of the byte;
		w=*u;
		w&=0x52;//
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x80;//
			w>>=1;
		}

		
//6 bit of the byte 
		w=*u;
		w&=0x29;//
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x40;//
			w>>=1;
		}


//5 bit
		w=*u;
		w&=0x94;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x20;
			w>>=1;
		}

//4 bit
		w=*u;
		w&=0x4a;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x10;
			w>>=1;
		}

// 3 bit
		w=*u;
		w&=0x25;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x08;
			w>>=1;
		}


//2 bit
		w=*u;
		w&=0x92;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x04;
			w>>=1;
		}

//1 bit
		w=*u;
		w&=0x49;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x02;
			w>>=1;
		}

//0 bit
		w=*u;
		w&=0xa4;
		for(i=0;i<8;i++)
		{
			if(w&0x01)
				v^=0x01;
			w>>=1;
		}


		(*u)=v;
		//*u's inverse
		eEuclid(u);

	}

void Caes::subDword(DWORD *u)
{
	BYTE *v=(BYTE*)u;
	subByte(v);
	subByte(v+1);
	subByte(v+2);
	subByte(v+3);
	return;

}

void Caes::rotDword(DWORD *u)
{
	*u=(((*u)&0xff000000)>>24)^(*u<<8);
}


void Caes::KeyExpansion()

{
	DWORD temp;
	int i;

	for(i=0; i<Nk; i++)
	{
		w[i]=0;
		w[i]^=key[4*i+0];
		w[i]<<=8;
		w[i]^=key[4*i+1];
		w[i]<<=8;
		w[i]^=key[4*i+2];
		w[i]<<=8;
		w[i]^=key[4*i+3];
	}

	for(i=Nk; i<Nb*(Nr+1); i++)
	{
		temp=w[i-1];
		if(i % Nk ==0)
		{
			rotDword(&temp);
			subDword(&temp);
			temp^=Rcon[i/Nk];
		}
		else if(Nk > 6 && i % Nk == 4)
			subDword(&temp);

		w[i]= w[i-Nk] ^ temp;
	}
	return;
}


/**************************************************************/
//加密运算
void Caes::shiftRows(BYTE *u)
{
	int i;
	//the first row

	//the second row
	for(i=0; i<Nb; i++)
		row[i]=*(u+ 4*i +1);
	*(u+ 4*(Nb-1) +1)=row[0];
	for(i=0; i<Nb-1; i++)
		*(u+ 4*i +1)=row[i+1];

	//the third row
	for(i=0; i<Nb; i++)
		row[i]=*(u+ 4*i +2);
	*(u+4*(Nb-2) +2)=row[0];
	*(u+4*(Nb-1) +2)=row[1];
	for(i=0; i<Nb-2; i++)
		*(u+4*i+ 2)=row[i+2];

	//the fourth row
	for(i=0; i<Nb; i++)
		row[i]=*(u+ 4*i +3);
	*(u +4*(Nb-3)+ 3)=row[0];
	*(u +4*(Nb-2)+ 3)=row[1];
	*(u +4*(Nb-1)+ 3)=row[2];

	for(i=0; i<Nb-3 ; i++)
		*(u+ 4*i +3)=row[i+3];


}

void Caes::mixColumns(BYTE *u)
{
	int i,j;
	for (i=0; i<Nb; i++)
	{
		for(j=0; j<4; j++)
			column[j]=*(u+4*i+j);
		*(u+4*i+0)=multiply(0x02 , column[0])^multiply(0x03 , column[1]) ^ column[2] ^ column[3];
		*(u+4*i+1)=column[0] ^ multiply(0x02, column[1]) ^ multiply(0x03 , column[2]) ^ column[3];
		*(u+4*i+2)=column[0] ^ column[1] ^ multiply(0x02, column[2]) ^ multiply(0x03 , column[3]);
		*(u+4*i+3)=multiply(0x03, column[0]) ^ column[1] ^ column[2] ^ multiply(0x02 , column[3]);
	}
}

void Caes::addRoundKey(BYTE *u, DWORD *ex)
{
	int i;
	BYTE *pByte=(BYTE*)ex;

	for(i=0; i < Nb; i++)
		{
			*(u+4*i)^=*(pByte+4*i+3);
			*(u+4*i+1)^=*(pByte+4*i+2);
			*(u+4*i+2)^=*(pByte+4*i+1);
			*(u+4*i+3)^=*(pByte+4*i+0);
		}

}

void Caes::Encipher(BYTE *data)
{
	int i,k;

	addRoundKey(data, w);

	for(i=1; i<=(Nr-1); i++)
	{
		for(k=0; k<Nb; k++)
			subDword((DWORD*)data+k);
		shiftRows(data);
		mixColumns(data);
		addRoundKey(data, w+i*Nb);
	}
	for(k=0; k<Nb; k++)
		subDword((DWORD*)data+k);
	shiftRows(data);
	addRoundKey(data, w+Nr*Nb);

}

/*************************************************************************/
//解密算法

void Caes::invShiftRows(BYTE *u)
{
		int i;
	//the first row

	//the second row
	for(i=0; i<Nb; i++)
		row[i]=*(u+ 4*i +1);
	*(u + 1)=row[Nb-1];
	for(i=1; i<Nb; i++)
		*(u+ 4*i +1)=row[i-1];

	//the third row
	for(i=0; i<Nb; i++)
		row[i]=*(u+ 4*i +2);
	*(u+4*(0) +2)=row[Nb-2];
	*(u+4*(1) +2)=row[Nb-1];
	for(i=2; i<Nb; i++)
		*(u+4*i+ 2)=row[i-2];

	//the fourth row
	for(i=0; i<Nb; i++)
		row[i]=*(u+ 4*i +3);
	*(u +4*(0)+ 3)=row[Nb-3];
	*(u +4*(1)+ 3)=row[Nb-2];
	*(u +4*(2)+ 3)=row[Nb-1];

	for(i=3; i<Nb ; i++)
		*(u+ 4*i +3)=row[i-3];



}

void Caes::invMixColumns(BYTE *u)
{
	int i,j;
	for (i=0; i<Nb; i++)
	{
		for(j=0; j<4; j++)
			column[j]=*(u+4*i+j);
		*(u+4*i+0)=multiply(0x0e , column[0])^multiply(0x0b , column[1]) ^ multiply(0x0d , column[2] )^ multiply(0x09 , column[3]);
		*(u+4*i+1)=multiply(0x09 , column[0])^multiply(0x0e , column[1]) ^ multiply(0x0b , column[2] )^ multiply(0x0d , column[3]);
		*(u+4*i+2)=multiply(0x0d , column[0])^multiply(0x09 , column[1]) ^ multiply(0x0e , column[2] )^ multiply(0x0b , column[3]);
		*(u+4*i+3)=multiply(0x0b , column[0])^multiply(0x0d , column[1]) ^ multiply(0x09 , column[2] )^ multiply(0x0e , column[3]);
	}
}

void Caes::Decipher(BYTE *data)
{
	int i,k;
	

	addRoundKey(data, w+Nr*Nb);

	for(i=(Nr-1); i>=1; i--)
	{
		invShiftRows(data);
		for(k=0; k<4*Nb; k++)
			invSubByte(data+k);
		addRoundKey(data, w+i*Nb);
		invMixColumns(data);
	}

	invShiftRows(data);
	for(k=0; k<4*Nb; k++)
		invSubByte(data+k);
	addRoundKey(data, w);

}

⌨️ 快捷键说明

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