Chinaunix首页 | 论坛 | 博客
  • 博客访问: 274366
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 878
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-25 23:20
文章分类

全部博文(81)

文章存档

2017年(45)

2016年(20)

2015年(2)

2014年(14)

我的朋友

分类: C#/.net

2017-01-29 21:02:26

256位密钥加密传输文本。

encodeAESstr.cpp

// encodeAESstr.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "encodeAESstr.h" #include  #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; using namespace std; //编码表 const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned char Tmp1,Tmp2,Tmp3; string strEncode; int LineLength=0; long n=0; byte tmpRotWord[4]; byte tmpSubWord[4]; void set1st(unsigned char c) { Tmp1 = c; } void set2nd(unsigned char c) { Tmp2 = c; } void set3rd(unsigned char c) { Tmp3 = c; strEncode+= EncodeTable[Tmp1 >> 2]; strEncode+= EncodeTable[((Tmp1 << 4) | (Tmp2 >> 4)) & 0x3F]; strEncode+= EncodeTable[((Tmp2 << 2) | (Tmp3 >> 6)) & 0x3F]; strEncode+= EncodeTable[Tmp3 & 0x3F]; if(LineLength+=4,LineLength==76) { strEncode+="\r\n"; LineLength=0; } } void (*base64_func[])(unsigned char c)={ set1st,set2nd,set3rd }; long counter=0; unsigned char srcBytes[16]; unsigned char szLast16Bits[16]; unsigned char szCiphertextInBytes[16]; #define Bits128 16 #define Bits192 24 #define Bits256 32 static unsigned char AesSbox[16*16]= {// populate the Sbox matrix  /* 0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f */ /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; static unsigned char AesiSbox[16*16]= { // populate the iSbox matrix  /* 0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f */ /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; static unsigned char AesRcon[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 }; unsigned char State[4][4]; void Cipher(unsigned char* input, unsigned char* output); // encipher 16-bit input  void InvCipher(unsigned char* input, unsigned char* output); // decipher 16-bit input  int Nb; // block size in 32-bit words.  Always 4 for AES.  (128 bits).  int Nk; // key size in 32-bit words.  4, 6, 8.  (128, 192, 256 bits).  int Nr; // number of rounds. 10, 12, 14.  unsigned char key[32]; unsigned char w[16*15]; void SetNbNkNr(int keySize) { Nb=4; if(keySize=Bits128) { Nk=4; //4*4字节,128位密钥,10轮加密  Nr=10; } else if(keySize=Bits192) { Nk=6; //6*4字节,192位密钥,12轮加密  Nr=12; } else if(keySize=Bits256) { Nk=8; //8*4字节,256位密钥,14轮加密  Nr=14; } } ////////////////////////////////////////////////////////////////////////////////////////////////  //密钥移位函数  void RotWord(unsigned char word[]) { tmpRotWord[0] = word[1]; tmpRotWord[1] = word[2]; tmpRotWord[2] = word[3]; tmpRotWord[3] = word[0]; } ////////////////////////////////////////////////////////////////////////////////////////////////  //密钥字代换函数  void SubWord(unsigned char word[]) { for(int j=0;j<4;j++) tmpSubWord[j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等  } ////////////////////////////////////////////////////////////////////////////////////////////////  void KeyExpansion() { int row; memset(w,0,16*15); for(row=0;row<Nk;row++) //拷贝seed 密钥  { w[4*row+0] = key[4*row]; w[4*row+1] = key[4*row+1]; w[4*row+2] = key[4*row+2]; w[4*row+3] = key[4*row+3]; } unsigned char temp[4]; for(row=Nk;row<4*(Nr+1);row++) { temp[0]=w[4*row-4]; //当前列的前一列  temp[1]=w[4*row-3]; temp[2]=w[4*row-2]; temp[3]=w[4*row-1]; if(row%Nk==0) //逢nk时,对当前列的前一列作特殊处理  { RotWord(temp); SubWord(tmpRotWord); //先移位,再代换,最后和轮常量异或 temp[0] = (byte)( (int)tmpSubWord[0] ^ (int) AesRcon[4*(row/Nk)+0] ); temp[1] = (byte)( (int)tmpSubWord[1] ^ (int) AesRcon[4*(row/Nk)+1] ); temp[2] = (byte)( (int)tmpSubWord[2] ^ (int) AesRcon[4*(row/Nk)+2] ); temp[3] = (byte)( (int)tmpSubWord[3] ^ (int) AesRcon[4*(row/Nk)+3] ); } else if ( Nk > 6 && (row % Nk == 4) ) //这个还没有搞清楚  { SubWord(temp); temp[0]=tmpSubWord[0]; temp[1]=tmpSubWord[1]; temp[2]=tmpSubWord[2]; temp[3]=tmpSubWord[3]; } // w[row] = w[row-Nk] xor temp  w[4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] ); w[4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] ); w[4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] ); w[4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] ); } // for loop } ////////////////////////////////////////////////////////////////////////////////////////////////  //轮密钥加  void AddRoundKey(int round) { int i,j; //i行 j列           //因为密钥w是一列一列排列的,即 k0 k4 k8 k12  for(j=0;j<4;j++) //                              k1 k5 k9 k13  { //                              k2 k6 k10k14  for(i=0;i<4;i++) //                              k3 k7 k11k15  { // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i  State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]); } } } ////////////////////////////////////////////////////////////////////////////////////////////////  //字节代换函数  void SubBytes() //Page 103  { int i,j; for(j=0;j<4;j++) { for(i=0;i<4;i++) { State[i][j]=AesSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]  } } } ////////////////////////////////////////////////////////////////////////////////////////////////  void ShiftRows() { unsigned char temp[4*4]; //Page105  int i,j; for(j=0;j<4;j++) { for(i=0;i<4;i++) { temp[4*i+j]=State[i][j]; } } for(i=1;i<4;i++) { for(j=0;j<4;j++) { if(i==1)State[i][j]=temp[4*i+(j+1)%4]; //第一行左移1位  else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行左移2位  else if(i==3)State[i][j]=temp[4*i+(j+3)%4]; //第三行左移3位  } } } ////////////////////////////////////////////////////////////////////////////////////////////////  unsigned char gfmultby01(unsigned char b) { return b; } unsigned char gfmultby02(unsigned char b) { if (b < 0x80) return (unsigned char)(int)(b <<1); else return (unsigned char)( (int)(b << 1) ^ (int)(0x1b) ); } unsigned char gfmultby03(unsigned char b) { return (unsigned char) ( (int)gfmultby02(b) ^ (int)b ); } unsigned char gfmultby09(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b ); } unsigned char gfmultby0b(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)gfmultby02(b) ^ (int)b ); } unsigned char gfmultby0d(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)gfmultby02(gfmultby02(b)) ^ (int)(b) ); } unsigned char gfmultby0e(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) ); } ////////////////////////////////////////////////////////////////////////////////////////////////  void MixColumns() { unsigned char temp[4*4]; int i,j; for(j=0;j<4;j++) //2 3 1 1  列混淆矩阵  Page107  { //1 2 3 1  for(i=0;i<4;i++) //1 1 2 3  { //3 1 1 2  temp[4*i+j]=State[i][j]; } } for(j=0;j<4;j++) { State[0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^ (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); State[1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^ (int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); State[2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ (int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) ); State[3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) ); } } ////////////////////////////////////////////////////////////////////////////////////////////////  //Aes加密函数  void Cipher(unsigned char* input, unsigned char* output) { int i; memset(&State[0][0],0,16); for(i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的进来的  State[i%4][i/4]=input[i]; //换成先写行后写列也是可以的,只要在输出时也是这样就可以了  AddRoundKey(0); //轮密钥加  for (int round = 1; round <= (Nr - 1); round++) // main round loop  { SubBytes(); //字节代换  ShiftRows(); //行移位  MixColumns(); //列混淆  AddRoundKey(round); //轮密钥加  } // main round loop  SubBytes(); //字节代换  ShiftRows(); //行移位  AddRoundKey(Nr); //轮密钥加  // output = state  for (i = 0; i < (4 * Nb); i++) output[i] = State[i % 4][ i / 4]; } void InvShiftRows() { unsigned char temp[4*4]; int i,j; for(j=0;j<4;j++) for(i=0;i<4;i++) temp[4*i+j]=State[i][j]; for(i=1;i<4;i++) { for(j=0;j<4;j++) { //if(i==1)State[i][j]=temp[4*i+(j-1)%4];    在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法  if(i==1)State[i][j]=temp[4*i+(j+3)%4]; //第一行右移1位 j-1+4=j+3  else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行右移2位 j-2+4=j+2  else if(i==3)State[i][j]=temp[4*i+(j+1)%4]; //第三行右移3位 j-3+4=j+2  } }  void InvSubBytes() { int i,j; for(j=0;j<4;j++) for(i=0;i<4;i++) State[i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]  } void InvMixColumns() { unsigned char temp[4*4]; int i,j; for (i = 0; i < 4; i++) // copy State into temp[]  { for (j = 0; j < 4; j++) //0e 0b 0d 09   逆变换矩阵 Page108  { //09 0e 0b 0d  temp[4*i+j] = State[i][j]; //0d 09 0e 0b  } //0b 0d 09 0e  } for (j = 0; j < 4; j++) { State[0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^ (int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) ); State[1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^ (int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) ); State[2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^ (int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) ); State[3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^ (int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) ); } } ////////////////////////////////////////////////////////////////////////////////////////////////  //Aes解密函数  void InvCipher(unsigned char* input,unsigned char* output) { int i; memset(&State[0][0],0,16); for (i = 0; i < (4 * Nb); i++) State[i % 4][ i / 4] = input[i]; AddRoundKey(Nr); for (int round = Nr-1; round >= 1; round--) // main round loop  { InvShiftRows(); InvSubBytes(); AddRoundKey(round); InvMixColumns(); } // end main round loop for InvCipher  InvShiftRows(); InvSubBytes(); AddRoundKey(0); // output = state  for (i = 0; i < (4 * Nb); i++) output[i] = State[i % 4][ i / 4]; } void aes_deal(int idx,char c) { srcBytes[15]=c; memcpy(szLast16Bits,srcBytes,16); Cipher((unsigned char*)szLast16Bits,(unsigned char*)szCiphertextInBytes); for(int i=0;i<16;i++) base64_func[(n++)%3](szCiphertextInBytes[i]); } void aes_store(int idx,char c) { srcBytes[idx]=c; } void (*aes_func[])(int idx,char c)={ aes_store,aes_deal }; void aes_adpter(char c) { int idx=(counter++)%16; aes_func[counter%16==0](idx,c); } BYTE m_MaxBits = 9; int m_TotalBits = 0; DWORD m_SavedData = 0; struct dicElement { DWORD   m_Prefix; //  keep the prefix of the element BYTE    m_Letter; //  keep the letter of the element dicElement() { m_Prefix = 0; m_Letter = 0; } }; void GetBytesFromCode(CPtrArray *m_dictionary,CByteArray *Buffer, DWORD code) { //  Fill an array with bytes using the code for retrieving  //  those bytes from the dictionary elements //  Since we dont have 0-255 in the dictionary we have to make  //  sure, that if we get below 256 we stop (but still add that code) //  Every code higher then 255, will have a letter attached to it, //  which we use for getting the string back. while (code > 255) { dicElement *tmpEl = (dicElement*)m_dictionary->GetAt(code - 256); Buffer->Add(tmpEl->m_Letter); code = tmpEl->m_Prefix; } Buffer->Add((BYTE)code); } void CompressData(DWORD toSave) { //  Move the data you want to write few bits to the left //  and combine it with the already existing data in the buffer m_SavedData |= toSave << (32 - m_MaxBits - m_TotalBits); //  Add the new added number of bits to the total bits counter m_TotalBits += m_MaxBits; //  Check if it's possible to enter the data to the file //  (over and equal a byte of data) while (m_TotalBits >= 8) { //  Get the byte we want to write DWORD writeData = m_SavedData; writeData >>= 24; aes_adpter(writeData); //  remove the byte from the buffer m_SavedData <<= 8; //  Remove the byte from the counter m_TotalBits -= 8; } } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL)) //CF_UNICODETEXT { HGLOBAL hMem = GetClipboardData(CF_TEXT); if (hMem != NULL) { LPTSTR lpStr = (LPTSTR)GlobalLock(hMem); if (lpStr != NULL) GlobalUnlock(hMem); //加密操作  unsigned char* keyBytes=(unsigned char*)"12345678123456781234567812345678"; SetNbNkNr(32); //设置密钥块数,轮数  memcpy(key,keyBytes,32); //字符串拷贝函数,把keyBytes的keysize个字符复制到key中  KeyExpansion(); //密钥扩展,必须提前做的初始化 DWORD m_MaxCode[32]={0,0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF,0x1FFF,0x3FFF,0x7FFF,0xFFFF,0x1FFFF,0x3FFFF,0x7FFFF,0xFFFFF,0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF,0x1FFFFFF,0x3FFFFFF,0x7FFFFFF,0xFFFFFFF,0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF}; CPtrArray *m_dictionary= new CPtrArray; long result = 0; BYTE readByte = 0; CString logString; DWORD resAdd = 256; //  Get the total file size DWORD prefix=*lpStr++; //  Go over the rest of the file and read it while (readByte=*lpStr++) { //  Check if the prefix and readByte combination exist in the dictionary //  Returns the code of an element from the dictionary //  by searching for the prefix and letter assosiated with //  that element code. //  Returns -1 if no entry was found int total = m_dictionary->GetSize(); dicElement *temp = NULL; for (int counter = 0; counter < total; counter++) { temp = (dicElement*)m_dictionary->GetAt(counter); if ((temp->m_Prefix == prefix) && (temp->m_Letter == readByte)) break; temp = NULL; } if (temp != NULL) result =counter + 256; else result =-1; //  If not exist if (result == -1) { //  Add the new combination //  Add a dictionary element. //  Since the dictionary should already have all the values //  between 0-255, we start it from 256. dicElement *temp = new dicElement; temp->m_Prefix = prefix; temp->m_Letter = readByte; m_dictionary->Add(temp); resAdd = m_dictionary->GetSize() + 255; //  Calculate the new bit size needed to encode the file //  Check the value of the parameter against the Maximum number possible //  and then returns the counter //  This can also be acheived by right shifting the value until we get 0 //  and counting the number of times we doing it. for (BYTE counter = 0; counter < 32; counter++) if (resAdd <= m_MaxCode[counter]) break; m_MaxBits = counter; //  Since the minimal number of bits we are using is 9 (256 is the begining of the dictionary),  //  then the minimal number of bits is check to return a 9 in case a lower value will be //  reached in the application if (m_MaxBits < 9) m_MaxBits = 9; //  Send the prefix for compression in to the destination file CompressData(prefix); //  Set the prefix as the readByte prefix = readByte; //  Initiate the result result = -1; delete temp; } else { //  Set the prefix as the result prefix = result; readByte = 0; } } //  Insert to the file the maximum number of bit (for signaling the end of the //  compression\decompression) CompressData(prefix); CompressData(m_MaxCode[m_MaxBits]); //  Flash the rest of the file with 0 CompressData(0); int iParts=0,iResidue=0,i=0; unsigned char szLast16Bits[16] = {0}; if(counter<16) { unsigned char _temp16bytes[16] = {0}; memcpy(_temp16bytes,srcBytes,counter); Cipher(_temp16bytes,szCiphertextInBytes); for(int i=0;i<16;i++) base64_func[(n++)%3](szCiphertextInBytes[i]); } else if(counter>16) { iResidue = counter % 16; if(iResidue>0) for(int i=0;i<iResidue;i++) base64_func[(n++)%3](srcBytes[i]); } switch(n % 3) { case 1: strEncode+= EncodeTable[(Tmp1 & 0xFC) >> 2]; strEncode+= EncodeTable[((Tmp1 & 0x03) << 4)]; strEncode+= "=="; break; case 2: strEncode+= EncodeTable[(Tmp1 & 0xFC) >> 2]; strEncode+= EncodeTable[((Tmp1 & 0x03) << 4) | ((Tmp2 & 0xF0) >> 4)]; strEncode+= EncodeTable[((Tmp2 & 0x0F) << 2)]; strEncode+= "="; break; } //  Remove the existing dictionary delete m_dictionary; char *pMem; hMem = GlobalAlloc( GHND | GMEM_DDESHARE, strEncode.length()+1); if(hMem) { pMem = (char*)GlobalLock(hMem); strcpy(pMem,strEncode.c_str()); GlobalUnlock(hMem); EmptyClipboard(); SetClipboardData(CF_TEXT,hMem); } CloseClipboard(); } } } return nRetCode; }

decodeAESstr.cpp

// decodeAESstr.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "decodeAESstr.h" #include  #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; using namespace std; DWORD m_MaxCode[32]={0,0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF,0x1FFF,0x3FFF,0x7FFF,0xFFFF,0x1FFFF,0x3FFFF,0x7FFFF,0xFFFFF,0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF,0x1FFFFFF,0x3FFFFFF,0x7FFFFFF,0xFFFFFFF,0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF}; BYTE m_MaxBits= 9; int m_TotalBits= 0; DWORD m_SavedData= 0; DWORD data = 0; CByteArray decodeString; BYTE writeData = 0, character = 0; long counter=0; long count=0; unsigned char srcBytes[32]; unsigned char szLast16Bits[32]; unsigned char szPlaintextInBytes[32]; //  Get the first prefix information DWORD prefix; BYTE readByte; int idx=0; CPtrArray *m_dictionary; string strDecode; void decompress_adpter(BYTE b); byte tmpRotWord[4]; byte tmpSubWord[4]; struct dicElement { DWORD   m_Prefix; //  keep the prefix of the element BYTE    m_Letter; //  keep the letter of the element dicElement() { m_Prefix = 0; m_Letter = 0; } }; void GetBytesFromCode(CPtrArray *m_dictionary,CByteArray *Buffer, DWORD code) { //  Fill an array with bytes using the code for retrieving  //  those bytes from the dictionary elements //  Since we dont have 0-255 in the dictionary we have to make  //  sure, that if we get below 256 we stop (but still add that code) //  Every code higher then 255, will have a letter attached to it, //  which we use for getting the string back. dicElement *tmpEl = NULL; while (code > 255) { tmpEl = (dicElement*)m_dictionary->GetAt(code - 256); Buffer->Add(tmpEl->m_Letter); code = tmpEl->m_Prefix; } Buffer->Add((BYTE)code); } void getbyte(BYTE b) { //  Add the byte to the read buffer m_SavedData |= (DWORD) b << (24 - m_TotalBits); //  Add byte to the bit counter m_TotalBits += 8; } void initial(BYTE b) { idx=1; //  calculate the return information prefix = m_SavedData >> (32 - m_MaxBits); //  Remove the returned information from the buffer m_SavedData <<= m_MaxBits; //  Remove the return information bit size from the bit counter m_TotalBits -= m_MaxBits; //  Save the prefix as the last used character (since we're writing it in the //  destination file) character = (BYTE)prefix; //  Write the prefix in the destination file (the first byte inside //  a LZW copressed file is always the first byte of the original file) strDecode+=prefix; decompress_adpter(b); } void rest2(BYTE b) { //  calculate the return information data = m_SavedData >> (32 - m_MaxBits); //  Remove the returned information from the buffer m_SavedData <<= m_MaxBits; //  Remove the return information bit size from the bit counter m_TotalBits -= m_MaxBits; if (data != m_MaxCode[m_MaxBits]) { //  Check if the code exist in the dictionary //  if not //  Check if the code exist in the dictionary //  Returns TRUE if so, and FALSE if not. //  If the code is lower then 256, then the element is a normal //  ASCII character, and as such is considered to be in the //  dictionay. if (data >= 256 && data - 256 >= (unsigned)m_dictionary->GetSize()) { //  Get the last used character into the decod buffer decodeString.Add((BYTE)character); //  Decode the existing prefix into a known string of data GetBytesFromCode(m_dictionary,&decodeString, prefix); } else { //  Decode the data into the decode buffer GetBytesFromCode(m_dictionary,&decodeString, data); //  Get the last letter inside the data, as the last used letter character = decodeString.GetAt(decodeString.GetSize() - 1); } //  Go over the decode buffer, from the end to the start, //  and write the information into the destination file counter = decodeString.GetSize(); while (counter > 0) { writeData = (BYTE)decodeString.GetAt(--counter); strDecode+=writeData; //  To show a log in the view } //  Clear the decode buffer decodeString.RemoveAll(); //  Add the new combination into the dictionary //  Add a dictionary element. //  Since the dictionary should already have all the values //  between 0-255, we start it from 256. dicElement *tmp = new dicElement; tmp->m_Prefix = prefix; tmp->m_Letter = (BYTE)character; m_dictionary->Add(tmp); //  Calculate the new buffer size to read now DWORD value=m_dictionary->GetSize() + 257; //  Check the value of the parameter against the Maximum number possible //  and then returns the counter //  This can also be acheived by right shifting the value until we get 0 //  and counting the number of times we doing it. for (BYTE counter = 0; counter < 32; counter++) if (value <= m_MaxCode[counter]) break; m_MaxBits = counter; //  Since the minimal number of bits we are using is 9 (256 is the begining of the dictionary),  //  then the minimal number of bits is check to return a 9 in case a lower value will be //  reached in the application if (m_MaxBits < 9) m_MaxBits = 9; //  Set the new prefix to use prefix = data; delete tmp; } } void (*rest_func[])(BYTE b)={ getbyte,rest2 }; void rest(BYTE b) { rest_func[m_TotalBits > 24](b); decompress_adpter(b); } void (*getrestbytes[])(BYTE b)={ initial,rest }; void getotherbytes(BYTE b) { getrestbytes[idx](b); } void (*decompress_func[])(BYTE b)={ getbyte,getotherbytes }; void decompress_adpter(BYTE b) { decompress_func[m_TotalBits > 24](b); } #define Bits128 16 #define Bits192 24 #define Bits256 32 static unsigned char AesSbox[16*16]= {// populate the Sbox matrix  /* 0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f */ /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; static unsigned char AesiSbox[16*16]= { // populate the iSbox matrix  /* 0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f */ /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; static unsigned char AesRcon[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 }; unsigned char State[4][4]; void InvCipher(unsigned char* input, unsigned char* output); // decipher 16-bit input  int Nb; // block size in 32-bit words.  Always 4 for AES.  (128 bits).  int Nk; // key size in 32-bit words.  4, 6, 8.  (128, 192, 256 bits).  int Nr; // number of rounds. 10, 12, 14.  unsigned char key[32]; unsigned char w[16*15]; void SetNbNkNr(int keySize) { Nb=4; if(keySize=Bits128) { Nk=4; //4*4字节,128位密钥,10轮加密  Nr=10; } else if(keySize=Bits192) { Nk=6; //6*4字节,192位密钥,12轮加密  Nr=12; } else if(keySize=Bits256) { Nk=8; //8*4字节,256位密钥,14轮加密  Nr=14; } } ////////////////////////////////////////////////////////////////////////////////////////////////  //密钥移位函数  void RotWord(unsigned char word[]) { tmpRotWord[0] = word[1]; tmpRotWord[1] = word[2]; tmpRotWord[2] = word[3]; tmpRotWord[3] = word[0]; } ////////////////////////////////////////////////////////////////////////////////////////////////  //密钥字代换函数  void SubWord(unsigned char word[]) { for(int j=0;j<4;j++) tmpSubWord[j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等  } ////////////////////////////////////////////////////////////////////////////////////////////////  void KeyExpansion() { int row; memset(w,0,16*15); for(row=0;row<Nk;row++) //拷贝seed 密钥  { w[4*row+0] = key[4*row]; w[4*row+1] = key[4*row+1]; w[4*row+2] = key[4*row+2]; w[4*row+3] = key[4*row+3]; } unsigned char temp[4]; for(row=Nk;row<4*(Nr+1);row++) { temp[0]=w[4*row-4]; //当前列的前一列  temp[1]=w[4*row-3]; temp[2]=w[4*row-2]; temp[3]=w[4*row-1]; if(row%Nk==0) //逢nk时,对当前列的前一列作特殊处理  { RotWord(temp); SubWord(tmpRotWord); //先移位,再代换,最后和轮常量异或 temp[0] = (byte)( (int)tmpSubWord[0] ^ (int) AesRcon[4*(row/Nk)+0] ); temp[1] = (byte)( (int)tmpSubWord[1] ^ (int) AesRcon[4*(row/Nk)+1] ); temp[2] = (byte)( (int)tmpSubWord[2] ^ (int) AesRcon[4*(row/Nk)+2] ); temp[3] = (byte)( (int)tmpSubWord[3] ^ (int) AesRcon[4*(row/Nk)+3] ); } else if ( Nk > 6 && (row % Nk == 4) ) //这个还没有搞清楚  { SubWord(temp); temp[0]=tmpSubWord[0]; temp[1]=tmpSubWord[1]; temp[2]=tmpSubWord[2]; temp[3]=tmpSubWord[3]; } // w[row] = w[row-Nk] xor temp  w[4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] ); w[4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] ); w[4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] ); w[4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] ); } // for loop } ////////////////////////////////////////////////////////////////////////////////////////////////  //轮密钥加  void AddRoundKey(int round) { int i,j; //i行 j列           //因为密钥w是一列一列排列的,即 k0 k4 k8 k12  for(j=0;j<4;j++) //                              k1 k5 k9 k13  { //                              k2 k6 k10k14  for(i=0;i<4;i++) //                              k3 k7 k11k15  { // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i  State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]); } } } ////////////////////////////////////////////////////////////////////////////////////////////////  //字节代换函数  void SubBytes() //Page 103  { int i,j; for(j=0;j<4;j++) for(i=0;i<4;i++) State[i][j]=AesSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]  } ////////////////////////////////////////////////////////////////////////////////////////////////  void ShiftRows() { unsigned char temp[4*4]; //Page105  int i,j; for(j=0;j<4;j++) for(i=0;i<4;i++) temp[4*i+j]=State[i][j]; for(i=1;i<4;i++) { for(j=0;j<4;j++) { if(i==1)State[i][j]=temp[4*i+(j+1)%4]; //第一行左移1位  else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行左移2位  else if(i==3)State[i][j]=temp[4*i+(j+3)%4]; //第三行左移3位  } } } ////////////////////////////////////////////////////////////////////////////////////////////////  unsigned char gfmultby01(unsigned char b) { return b; } unsigned char gfmultby02(unsigned char b) { if (b < 0x80) return (unsigned char)(int)(b <<1); else return (unsigned char)( (int)(b << 1) ^ (int)(0x1b) ); } unsigned char gfmultby03(unsigned char b) { return (unsigned char) ( (int)gfmultby02(b) ^ (int)b ); } unsigned char gfmultby09(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b ); } unsigned char gfmultby0b(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)gfmultby02(b) ^ (int)b ); } unsigned char gfmultby0d(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)gfmultby02(gfmultby02(b)) ^ (int)(b) ); } unsigned char gfmultby0e(unsigned char b) { return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) ); } ////////////////////////////////////////////////////////////////////////////////////////////////  void MixColumns() { unsigned char temp[4*4]; int i,j; for(j=0;j<4;j++) //2 3 1 1  列混淆矩阵  Page107  { //1 2 3 1  for(i=0;i<4;i++) //1 1 2 3  { //3 1 1 2  temp[4*i+j]=State[i][j]; } } for(j=0;j<4;j++) { State[0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^ (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); State[1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^ (int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); State[2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ (int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) ); State[3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) ); } } void InvShiftRows() { unsigned char temp[4*4]; int i,j; for(j=0;j<4;j++) for(i=0;i<4;i++) temp[4*i+j]=State[i][j]; for(i=1;i<4;i++) { for(j=0;j<4;j++) { //if(i==1)State[i][j]=temp[4*i+(j-1)%4];    在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法  if(i==1)State[i][j]=temp[4*i+(j+3)%4]; //第一行右移1位 j-1+4=j+3  else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行右移2位 j-2+4=j+2  else if(i==3)State[i][j]=temp[4*i+(j+1)%4]; //第三行右移3位 j-3+4=j+2  } } } void InvSubBytes() { int i,j; for(j=0;j<4;j++) for(i=0;i<4;i++) State[i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]  } void InvMixColumns() { unsigned char temp[4*4]; int i,j; for (i = 0; i < 4; i++) // copy State into temp[]  { for (j = 0; j < 4; j++) //0e 0b 0d 09   逆变换矩阵 Page108  { //09 0e 0b 0d  temp[4*i+j] = State[i][j]; //0d 09 0e 0b  } //0b 0d 09 0e  } for (j = 0; j < 4; j++) { State[0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^ (int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) ); State[1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^ (int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) ); State[2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^ (int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) ); State[3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^ (int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) ); } } ////////////////////////////////////////////////////////////////////////////////////////////////  //Aes解密函数  void InvCipher(unsigned char* input,unsigned char* output) { int i; memset(&State[0][0],0,16); for (i = 0; i < (4 * Nb); i++) State[i % 4][ i / 4] = input[i]; AddRoundKey(Nr); for (int round = Nr-1; round >= 1; round--) // main round loop  { InvShiftRows(); InvSubBytes(); AddRoundKey(round); InvMixColumns(); } // end main round loop for InvCipher  InvShiftRows(); InvSubBytes(); AddRoundKey(0); // output = state  for (i = 0; i < (4 * Nb); i++) output[i] = State[i % 4][ i / 4]; } void inv_aes_deal(int idx,char c) { srcBytes[15]=c; memcpy(szLast16Bits,srcBytes,16); InvCipher((unsigned char*)szLast16Bits,(unsigned char*)szPlaintextInBytes); for(int ii=0;ii<16;ii++) decompress_adpter(szPlaintextInBytes[ii]); } void inv_aes_store(int idx,char c) { srcBytes[idx]=c; } void (*inv_aes_func[])(int idx,char c)={ inv_aes_store,inv_aes_deal }; void inv_aes_adpter(char c) { int idx=(count++)%16; inv_aes_func[count%16==0](idx,c); } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL)) //CF_UNICODETEXT { HGLOBAL hMem = GetClipboardData(CF_TEXT); if (hMem != NULL) { LPTSTR lpStr = (LPTSTR)GlobalLock(hMem); if (lpStr != NULL) GlobalUnlock(hMem); //解密操作  unsigned char* keyBytes=(unsigned char*)"12345678123456781234567812345678"; SetNbNkNr(32); //设置密钥块数,轮数  memcpy(key,keyBytes,32); //字符串拷贝函数,把keyBytes的keysize个字符复制到key中  KeyExpansion(); //密钥扩展,必须提前做的初始化  TCHAR* Data=lpStr; int DataByte=strlen(lpStr); m_dictionary= new CPtrArray; //解码表 TCHAR DecodeTable[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, // '+' 0, 0, 0, 63, // '/' 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9' 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z' 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z' }; int nValue; int i= 0; while (i < DataByte) { if (*Data != '\r' && *Data!='\n') { nValue = DecodeTable[*Data++] << 18; nValue += DecodeTable[*Data++] << 12; inv_aes_adpter((nValue & 0x00FF0000) >> 16); if (*Data != '=') { nValue += DecodeTable[*Data++] << 6; inv_aes_adpter((nValue & 0x0000FF00) >> 8); if (*Data != '=') { nValue += DecodeTable[*Data++]; inv_aes_adpter(nValue & 0x000000FF); } } i += 4; } else// 回车换行,跳过 { Data++; i++; } } unsigned char szLast16Bits[16] = {0}; unsigned char _temp16bytes[16] = {0}; if(count<16) { memcpy(_temp16bytes,srcBytes,count); InvCipher(_temp16bytes,szPlaintextInBytes); for(int ii=0;ii<count;ii++) decompress_adpter(szPlaintextInBytes[ii]); } else if(count>16) { int iResidue = count % 16; if(iResidue>0) for(int ii=0;ii<iResidue;ii++) decompress_adpter(srcBytes[ii]); } for(data=(m_SavedData == 0 && m_TotalBits == 0)?m_MaxCode[m_MaxBits]:m_SavedData >> (32 - m_MaxBits),m_SavedData <<= m_MaxBits,m_TotalBits -= m_MaxBits; data != m_MaxCode[m_MaxBits]; data=(m_SavedData == 0 && m_TotalBits == 0)?m_MaxCode[m_MaxBits]:m_SavedData >> (32 - m_MaxBits),m_SavedData <<= m_MaxBits,m_TotalBits -= m_MaxBits) { //  Check if the code exist in the dictionary //  if not //  Check if the code exist in the dictionary //  Returns TRUE if so, and FALSE if not. //  If the code is lower then 256, then the element is a normal //  ASCII character, and as such is considered to be in the //  dictionay. if (data >= 256 && data - 256 >= (unsigned)m_dictionary->GetSize()) { //  Get the last used character into the decod buffer decodeString.Add((BYTE)character); //  Decode the existing prefix into a known string of data GetBytesFromCode(m_dictionary,&decodeString, prefix); } else { //  Decode the data into the decode buffer GetBytesFromCode(m_dictionary,&decodeString, data); //  Get the last letter inside the data, as the last used letter character = decodeString.GetAt(decodeString.GetSize() - 1); } //  Go over the decode buffer, from the end to the start, //  and write the information into the destination file counter = decodeString.GetSize(); while (counter > 0) { writeData = (BYTE)decodeString.GetAt(--counter); strDecode+=writeData; } //  Clear the decode buffer decodeString.RemoveAll(); //  Add the new combination into the dictionary //  Add a dictionary element. //  Since the dictionary should already have all the values //  between 0-255, we start it from 256. dicElement *tmp = new dicElement; tmp->m_Prefix = prefix; tmp->m_Letter = (BYTE)character; m_dictionary->Add(tmp); //  Calculate the new buffer size to read now DWORD value=m_dictionary->GetSize() + 257; //  Check the value of the parameter against the Maximum number possible //  and then returns the counter //  This can also be acheived by right shifting the value until we get 0 //  and counting the number of times we doing it. for (BYTE counter = 0; counter < 32; counter++) if (value <= m_MaxCode[counter]) break; m_MaxBits = counter; //  Since the minimal number of bits we are using is 9 (256 is the begining of the dictionary),  //  then the minimal number of bits is check to return a 9 in case a lower value will be //  reached in the application if (m_MaxBits < 9) m_MaxBits = 9; //  Set the new prefix to use prefix = data; delete tmp; } delete m_dictionary; char *pMem; hMem = GlobalAlloc( GHND | GMEM_DDESHARE, strDecode.length()+1); if(hMem) { pMem = (char*)GlobalLock(hMem); strcpy(pMem,strDecode.c_str()); GlobalUnlock(hMem); EmptyClipboard(); SetClipboardData(CF_TEXT,hMem); } CloseClipboard(); } } } return nRetCode; } 

测试文本

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 EG4GQCAGkHQHMCAGUGwGUG0GUG4HQHMC4CAFQGgGUCAGMHIGUGEHQGkG8G4CAGEG4GQCAG0GEGkG 4HQGUG4GEG4GMGUCAG8GYCAEYHIGEG0GUHcG8HIGsCAGUGwGUG0GUG4HQHMCAGkHMCAGMG8HYGUH IGUGQCAGkG4CACIE0G8GQHUGwGUCADMDoCAFAHIG8GMGUHMHMCAC8CAEMG8G4HQHIG8GwCAE8HcG 4GUHIHMGgGkHACICAG8GYCAHQGgGkHMCAG0GEG4HUGEGwC4CAFQGgGkHMCAGkG4HQHIG8GQHUGMH QGkG8G4CAHcGkGwGwCAHAHIG8HYGkGQGUCAGkG4GYG8HIG0GEHQGkG8G4CAG8G4CAHQGgGUCAGQG kGYGYGUHIGUG4HQCAHcGEHkHMCAHQG8CAHYGkGUHcCAHQGgGUCAEYHIGEG0GUHcG8HIGsCAG8G4G
wHkC4A0AoFQGgGUHIGUCAGEHIGUCAGQGkGYGYGUHIGUG4HQCAG8HAHQGkG8G4HMCAGEHYGEGkGwG EGIGwGUCAGYHIG8G0CAHQGgGUCAG0GUG4HUCAG8G4CAHQGgGUCAGwGUGYHQCAG8GYCAHQGgGUCAH cGkG4GQG8HcCAGYG8HICAHYGkGUHcGkG4GcCAHQGgGUCAEkG4HQGUHIG4GEGwCAEMG8G4HQHIG8G
wCAEYHIGEG0GUHcG8HIGsCAGUGwGUG0GUG4HQHMDoA0AoFIGkHMGsCAFQHIGUGUHMA0AoFQGgGUC AFIGkHMGsCAFQHIGUGUHMCAHAHIG8HYGkGQGUCAGECAHYGkHMHUGEGwCAHAGkGMHQHUHIGUCAG8G YCAHQGgGUCAEkG4HQGUHIG4GEGwCAEMG8G4HQHIG8GwCAGYHIGEG0GUHcG8HIGsCAGYG8HICAHQG gGUCAHMGUGwGUGMHQGUGQCAGUG4HQGkHQHkCACgHMGUGUCAHMGMHIGUGUG4CAHMGgG8HQCAGkG4C
AG4GUHgHQCAHAGEGcGUCkC4CAFQGgGUCAGEHYGEGkGwGEGIGwGUCAHQHIGUGUHMCAGEHIGUDoA0A
oEEGMHQGkG8G4CAE0GEG4GEGcGUG0GUG4HQA0AoFQGgGUCAEEGMHQGkG8G4CAE0GEG4GEGcGUG0G
UG4HQCAHAGEGcGUCAGMG8G4HQGEGkG4HMCAGkG4GYG8HIG0GEHQGkG8G4CAG8G4CAGEGwGwCAHIG
UGMG8HIGQGUGQCAGkHMHMHUGUHMCAGEG4GQCAHIGUG0GUGQGkGEHQGkG8G4CAHAGwGEG4HMCAGYG 8HICAHQGgGUCAHMGUGwGUGMHQGUGQCAE8HIGcGEG4GkHoGEHQGkG8G4CAFUG4GkHQDoA0AoDMC4D QCAE8HIGcGEG4GkHoGEHQGkG8G4A0AoFQGgGUCAE8HIGcGEG4GkHoGEHQGkG8G4CAHAGEGcGUCAG
MG8G4HQGEGkG4HMCAGkG4GYG8HIG0GEHQGkG8G4CAG8G4CAFIG8GwGUHMCAGEG4GQCAFUHMGUHIH
MCAGEG4GQCAGMGEG4CAGIGUCAHUHMGUGQCAGIHkCAFIGUGcGkG8G4CAEwG8GMGEGwCAFME8HgCAE
MG8G8HIGQGkG4GEHQG8HIHMCAHQG8CAHYGkGUHcCAHQGgGUCAGEGMGMGUHMHMCAGYG8HICAHQGgG UGkHICAHUG4GkHQHMA0AoEYHUG4GMHQGkG8G4GEGwCAE8HIGEG4GkHoGEHQGkG8G4C0HQGgGkHMC AHMGUGMHQGkG8G4CAGkHMCAG4G8HQCAGEGMGMGUHMHMGkGIGwGUCAHQG8CAFUHMGUHIHMC4A0AoE IHUHMGkG4GUHMHMCAFIG8GwGUHMCAC0CAHAHIG8HYGkGQGUHMCAGkG4GYG8HIG0GEHQGkG8G4CAG 8G4CAHcGgGkGMGgCAHUHMGUHIHMCAGgGEHYGUCAGIGUGUG4CAGEHMHMGkGcG4GUGQCAHQG8CAGUG EGMGgCAG8GYCAHQGgGUCAEIHUHMGkG4GUHMHMCAFIG8GwGUHMCAGkG4CAEIFcGkHMGUA0AoEYHUG 4GMHQGkG8G4HMCAC0CAHQGgGkHMCAGYHUG4GMHQGkG8G4GEGwGkHQHkCAGkHMCAG4G8HQCAHUHMG UGQCAGIHkCAFMHkG4GcGUG4HQGEA0AoFAGUHIHMG8G4HMCAC0CAHAHIG8HYGkGQGUHMCAGECAGwG kHMHQCAG8GYCAGEGwGwCAHUHMGUHIHMCAGEG4GQCAHQGgGUCAEIHUHMGkG4GUHMHMCAFIG8GwGUH MCAHQGgGUHkCAGgGEHYGUCAGIGUGUG4CAGEHMHMGkGcG4GUGQA0AoDMC4DUCAFIGUHAG8HIHQGkG 4GcA0AoFQGgGUCAFIGUHAG8HIHQGkG4GcCAHAGEGcGUCAGMG8G4HQGEGkG4HMCAGEGwGwCAGEHYG EGkGwGEGIGwGUCAEIFcGkHMGUCAHIGUHAG8HIHQHMC4CAEYHUGwGwCAGQGUHQGEGkGwHMCAG8GYC AHQGgGUCAGEHYGEGkGwGEGIGwGUCAFIGUHAG8HIHQHMCAGEHIGUCAHAHIG8HYGkGQGUGQCAGkG4C AE0G8GQHUGwGUCADgCAG8GYCAHQGgGUCAEkG4HMHQHIHUGMHQGkG8G4CAE0GEG4HUGEGwC4A0AoA 0AoFQGgGUCAEIFcGkHMGUCAHMG8GYHQHcGEHIGUCAGMGEG4CAGIGUCAHUHMGUGQCAHQG8CAHMHUH AHAG8HIHQCAHQGgGUCADUCAHAGgGEHMGUHMCAGkG4CAHQGgGUCAGYG8GwGwG8HcGkG4GcCAHcGEH
kDoA0AoFAGwGEG4G4GkG4GcCACYCAFMGMG8HAGkG4GcCAC0CAFQG8CAHIGUGMG8HIGQCAHQGgGUC ACIGkG4CAHMGMG8HAGUCICAHAHIG8GMGUHMHMGUHMCAGEG4GQCAHQGgGUCAHMGMG8HAGUCAGEG4G QCAHMGMGgGUGQHUGwGkG4GcCAG8GYCAHQGgGUCAHIGUHEHUGkHIGUGQCAHQGUHMHQGkG4GcC4CAE ECACIEYHIGEG0GUHcG8HIGsCICAGkHMCAGMHIGUGEHQGUGQCAGkG4CAEIFcGkHMGUCAGYG8HICAG UGEGMGgCAGUGwGUG0GUG4HQCAHQG8CAHIGUGYGwGUGMHQCAHQGgGUCACIEkG4CAFMGMG8HAGUCIC AGEGMHQGkHYGkHQGkGUHMC4A0AoEQG8GMHUG0GUG4HQGEHQGkG8G4CAC0CAFQG8CAGgG8GwGQCAH QGgGUCAFAHIG8GMGUHMHMCAGEG4GQCAEMG8G4HQHIG8GwCAEQG8GMHUG0GUG4HQGEHQGkG8G4CAG EG4GQCAGkGQGUG4HQGkGYGkGUGQCAEsGUHkCAEMG8G4HQHIG8GwHMC4A0AoEQGUHMGkGcG4CACYC AEUGYGYGUGMHQGkHYGUG4GUHMHMCAC0CAFQG8CAGgG8GwGQCAFcGEGwGsHQGgHIG8HUGcGgCAGQG 8GMHUG0GUG4HQGEHQGkG8G4CAGEG4GQCAHIGUGMG8HIGQCAEkHMHMHUGUCAGEG4GQCACkBlA2gZQ MgGkDCB0A0gbwNwCADgBsAwgbgOYCADCByA0gcwNIG4DOAgAzAcgN4G0BABQA5AbwMYGUDmBzAQA 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 DYAgA7gbwOQGsBcANAFf/wA=
阅读(4524) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~