Aport-211S User Guide
‧
18
‧
6. Appendix A: Tiny Encryption Algorithm
1. Example of TEA.C
/************************************************
The Tiny Encryption Algorithm (TEA) by David Wheeler and Roger Needham of the Cambridge
Computer Laboratory. Placed in the Public Domain by David Wheeler and Roger Needham.
**** ANSI C VERSION (New Variant) ****
Notes: TEA is a Feistel cipher with XOR and addition as the non-linear mixing functions.
Takes 64 bits of data in v[0] and v[1]. Returns 64 bits of data in w[0] and w[1].
Takes 128 bits of key in k[0] - k[3].
TEA can be operated in any of the modes of DES. Cipher Block Chaining is, for example, simple to
implement. n is the number of iterations. 32 is ample, 16 is sufficient, as few as eight may be OK.
The algorithm achieves good dispersion after six iterations. The iteration count can be made variable
if required.
Note this is optimised for 32-bit CPUs with fast shift capabilities. It can very easily be ported to
assembly language on most CPUs. delta is chosen to be the real part of (the golden ratio Sqrt(5/4) -
1/2 ~ 0.618034 multiplied by 2^32).
This version has been amended to foil two weaknesses identified by David A. Wagner
([email protected]): 1) effective key length of old-variant TEA was 126 not 128 bits 2) a related key
attack was possible although impractical.
************************************************/
//#include "xtea.h"
void encipher(unsigned long *const v,unsigned long *const w, const unsigned long *const k)
{
register unsigned long
y=v[0],z=v[1],sum=0,delta=0x9E3779B9,n=32;
while(n-->0)
{ y+= (z<<4 ^ z>>5) + z ^ sum + k[sum&3];
sum += delta;
z+= (y<<4 ^ y>>5) + y ^ sum + k[sum>>11 & 3];
}
w[0]=y; w[1]=z;
}
void decipher(unsigned long *const v,unsigned long *const w, const unsigned long *const k)
{
register unsigned long
y=v[0],z=v[1],sum=0xC6EF3720,
delta=0x9E3779B9,n=32;
/* sum = delta<<5, in general sum = delta * n */
while(n-->0)
Содержание Aport-211S
Страница 2: ......