📄 tea.cpp
字号:
// The TEA encryption algorithm was invented by
// David Wheeler & Roger Needham at Cambridge
// University Computer Lab
// http://www.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html (1994)
// http://www.cl.cam.ac.uk/ftp/users/djw3/xtea.ps (1997)
// http://www.cl.cam.ac.uk/ftp/users/djw3/xxtea.ps (1998)
//
// This code was originally written in JavaScript by
// Chris Veness at Movable Type Ltd
// http://www.movable-type.co.uk
//
// It was adapted to C++ by Andreas Jonsson
// http://www.angelcode.com
#include "tea.h"
#include <math.h>
int TeaEncrypt(UINT *v, UINT n, UINT *k)
{
if( n < 2 ) return -1;
// TEA routine as per Wheeler & Needham, Oct 1998
UINT z = v[n-1], y = v[0], delta = 0x9E3779B9;
UINT mx, e, q = UINT(floor(6 + 52.0f/n)), sum = 0;
while( q-- > 0 ) // 6 + 52/n operations gives between 6 & 32 mixes on each word
{
sum += delta;
e = sum>>2 & 3;
for( UINT p = 0; p < n-1; p++ )
{
y = v[p+1];
mx = (z>>5 ^ y<<2) + (y>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
z = v[p] += mx;
}
y = v[0];
mx = (z>>5 ^ y<<2) + (y>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
z = v[n-1] += mx;
}
return 0;
}
int TeaDecrypt(UINT *v, UINT n, UINT *k)
{
if( n < 2 ) return -1;
// TEA routine as per Wheeler & Needham, Oct 1998
UINT z = v[n-1], y = v[0], delta = 0x9E3779B9;
UINT mx, e, q = UINT(floor(6 + 52.0f/n)), sum = q*delta;
while (sum != 0)
{
e = sum>>2 & 3;
for( UINT p = n-1; p > 0; p-- )
{
z = v[p-1];
mx = (z>>5 ^ y<<2) + (y>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
y = v[p] -= mx;
}
z = v[n-1];
mx = (z>>5 ^ y<<2) + (y>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
y = v[0] -= mx;
sum -= delta;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -