TEA密码系列
TEA / XTEA / XXTEA
TEA
微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。TEA 操作处理在两个 32 位无符号整型上(可能源于一个 64 位数据),并且使用一个 128 位的密钥。设计者是 Roger Needham 和 David Wheeler。
加解密代码如下:
#include <iostream>
class tea{
public:
uint32_t delta = 0x9E3779B9;
void encrypt(uint32_t * v,uint32_t *key);
void decrypt(uint32_t * v,uint32_t *key);
};
void tea::encrypt(uint32_t *v, uint32_t *key) {
uint32_t v0=v[0],v1=v[1],i;
uint32_t k0=key[0],k1=key[1],k2=key[2],k3=key[3];
uint32_t x=0;
for(i=0;i<32;i++){
x += delta;
v0 += ((v1<<4) + k0) ^ (v1 + x) ^ ((v1>>5) + k1);
v1 += ((v0<<4) + k2) ^ (v0 + x) ^ ((v0>>5) + k3);
}
v[0] = v0;
v[1] = v1;
}
void tea::decrypt(uint32_t *v, uint32_t *key) {
uint32_t v0=v[0],v1=v[1],i;
uint32_t k0=key[0],k1=key[1],k2=key[2],k3=key[3];
uint32_t x=32*delta;
for(i=0;i<32;i++){
v1 -= ((v0<<4) + k2) ^ (v0 + x) ^ ((v0>>5) + k3);
v0 -= ((v1<<4) + k0) ^ (v1 + x) ^ ((v1>>5) + k1);
x -= delta;
}
v[0] = v0;
v[1] = v1;
}
int main(){
char m[] = "flag{hh}";
uint32_t key[4] = {'2','0','2','4'};
tea *t = new tea();
t->encrypt((uint32_t *)m,key);
std::cout << "加密结果: ";
for (int i = 0; i < 8; ++i) {
//std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
printf("%02x ",(unsigned char )m[i]);
}
std::cout << std::endl;
t->decrypt((uint32_t *)m,key);
std::cout << "解密结果: ";
for (int i = 0; i < 8; ++i) {
//std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
printf("%02x ",(unsigned char )m[i]);
}
std::cout << std::endl;
}
XTEA
XTEA 是 TEA 的升级版,增加了更多的密钥表,移位和异或操作等等(没看出核心改变...)。
加解密代码如下:
class xtea{
public:
uint32_t delta = 0x9E3779B9;
void encrypt(uint32_t * v,uint32_t *key);
void decrypt(uint32_t * v,uint32_t *key);
};
void xtea::encrypt(uint32_t *v, uint32_t *key) {
uint32_t v0=v[0],v1=v[1];
uint32_t x=0;
for (int i = 0; i < 32; ++i) {
v0 += (((v1<<4) ^ (v1>>5)) + v1) ^ (x + key[x&3]);
x += delta;
v1 += (((v0<<4) ^ (v0>>5)) + v0) ^ (x + key[x&3]);
}
v[0] = v0;
v[1] = v1;
}
void xtea::decrypt(uint32_t *v, uint32_t *key) {
uint32_t v0=v[0],v1=v[1];
uint32_t x=32*delta;
for (int i = 0; i < 32; ++i) {
v1 -= (((v0<<4) ^ (v0>>5)) + v0) ^ (x + key[x&3]);
x -= delta;
v0 -= (((v1<<4) ^ (v1>>5)) + v1) ^ (x + key[x&3]);
}
v[0] = v0;
v[1] = v1;
}
//-------------------------------------------------------------------------
int main(){
char m[] = "flag{hh}";
uint32_t key[4] = {'2','0','2','4'};
xtea *t = new xtea();
t->encrypt((uint32_t *)m,key);
std::cout << "加密结果: ";
for (int i = 0; i < 8; ++i) {
//std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
printf("%02x ",(unsigned char )m[i]);
}
std::cout << std::endl;
t->decrypt((uint32_t *)m,key);
std::cout << "解密结果: ";
for (int i = 0; i < 8; ++i) {
//std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
printf("%02x ",(unsigned char )m[i]);
}
std::cout << std::endl;
}
XXTEA
XXTEA,又称 Corrected Block TEA,是 XTEA 的升级版。
加解密代码如下:
class xxtea{
public:
uint32_t delta = 0x9E3779B9;
void encrypt(uint32_t * v,uint32_t len,uint32_t *key);
void decrypt(uint32_t * v,uint32_t len,uint32_t *key);
private:
uint32_t shift(uint32_t z,uint32_t y, uint32_t x, uint32_t *key, uint32_t p, uint32_t e);
};
uint32_t xxtea::shift(uint32_t z, uint32_t y, uint32_t x, uint32_t *key, uint32_t p, uint32_t e) {
return ((((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((x ^ y) + (key[(p & 3) ^ e] ^ z)));
}
void xxtea::encrypt(uint32_t *v , uint32_t len, uint32_t *key) {
uint32_t rounds = 6 + 52 / len,x=0,e,p,y;
uint32_t z = v[len-1];
for (int i = 0; i < rounds; ++i) {
x += delta;
e = (x >> 2) & 3;
for (p = 0; p < len-1; ++p) {
y = v[p+1];
v[p] += shift(z,y,x,key,p,e);
z = v[p];
}
//p += 1;
y = v[0];
v[len-1] += shift(z,y,x,key,p,e);
z = v[len-1];
}
}
void xxtea::decrypt(uint32_t *v, uint32_t len, uint32_t *key) {
uint32_t rounds = 6 + 52 / len,x,e,p,z;
uint32_t y = v[0];
x = rounds * delta;
for (int i = 0; i < rounds; ++i) {
e = (x >> 2) & 3;
for(p=len-1;p > 0;--p){
z = v[p-1];
v[p] -= shift(z,y,x,key,p,e);
y = v[p];
}
//p -= 1;
z = v[len-1];
v[0] -= shift(z,y,x,key,p,e);
y = v[0];
x -= delta;
}
}
//-------------------------------------------------------------------------
int main(){
char m[] = "flag{hh}";
uint32_t key[4] = {'2','0','2','4'};
xxtea *t = new xxtea();
t->encrypt((uint32_t *)m,2,key);
std::cout << "加密结果: ";
for (int i = 0; i < 8; ++i) {
//std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
printf("%02x ",(unsigned char )m[i]);
}
std::cout << std::endl;
t->decrypt((uint32_t *)m,2,key);
std::cout << "解密结果: ";
for (int i = 0; i < 8; ++i) {
//std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
printf("%02x ",(unsigned char )m[i]);
}
std::cout << std::endl;
}

浙公网安备 33010602011771号