找回密码
 注册
搜索
查看: 37400|回复: 6

TEA加密算法的C/C++实现

[复制链接]
发表于 2010-1-19 17:58:25 | 显示全部楼层 |阅读模式
TEA(Tiny Encryption Algorithm) 是一种简单高效的加密算法,以加密解密速度快,实现简单著称。算法真的很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。目前我只知道QQ一直用的是16轮TEA。没什么好说的,先给出C语言的源代码(默认是32轮):+ I5 q) D4 X/ L, f' B
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
6 P0 D: r) |- _5 T! P2 GTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
: A, C0 z+ [( u* s0 y之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
2 X' n/ [, D/ P  {/ d" |  ~& q在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。   S+ K' T! K- \) J5 X$ c3 G
在 1998 年,Markku-Juhani Saarinen 给出了一个可有效攻击 Block TEA 算法的代码,但之后很快 David J. Wheeler 和 Roger M. Needham 就给出了 Block TEA 算法的修订版,这个算法被称为 XXTEA。XXTEA 使用跟 Block TEA 相似的结构,但在处理块中每个字时利用了相邻字。它利用一个更复杂的 MX 函数代替了 XTEA 轮循函数,MX 使用 2 个输入量。
发表于 2010-1-19 19:47:00 | 显示全部楼层

  1. / A0 r+ _) s' H# A9 B. L/ H
  2. void encrypt(unsigned long *v, unsigned long *k) {
    % ], W: g, _, {6 z
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    1 `5 V. ], m* g7 d; H1 p7 b
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    6 Q& d' [4 D% ~4 d& T
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 2 G) W, B: M- y% k  |  n8 h
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ . e2 f: B( f2 n
  7.          sum += delta;
    * s+ x1 v2 C' b3 c
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 7 T+ H4 O  |9 e' u8 k3 T, g; F
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ' F) g. Q/ X" D" p# z4 `& [
  10.      }
    ! z! {6 ~8 N" [# `+ n
  11.      v[0]=y; ) S" U1 h- n" j' E5 j- u* M
  12.      v[1]=z; ) e" r! z1 Y- }$ d! P
  13. } , X% ]# S! Y! \' l5 b6 S% o
  14.   
    2 G2 M- }2 C# {, F# A
  15. void decrypt(unsigned long *v, unsigned long *k) {
    $ G- g) l5 ~3 x$ N, t2 C1 K; v5 q. ]
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ / r% m0 ?3 t* R. l8 L# w+ i, L. F! |
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    3 O1 x# ^- m& i. u! l6 y% h; s4 @
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ( @, {$ |* f: r0 \5 B6 v% ?# S% K
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    2 ~5 C: F: Y/ Q; L/ H& O, R
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    / p7 i' C/ A; v  @; X
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); # X& S) Q$ H( p& k  a+ x- A
  22.          sum -= delta;                                /* end cycle */ 4 h0 [2 Q2 m5 d& R( r
  23.      }
    ' ]" R) e6 C! o9 ~' B9 p
  24.      v[0]=y;
    ) e9 d: @; G) h" y$ G
  25.      v[1]=z;
    7 H) F0 ~4 t% Z) ?+ c
  26. }: {% P% Q4 u- ^' w' L& s
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

发表于 2010-1-19 19:48:25 | 显示全部楼层

unit.h

#ifndef UTIL_H
/ r" @4 l( F  G/ u/ S#define UTIL_H ! |0 O6 j; u0 g( C
% G" n! m7 W9 i/ {" J, Y% D, A3 y
#include <string>
; V$ G2 W  ~& n2 i- F#include <cmath>
7 I/ e5 l  a+ \& W#include <cstdlib>
7 {% g! y0 t3 [4 p4 Y* {) P7 r" D9 F
! D  k" `& |' D- }% Y) v9 ]typedef unsigned char byte;
7 E3 u5 r9 i0 M2 w, u. Dtypedef unsigned long ulong; 6 W7 _2 b& U, s0 A/ c

: p% H# h; _# _/ X! vinline double logbase(double base, double x) {
: A$ m) f9 ^( }& @; m    return log(x)/log(base); $ u; {! H  F( i4 |" G$ W- \) z; M5 m# X3 X
}
6 N( I5 }8 L# ^( w9 @0 `' r3 J 8 i' k1 |  @% q
/* ( H9 c* C( s' E& l
*convert int to hex char. $ y" P% p% W0 W& @3 G
*example:10 -> 'A',15 -> 'F' 9 i: }! Y3 s5 @' T5 V
*/ % V3 F! R5 u& V& w
char intToHexChar(int x); 6 J; e$ F1 n  k, I7 z

, X, t0 F! T3 G3 J/*
! N  j7 L$ v, c/ }( b% K. F" H*convert hex char to int.
3 ?9 G- f( z: D+ ]9 X*example:'A' -> 10,'F' -> 15
7 x8 A. f7 M2 E' Y*/
; e. K( J+ H3 T- }int hexCharToInt(char hex);
7 V6 \. ^& b, l' Z" t " o; V9 t3 @0 m4 y
using std::string; ) _. \% ~: C9 k: B8 E
/*
/ F" L, H; U- U*convert a byte array to hex string.
; C6 o- _0 H" N- l7 G! S2 z9 W*hex string format example:"AF B0 80 7D"
! }8 F1 ^8 J" D$ f; m- \*/
/ [9 i6 Q% g! c7 {3 {string bytesToHexString(const byte *in, size_t size);
! J7 X; d9 \( q7 R8 Y: x
% @( h6 W) H& H$ o/*
# Q  L1 F' [2 F: I  l$ D*convert a hex string to a byte array. ; Q4 W7 I! v9 L
*hex string format example:"AF B0 80 7D"
2 E% p7 ~$ ~0 e. d*/ & \7 D; N; D& D# L
size_t hexStringToBytes(const string &str, byte *out);
" \9 O: i* `: h0 p1 ^" b ! l3 p2 h! B) }7 f& e
#endif/*UTIL_H*/
回复

使用道具 举报

发表于 2010-1-19 19:51:31 | 显示全部楼层

util.cpp

#include "util.h"
; E" Y( D* C6 U2 T( v/ o$ i#include <vector>
' N) s. t: A9 y- i( k
+ W1 Q" X. o8 h5 L& b$ _using namespace std; , w9 C, t& h# T2 B2 L5 K3 y

" k1 {6 U5 A# f2 e- v, ?! S- ~0 gchar intToHexChar(int x) {
2 G/ F( M* B! M# P- W. [, f    static const char HEX[16] = { , j, E0 `8 n8 ~2 `- ]
        '0', '1', '2', '3', ' N( ]4 O2 }7 \+ c6 H8 l4 H
        '4', '5', '6', '7', + V# @- G0 Y& X% u
        '8', '9', 'A', 'B',
# F  b/ B6 ]( C5 z+ q2 Y        'C', 'D', 'E', 'F' & c2 v+ J" E) m. g* F1 e( [9 Y
    }; ! g5 q, T/ x; h5 `! a; \: M0 x- j
    return HEX[x];
5 C' M3 s3 y& M0 O}
, C8 y( i5 ^6 v) P 1 [' h- ?' w5 \/ a: r. u( {; V  C/ M0 m9 \
int hexCharToInt(char hex) { - S- n3 P( d: u. _' a
    hex = toupper(hex);
3 r6 @. N5 a; F. x* [* t    if (isdigit(hex))
0 u; x! f8 [4 U, ^+ x        return (hex - '0'); 5 k4 p, y6 `! V
    if (isalpha(hex))
) k0 t; `$ p0 p) w( S* k% k        return (hex - 'A' + 10); ; j4 n' H$ _% P5 A" T0 u
    return 0;
" j) A8 k# z/ K}
# p5 I5 W2 m" u- F  q
! {% ?; Y' Z3 q/ Q" Y2 K. pstring bytesToHexString(const byte *in, size_t size) { / w# j  J' u" r+ ~$ C2 m% R
    string str;
% u* P9 R; q- G& t) K    for (size_t i = 0; i < size; ++i) { 4 j7 Z1 h$ @, p* _9 N1 a  ]/ \! C- g
        int t = in[i];
6 M/ n0 ?9 z$ ^7 O& ]7 \2 a2 L) `) A        int a = t / 16; 0 W& P7 ]( e3 @
        int b = t % 16;
4 i0 N2 n5 ^" Q- y1 j        str.append(1, intToHexChar(a)); 4 w0 h& |, K# o! J- w- O% m& q: \+ m" {
        str.append(1, intToHexChar(b)); * ?( Y1 N. s6 z
        if (i != size - 1) 9 N4 ?, l: P7 V- U& K
            str.append(1, ' ');
+ o/ M8 L% t2 a  A; M/ W9 Q' k! C# U    }
4 s3 o% o$ F4 q/ t. s    return str; 4 k: I7 H: Y! u% l
}
! w) e; P6 t" G/ }$ O / C- _+ _$ @4 J) }) X9 Z- ?% l2 z
size_t hexStringToBytes(const string &str, byte *out) { 0 R. w0 |( |- q/ f3 o
; k- t: L% a/ w; f( C+ C+ F
    vector<string> vec; & m9 M9 c* ~: D# R  s, ~
    string::size_type currPos = 0, prevPos = 0;
6 m3 q/ i- R# a! X( J+ T$ ~) b    while ((currPos = str.find(' ', prevPos)) != string::npos) { 9 C4 B0 b4 s( k, U# \6 \
        string b(str.substr(prevPos, currPos - prevPos));
% ^9 g9 C, v( h! t! r        vec.push_back(b); 6 {( d& F5 f# c( }: r' H
        prevPos = currPos + 1;
( r. H( c6 M. v' U    } 6 x7 ~, _9 G/ N3 ~7 T( p0 A+ m
    if (prevPos < str.size()) {
& x+ {+ E6 G# |  T- R        string b(str.substr(prevPos)); 5 s& J( \% }8 u4 W
        vec.push_back(b); 4 p4 P+ b+ h" t! p
    }
. N0 N/ i; I7 t; J& d7 V  J    typedef vector<string>::size_type sz_type;
9 Z$ u1 C. C3 `2 b/ ^, A9 r    sz_type size = vec.size();
7 @9 r, E) ]2 P: O0 T    for (sz_type i = 0; i < size; ++i) { 2 A: h+ f  I/ m& Y
        int a = hexCharToInt(vec[i][0]);
, E8 G7 L, o6 c        int b = hexCharToInt(vec[i][1]);
% d+ m8 J5 [5 r% e, ?        out[i] = a * 16 + b;
# s& i9 D; {2 @9 x    }
5 ]  j- }" Q& Q' ?6 R    return size;
) M) D1 W$ ^, B' d5 r3 V}
回复

使用道具 举报

发表于 2010-1-19 19:57:01 | 显示全部楼层

tea.h

#ifndef TEA_H
2 A- A4 w; U0 o5 t  R/ P6 @#define TEA_H
) E2 ~6 |8 p/ w: Y% ~ ( E: i5 }4 Z( {" p( b# n$ V
/* 3 g# p4 {: {/ |& G9 P
*for htonl,htonl 9 G+ g1 J" U2 J
*do remember link "ws2_32.lib"
& a7 R1 e  U3 e$ r*/ ! q( J4 r( R7 p- d
#include <winsock2.h>
- p( s& A4 t2 u* L( x) L% O6 C( B3 e#include "util.h"
+ j( a/ v# j$ a
! m- n+ N. y" {! g) Vclass TEA { 0 y& Q) ]0 K$ ?8 |9 ?0 K
public:
) ~; [( k3 `3 g: Y9 i) w    TEA(const byte *key, int round = 32, bool isNetByte = false); ; @/ x4 k! Y5 S) E  e! a! U
    TEA(const TEA &rhs); ! E% C4 c' g" Y; t, [& h# Z
    TEA& operator=(const TEA &rhs);
7 G% V7 v1 d  g. ^+ x& z& P! k    void encrypt(const byte *in, byte *out); . w1 e; L* i& t8 \9 q+ P
    void decrypt(const byte *in, byte *out);
4 l9 D- f+ T4 f" Tprivate: $ D) O6 V' M/ _2 |
    void encrypt(const ulong *in, ulong *out);
( f; l! L" u$ b. i$ v    void decrypt(const ulong *in, ulong *out); 7 L- ^" T& A9 T* q5 G
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 5 Z4 b/ m8 F; F: N
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
* X* j) `% O' \( d5 Kprivate: * _* a. |( _7 k5 A4 K4 j
    int _round; //iteration round to encrypt or decrypt
0 j: t: I, [2 K% {0 ], n, Q    bool _isNetByte; //whether input bytes come from network / I2 f' ~. W7 }# E" \( k
    byte _key[16]; //encrypt or decrypt key
( H$ L; O5 K9 H' ]$ p; Y) o};
5 I  Y' @9 \+ z# Z, e& Z
" y; D# ?$ u; s3 a  X) |#endif/*TEA_H*/
回复

使用道具 举报

发表于 2010-1-19 19:59:57 | 显示全部楼层

tea.cpp

1 #include "tea.h"
8 A. g5 V' P  K3 e+ c' F 2 #include <cstring> //for memcpy,memset 4 z7 @, q5 b7 s; m* W) v
3  ; ^8 ~7 \/ G  V& j1 m
4 using namespace std;
4 G) N+ v+ s0 V1 K  V5 A* s 5  ' k3 Q+ m% x& P, f
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)   |5 B5 P; x: W8 h. n: a
7 :_round(round)
3 g9 i! }% }2 X# b' Q9 y% d) b 8 ,_isNetByte(isNetByte) { : d, x  T8 J# d. |
9     if (key != 0)
5 }& y" m! _, a/ U10         memcpy(_key, key, 16);
" T( `' t. o; _# \' e11     else
, Z. M8 K1 D) I8 q12         memset(_key, 0, 16); 4 o" J8 z- P% N5 K- G, m9 h) d: K
13 } # O& }4 _0 [; `
14  
* [6 U+ \# c$ a+ Q15 TEA::TEA(const TEA &rhs) 8 z. l& G' W* T! {& O  V
16 :_round(rhs._round) # Y* L* {, L/ `; ~9 E7 _
17 ,_isNetByte(rhs._isNetByte) { " D1 t& z0 y3 T
18     memcpy(_key, rhs._key, 16); 7 I8 @0 {- E1 E+ Q6 J3 |% i* A
19 } 9 s4 r( r+ F/ T/ f1 Y4 T
20  
4 J% V6 @8 `0 H9 ~  a: i' G21 TEA& TEA::operator=(const TEA &rhs) {
: T' J2 C( D) R22     if (&rhs != this) {
- l% z- S( v. ?1 i6 j23         _round = rhs._round; 7 `* S& i( y! b( R
24         _isNetByte = rhs._isNetByte;
  b  i! q! w; o2 N25         memcpy(_key, rhs._key, 16);
& d5 F: `7 T' f" b/ ?# D26     }
7 M$ _% J) }7 ?7 q: P. N27     return *this;
7 _4 Q* f8 Q  D# {+ I6 F28 }
# C0 ]* G4 w% Z3 g! p$ |: _29  ! O' Y4 [- w4 K* Z) z5 t
30 void TEA::encrypt(const byte *in, byte *out) {
& q& X. y9 k. H  a- e31     encrypt((const ulong*)in, (ulong*)out);
$ X3 V6 u8 \; e' b; p& Q7 v; R6 Z1 D32 }
# C' o( L9 H* z8 Z- G$ H9 n33  
0 K+ ]! `, g( N5 J- L34 void TEA::decrypt(const byte *in, byte *out) { ! I# D! \9 j# I1 p# s! ~' K9 C
35     decrypt((const ulong*)in, (ulong*)out);
/ b6 s. M4 S5 C- B0 S36 }
) U: _; z3 T1 W' m/ t6 t8 j37  
3 y& U2 [% f7 H* W38 void TEA::encrypt(const ulong *in, ulong *out) { $ o* ~" r2 N6 S( @4 y
39  
  V7 Y+ L$ }/ f' D40     ulong *k = (ulong*)_key;
) w$ [+ Y* p( I" U# E4 Q. _9 ?41     register ulong y = ntoh(in[0]); % l3 [/ s+ c. \0 o
42     register ulong z = ntoh(in[1]);   a& m( n. x# B9 J( i2 `/ G0 R! z
43     register ulong a = ntoh(k[0]); ! _  ^( J1 j0 p* O3 z
44     register ulong b = ntoh(k[1]); ' o3 g+ m5 r' _- o
45     register ulong c = ntoh(k[2]);
! m* l7 Q& V" j7 H7 n46     register ulong d = ntoh(k[3]); - i2 Z- Z( I" t! Y- s* |/ l2 E
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
( Y3 X2 x! v% \48     register int round = _round;
( f: b& z8 P% U3 r! K, b( ~49     register ulong sum = 0; / L; b% {8 l! T, j3 y
50  ' ?) z0 S% m) s
51     while (round--) {    /* basic cycle start */
: A4 B; I8 `+ m1 C2 U0 t+ ~) R( n52         sum += delta; 0 I# t" c# v/ v* W  R
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( y. z7 \6 Q' w; A0 O; x  v" W54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
- D& X. p6 M% `1 R: |8 K7 o0 T, Z55     }    /* end cycle */ % n1 W& i! n/ e- j. c) Z- l
56     out[0] = ntoh(y);
7 l5 b, w0 e" \- w57     out[1] = ntoh(z); ; b: j' y9 m2 Y) l9 [
58 } * `( W& d+ X9 _$ ~5 }- j+ p
59  
. E! a0 j: i# O) T4 v6 i4 n& v60 void TEA::decrypt(const ulong *in, ulong *out) { $ l" f& j! u& X
61  
3 W" X9 X. l4 C4 q; p7 {62     ulong *k = (ulong*)_key; # _; @. E6 V& C" [
63     register ulong y = ntoh(in[0]); 9 S4 m1 ?! U2 z, T" X
64     register ulong z = ntoh(in[1]);
2 t+ @+ `+ x9 n) L% P' V& ^8 L" s0 ]65     register ulong a = ntoh(k[0]); ! W2 k. V0 }( s+ r. N) H
66     register ulong b = ntoh(k[1]); % j! ~5 S8 ^+ A( a& U
67     register ulong c = ntoh(k[2]);
9 B& ]4 R9 }: z$ s; M* o' H68     register ulong d = ntoh(k[3]);
% q$ ^+ Z: [8 o/ N8 X69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ( o5 U; P' I% V  J
70     register int round = _round; 9 k4 b$ _# b* L3 E9 K& m, Y# G
71     register ulong sum = 0;   z) ?; y8 S& M
72    p; O0 _7 |* x6 }- d% ~
73     if (round == 32) ( Z( ]" W: x$ d) |
74         sum = 0xC6EF3720; /* delta << 5*/
; y& t3 ]1 y0 A2 S3 ~5 t75     else if (round == 16)   ~: S$ ]4 `/ L" v7 V
76         sum = 0xE3779B90; /* delta << 4*/
* l# ?; f# I( K$ S8 N; S- m: t77     else 4 f. D1 K- t2 }8 _
78         sum = delta << static_cast<int>(logbase(2, round));
: M' v% m  C2 B/ p* Q79  ; S7 z- w$ A+ A6 H8 h$ k
80     while (round--) {    /* basic cycle start */ 0 ]6 a4 `) u# Q1 C
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , h& ]: H1 ]! r* s4 r8 @0 Q, C; T
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
9 Y; \' D, u5 I  @, u; H9 i83         sum -= delta;
5 N3 K1 g- M" r4 W4 }/ K. }; {$ r# A84     }    /* end cycle */
# s: \& N: o4 ]# M. V( U5 C85     out[0] = ntoh(y);
3 G( o/ h6 k9 U8 g" Q/ v: X9 s86     out[1] = ntoh(z);
+ `$ `* t# c1 ?$ `6 W6 M& ~8 c87 }- |& E7 L* Y$ S
7 |" o" Q# s) ^' O+ R8 @- Y5 D1 i
需要说明的是TEA的构造函数:
" d/ Q* S+ S# E5 u. Q* z% rTEA(const byte *key, int round = 32, bool isNetByte = false); 7 I/ O5 M& T& C9 j: E! a. q
1.key - 加密或解密用的128-bit(16byte)密钥。
. y/ Y* B, g3 z$ p$ v2.round - 加密或解密的轮数,常用的有64,32,16。 4 [. B+ d( g! {" e9 L) x* B
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
: b5 v* R3 r# P( c; Y
" z- }+ Q! r0 D: D: q0 q4 z最后当然少不了测试代码:
回复

使用道具 举报

发表于 2010-1-19 20:01:04 | 显示全部楼层

test.cpp

1 #include "tea.h" , g% n/ x( }* D4 X% b* |; M
2 #include "util.h" 8 A- Z( N9 Z9 P* g2 k$ Z
3 #include <iostream>
! ^3 v/ Z2 P, z3 q! e. X% k 4  
8 r* ]/ e' R  t# { 5 using namespace std; 5 W+ D6 n" e7 N' U
6  
# q9 |2 s; {( U+ y 7 int main() { 4 \8 C, l# ]) V" n2 A) M* ]
8  
+ V/ M; ?. w1 {( M8 _ 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); & @! E& b6 L& x2 V/ N+ T8 A# N0 J
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
0 p0 X# l8 s4 O( S11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; , n% \+ k, n8 c1 h+ z
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
) H4 S$ @) Y* b, t. R5 L$ l2 q13  
( G7 M% N) W- \. B14     size_t size_in = hexStringToBytes(plainStr, plain); ' S+ ~: [8 H( b6 W5 P* J
15     size_t size_key = hexStringToBytes(keyStr, key); ; R) @7 W) Q. p5 V
16  
5 {. Z, I- {! ^17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
& |$ H; x3 G( X5 u# Z+ r/ \18         return -1; # b: |: ^+ s1 S/ @9 [5 l
19  
0 L4 [& J, y8 R% G20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 7 e3 [/ f7 c  @2 r: z, M8 `
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
4 I: [" M5 P' a  F' l22  ; g+ v& t/ x: u* W* i. t
23     TEA tea(key, 16, true);   m. D& T  ^4 @1 r
24     tea.encrypt(plain, crypt); 9 h5 d9 v9 X- e: a( D, s
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
) d0 E) ~* Q2 R9 g( N* F26  
1 N" o% Q! T3 p27     tea.decrypt(crypt, plain); " t2 P8 g( i2 ?3 @! [8 c) [0 m
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; : |# y, }% B: [2 b# R
29     return 0;
, a/ R$ f4 P% p; ^3 F) f30 }
( H4 z, H- e! a) e/ B- [) M) g9 O  U# U7 w( ~0 h6 J, h7 ]! G
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
! E+ a$ m4 P: D6 X; K运行结果:
+ b4 y& B+ b* HPlain: AD DE E2 DB B3 E2 DB B3 8 \7 P. }  _- R, Y
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
/ k' E+ T- @' l; V9 U2 zCrypt: 3B 3B 4D 8C 24 3A FD F2
/ s  B7 e! {" CPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-12-11 13:10 , Processed in 0.020755 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表