tea.cpp

来自「Tiny Encrytion Algorithm压缩速度快」· C++ 代码 · 共 73 行

CPP
73
字号
// 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 + =
减小字号Ctrl + -
显示快捷键?