📄 aesde.cpp
字号:
#include "AESDE.h"
int invsubbox[256]=
{
0x52, 0x09, 0x6a, 0xd5,0x30, 0x36, 0xa5,0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
0x7c, 0xe3, 0x39, 0x82,0x9b ,0x2f, 0xff,0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
0x54, 0x7b, 0x94, 0x32,0xa6 ,0xc2, 0x23,0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66,0x28 ,0xd9, 0x24,0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
0x72, 0xf8, 0xf6, 0x64,0x86 ,0x68, 0x98,0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
0x6c, 0x70, 0x48, 0x50,0xfd ,0xed, 0xb9,0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00,0x8c ,0xbc, 0xd3,0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
0xd0, 0x2c, 0x1e, 0x8f,0xca ,0x3f, 0x0f,0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
0x3a, 0x91, 0x11, 0x41,0x4f ,0x67, 0xdc,0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22,0xe7 ,0xad, 0x35,0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
0x47, 0xf1, 0x1a, 0x71,0x1d ,0x29, 0xc5,0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
0xfc, 0x56, 0x3e, 0x4b,0xc6 ,0xd2, 0x79,0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33,0x88 ,0x07, 0xc7,0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9,0x19 ,0xb5, 0x4a,0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xa0, 0xe0, 0x3b, 0x4d,0xae ,0x2a, 0xf5,0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e,0xba ,0x77, 0xd6,0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
};
int subbox[256]=
{
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
};
int invaroundkeys[12]=
{
0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80,
0x1b,0x36,0x6c,0x6c
};
int invmix[16]=
{
0x0e,0x0b,0x0d,0x09,
0x09,0x0e,0x0b,0x0d,
0x0d,0x09,0x0e,0x0b,
0x0b,0x0d,0x09,0x0e
};
int aroundkeytalbe[10+1][16];
int mixkey[4];
void invgetmixkey(int *qkey)
{
for(int i=0;i<4;i++)
mixkey[i]=qkey[(i+1)*4-1];
}
void invxor(int *p,int n)
{
for(int i=0;i<16;i++)
{
bitset<8> temp1(p[i]);
bitset<8> temp2(aroundkeytalbe[n][i]);
temp1^=temp2;
p[i]=temp1.to_ulong();
}
}
void invinvSbox(int *p,int n)
{
for(int i=0;i<n;i++)
p[i]=invsubbox[p[i]];
}
void invshift(int *p)
{
int n=4,temp;
for(int i=0;i<4;i++){
for(int k=0;k<i;k++){
for(int j=0;j<4-1;j++){
temp=p[(i+1)*n-j-1];
p[(i+1)*n-j-1]=p[(i+1)*n-j-1-1];
p[(i+1)*n-j-1-1]=temp;
}
}
}
}
void invmixcolum(int *p)
{
int *q,stack[4];
q=new int[4*4];
for(int k=0;k<4;k++){
for(int i=0;i<4;i++){
bitset<8> temp;
for(int j=0;j<4;j++){
bitset<8> bit(p[j*4+k]);
bitset<8> conf(0x1b);
bitset<8> self(p[j*4+k]);
for(int l=0;l<4;l++)
{
if(bit.test(7))
{
bit<<=1;
bit^=conf;
}
else
bit<<=1;
stack[l]=bit.to_ulong();
}
if(invmix[i*4+j]==0x09){
bitset<8> compute(stack[2]);
self^=compute;
temp^=self;
}
else if(invmix[i*4+j]==0x0b)
{
bitset<8> compute(stack[2]);
bitset<8> compute1(stack[0]);
compute^=compute1;
self^=compute;
temp^=self;
}
else if(invmix[i*4+j]==0x0d)
{
bitset<8> compute(stack[2]);
bitset<8> compute1(stack[1]);
compute^=compute1;
self^=compute;
temp^=self;
}
else
{
bitset<8> compute(stack[2]);
bitset<8> compute1(stack[1]);
bitset<8> compute2(stack[0]);
compute^=compute1;
compute^=compute2;
temp^=compute;
}
}
q[i*4+k]=temp.to_ulong();
}
}
for(int l=0;l<16;l++)
p[l]=q[l];
}
//----------------------------------------------------------------------------------------------
void invrotword(int *p)
{
int temp;
for(int i=0;i<4-1;i++){
temp=p[i];
p[i]=p[i+1];
p[i+1]=temp;
}
}
void invSboxs(int *p,int n)
{
for(int i=0;i<n;i++)
p[i]=subbox[p[i]];
}
void invxorrcon(int *p,int around)
{
bitset<8> bit(invaroundkeys[around]);
bitset<8> temp(p[0]);
temp^=bit;
p[0]=temp.to_ulong();
}
void invupdatekey(int *p)
{
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
bitset<8> temp1(p[i+j*4]);
bitset<8> temp2(mixkey[j]);
temp1^=temp2;
mixkey[j]=temp1.to_ulong();
p[i+j*4]=temp1.to_ulong();
}
}
}
void invcopy(int n,int *key){
for(int i=0;i<16;i++)
aroundkeytalbe[n][i]=key[i];
}
void invcreatearoundkeytable(int *key){
for(int i=0;i<11;i++){
invcopy(i,key);
invgetmixkey(key);
invrotword(mixkey);
invSboxs(mixkey,4);
invxorrcon(mixkey,i);
invupdatekey(key);
}
}
/*
void p(){
for(int i=0;i<11;i++){
for(int j=0;j<16;j++){
cout<<setbase(16)<<aroundkeytalbe[i][j]<<" ";
// printf("%3d ",aroundkeytalbe[i][j]);
if((j+1)%4==0)
cout<<"\n";
}
cout<<"\n";
}
}
*/
void invstart(int *input,int *key){
invcreatearoundkeytable(key);
invxor(input,10);
// print(input,16,"Xor");
invshift(input);
// print(input,16,"shift");
invinvSbox(input,16);
// print(input,16,"Sbox");
int i;
for(i=9;i>0;i--){
// cout<<i<<"\n";
invxor(input,i);
// print(input,16,"Xor");
invmixcolum(input);
// print(input,16,"mixcolum");
invshift(input);
// print(input,16,"shift");
invinvSbox(input,16);
// print(input,16,"Sbox");
}
invxor(input,i);
// print(input,16,"Xor");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -