📄 aes1.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 + -