/******************************
TEA加密解密算法C++实例
niqinjian
2010.4.11
******************************/
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
#define MX (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z)
#define DELTA 0x9e3779b9
#define S_LOOPTIME 5
const unsigned char BASE_CODE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//编码,参数:要编码的字符串指针,解码后存放的位置(编码字串长度的4/3),要编码的字符串长度 ->返回结果长度
int Base64Encode(unsigned char *lpString, unsigned char *lpBuffer, int sLen)
{ register int vLen = 0; //寄存器局部变量,提速
while(sLen > 0) //处理整个字符串
{ *lpBuffer++ = BASE_CODE[(lpString[0] >> 2 ) & 0x3F]; //右移两位,与00111111是防止溢出,自加
if(sLen > 2) //够3个字符
{ *lpBuffer++ = BASE_CODE[((lpString[0] & 3) << 4) | (lpString[1] >> 4)];
*lpBuffer++ = BASE_CODE[((lpString[1] & 0xF) << 2) | (lpString[2] >> 6)];
*lpBuffer++ = BASE_CODE[lpString[2] & 0x3F];
}else
{ switch(sLen) //追加“=
{ case 1:
*lpBuffer ++ = BASE_CODE[(lpString[0] & 3) << 4 ];
*lpBuffer ++ = '=';
*lpBuffer ++ = '=';
break;
case 2:
*lpBuffer ++ = BASE_CODE[((lpString[0] & 3) << 4) | (lpString[1] >> 4)];
//*lpBuffer ++ = BASE_CODE[((lpString[1] & 0x0F) << 2) | (lpString[2] >> 6)];
*lpBuffer ++ = BASE_CODE[((lpString[1] & 0x0F) << 2)];
*lpBuffer ++ = '=';
break;
}
}
lpString += 3;
sLen -= 3;
vLen +=4;
}
*lpBuffer = 0;
return vLen;
}
//子函数 - 取密文的索引
unsigned char GetCharIndex(unsigned char c) //内联函数可以省去函数调用过程,提速
{ if((c >= 'A') && (c <= 'Z'))
{ return c - 'A';
}else if((c >= 'a') && (c <= 'z'))
{ return c - 'a' + 26;
}else if((c >= '0') && (c <= '9'))
{ return c - '0' + 52;
}else if(c == '+')
{ return 62;
}else if(c == '/')
{ return 63;
}else if(c == '=')
{ return 0;
}
return 0;
}
//解码,参数:结果,密文,密文长度
int Base64Decode(unsigned char *lpString, unsigned char *lpSrc, int sLen) //解码函数
{ static char lpCode[4];
register int vLen = 0;
//unsigned int vLen = 0;
if(sLen % 4) //Base64编码长度必定是4的倍数,包括'='
{ lpString[0] = '\0';
return -1;
}
while(sLen > 2) //不足三个字符,忽略
{ lpCode[0] = GetCharIndex(lpSrc[0]);
lpCode[1] = GetCharIndex(lpSrc[1]);
lpCode[2] = GetCharIndex(lpSrc[2]);
lpCode[3] = GetCharIndex(lpSrc[3]);
*lpString++ = (lpCode[0] << 2) | (lpCode[1] >> 4);
*lpString++ = (lpCode[1] << 4) | (lpCode[2] >> 2);
*lpString++ = (lpCode[2] << 6) | (lpCode[3]);
lpSrc += 4;
sLen -= 4;
vLen += 3;
}
return vLen;
}
/*
*key maybe 128bit =16 Bytes.
*buf maybe BLOCK_SIZE
*/
void btea_encrypt( unsigned char *buf, unsigned char *key ,unsigned int sLen)
{
unsigned char n=sLen/4;
unsigned long *v=(unsigned long *)buf;
unsigned long *k=(unsigned long *)key;
unsigned long z = v[n - 1],y = v[0],sum = 0,e ;
unsigned char p,q;
// Coding Part
q = S_LOOPTIME + 52 / n ;
while ( q-- > 0 )
{
sum += DELTA ;
e = sum >> 2 & 3 ;
for ( p = 0 ; p < n - 1 ; p++ )
y = v[p + 1],
z = v[p] += MX;
y = v[0] ;
z = v[n - 1] += MX;
}
}
/*
*key maybe 128bit =16Bytes.
*buf maybe BLOCK_SIZE
inbuf == outbuf == buf
*/
void btea_decrypt( unsigned char *buf, unsigned char *key ,unsigned int sLen)
{
unsigned char n=sLen/4;
unsigned long *v=(unsigned long *)buf;
unsigned long *k=(unsigned long *)key;
unsigned long z = v[n - 1],y = v[0],sum = 0,e ;
unsigned char p,q ;
//Decoding Part...
q = S_LOOPTIME + 52 / n ;
sum = q * DELTA ;
while ( sum != 0 )
{
e = sum >> 2 & 3 ;
for ( p = n - 1 ; p > 0 ; p-- )
z = v[p - 1],
y = v[p] -= MX;
z = v[n - 1] ;
y = v[0] -= MX;
sum -= DELTA ;
}
}
void main()
{ //需要加密的数据
unsigned char abc[8]={'A','B','C','D','E','F','G','H'};
//密钥
unsigned char password[16]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P'};
int display[100];
unsigned char i;
unsigned char p=8;
unsigned char str[100];
cout<<"原数据:"<<endl;
//for(i=0;i<p;i++) display[i]=abc[i];
for(i=0;i<p;i++) cout<<abc[i]<<" ";
cout<<endl<<endl<<endl;
cout<<"tea加密后数据:"<<endl;
btea_encrypt(abc,password,p);
for(i=0;i<50;i++) display[i]=abc[i];
for(i=0;i<50;i++) cout<<display[i]<<" ";
cout<<endl<<endl<<endl;
cout<<"base64编码后数据:"<<endl;
p = Base64Encode(abc, str, p);
for(i=0;i<p;i++) cout<<str[i]<<" ";
cout<<"base64解码后数据:"<<endl;
//p = Base64Decode(abc, str, p);
//for(i=0;i<p;i++) display[i]=abc[i];
//for(i=0;i<p;i++) cout<<str[i]<<" ";
//cout<<"tea解密后数据:"<<endl;
//btea_decrpyt(abc,password);
//for(i=0;i<p;i++) display[i]=abc[i];
//for(i=0;i<p;i++) cout<<display[i]<<" ";
cout<<endl<<endl<<endl;
}
评论0