返回顶部

收藏

LZW+AES+Base64编码解码剪贴板文本

更多

256位密钥加密传输文本。

encodeAESstr.cpp

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

#include "stdafx.h"
#include "encodeAESstr.h"
#include <string>

#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 <string>

#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=

标签:c++

收藏

0人收藏

支持

0

反对

0

»更多 您可能感兴趣的代码
  1. 2017-07-23 12:42:20奇数魔方阵 by Kevin.
  2. 2017-07-18 14:15:24两种方法计算“算术表达式” by aiheng1988
  3. 2015-09-09 16:29:06将jpg转换为bmp格式的文件 by qqmmcc
  4. 2015-09-09 09:29:49可执行文件加密 by walker30
  5. 2015-09-08 18:42:46TCP端口占用查询 by 灵剑子
  6. 2015-09-08 14:16:34Luffar schack五子棋 by 蟋蟀哥
  7. 2015-09-08 10:39:34wav转mp3的程序 by 灵剑子
  8. 2015-09-05 16:54:59逐行搜索目录中的文件内容并输出到Excel by 蟋蟀哥
  9. 2015-09-01 17:47:21猫里奥 by aiheng1988
  10. 2015-08-31 15:33:59模拟键盘操作发送字符串 by 千万不要郁闷
  11. 2018-11-03 21:55:42根据进程名查看该进程的创建时间 by wubai

发表评论