找回密码
 注册
搜索
查看: 37332|回复: 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轮):
6 J. ?% }1 ?: I7 d. R' T, W微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
  I; }" x8 F0 g. N7 X6 MTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 0 p$ E# {6 {+ z# q4 u
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
  W! r' y0 Z* z  d在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 2 h% O# n' M  k1 f% Z) R' d
在 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. , a) `$ y$ w, [% }/ Z
  2. void encrypt(unsigned long *v, unsigned long *k) {
    $ u$ J1 F! i, n& e& o. [5 b0 y
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    6 j3 V1 t- o- N) X) j
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    , R8 s! t" z" h0 @8 B
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    $ J) _5 Q% t, @5 I+ }9 e
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    . W# e: Y6 D- ~4 W5 t! `
  7.          sum += delta; 9 h- V5 S" x- `; T* H; B
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    5 u: l9 I3 N" a/ v* D
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 2 ~5 B9 R$ h! |# W) Q
  10.      }
    ; i3 c5 _4 t7 t  j( j
  11.      v[0]=y;
    : a6 |7 `# M- K/ c  [( ^& d
  12.      v[1]=z;
    * i6 y, `7 K/ V5 w1 S  S# B
  13. }
    ! k0 \1 w, I8 J. `
  14.   
    ; c6 ~) s  n- L* }
  15. void decrypt(unsigned long *v, unsigned long *k) { 8 N  s# t6 d; ]( U+ d8 m- o
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    " Y, F8 F) K  x8 W& w
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 1 [5 T" G" A2 C" a0 b2 l) d- h
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 3 ?6 b2 w$ c/ n/ _  d
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    - F" p2 h8 O  P3 v( B( |$ c5 z
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); % L* p. {* V, C" f, J8 x% C
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    3 m8 `7 n8 I1 E! k, v1 V
  22.          sum -= delta;                                /* end cycle */
    7 [6 h5 k8 F# Z1 _$ ^- C# |
  23.      } # q  d3 x" a* [% g6 V( {
  24.      v[0]=y;
    6 G5 H* l6 M3 _: r" T+ l
  25.      v[1]=z; 0 _: t9 v# l% S
  26. }/ v1 ]& B" {; F5 S" j( y. n' ^8 g
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
6 Z* m* L8 i% e2 G" {" v4 ^#define UTIL_H * d  F. t4 A( ^' Z( l

3 I* P8 S9 r: ^) \- g- U1 W#include <string>
: a, Z+ _/ N+ Q, M! P1 C5 W+ u#include <cmath>
/ ~# ?5 j4 ~) x: c#include <cstdlib>
* y3 O( d( Q! C9 w" g
6 [! ~1 A) ]  G- j) e2 Ltypedef unsigned char byte; 0 o% N" Y: Z3 _' }4 A
typedef unsigned long ulong; ' H; I, r7 R8 O/ g% `' K
9 L0 c$ u+ n4 Q! J8 j2 `
inline double logbase(double base, double x) { ( x' N; L0 U4 R8 T8 R% d
    return log(x)/log(base); 2 Z9 `. K3 A6 q* c9 @  S; |
} % {$ _) P! j$ b$ r" t0 F- t1 C
5 q  v+ I7 c2 i& S
/* + O% {2 |! q( x! G/ @
*convert int to hex char.   w% ^6 t& o9 {- r% |
*example:10 -> 'A',15 -> 'F' 5 g5 c' p5 s0 M8 K. ]4 f
*/ 5 _3 Q$ x1 j8 Q6 k% s/ C& }
char intToHexChar(int x); $ r& K5 C1 z- I% Y

1 B: J6 E+ ]0 J. U% i% `0 g/* 1 k) b' @: o2 J- J" i& N! i
*convert hex char to int. 1 i. ^" W( q" H" n
*example:'A' -> 10,'F' -> 15
% N' N1 h2 [, B. `, E  c$ r* \2 |*/
8 }9 Y4 ?2 b/ Q" n3 W4 ?$ T6 c% eint hexCharToInt(char hex); 3 g7 M7 S$ L9 H# P% }& ]

( N& g, Q7 p1 e4 L8 _1 o. Musing std::string; " |& u) c- ~+ C
/* " ]5 {4 d; H- G8 Z
*convert a byte array to hex string. 2 L! g/ g* L2 D1 S1 _7 d3 z1 X: [# D
*hex string format example:"AF B0 80 7D" , X# h/ b8 p: Y1 x9 g; A6 n
*/ : y; \/ P' j4 n0 o7 ~
string bytesToHexString(const byte *in, size_t size); 6 {9 M2 N1 t& w3 [( n3 K

6 O9 {- k$ N5 i4 L7 q4 n5 H/*
* }8 C4 m4 @& M' [* I! a*convert a hex string to a byte array. + y% E# i' c5 Y4 v6 z
*hex string format example:"AF B0 80 7D" 9 N7 D/ ?/ Q, ~
*/ / V3 ^# n6 x0 f8 j8 \0 D: A
size_t hexStringToBytes(const string &str, byte *out);
6 _9 {; N# s, {0 X( A  x( |9 ` - ^6 }9 m$ Z5 M% H  ^: f" d& q
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ! g& i2 m& b. v0 |; M4 T; H
#include <vector>
+ f- i! h4 D0 w+ E* o$ X 1 d2 P% X: c6 y/ c, u" L
using namespace std;
2 b- [! Z  N, d0 M  f
4 N, b+ l' A1 tchar intToHexChar(int x) {
6 A) V# L, W6 Z( Z0 w$ O4 P    static const char HEX[16] = { 5 [& B1 S2 h) K& e/ C' M& M0 \4 X
        '0', '1', '2', '3', 8 L3 q& H  |) ?8 r. a
        '4', '5', '6', '7',
+ }$ P. c1 C9 o        '8', '9', 'A', 'B', ; l) r8 f3 _9 l9 u" v  A3 j6 d3 M! J
        'C', 'D', 'E', 'F'
+ v. S8 t1 d: O& F; O: V    };
  O  e; k4 L% a# p    return HEX[x];
$ p3 L% }0 B3 G) P& Q% ]! O* K} ) o. W7 g* c- j& U! o8 }/ C
  Y1 H8 Z4 w3 Q* C
int hexCharToInt(char hex) { , j! b, q6 e5 M! v
    hex = toupper(hex);
+ V' q' O: `% X    if (isdigit(hex)) $ P6 r% T5 S; w! t9 `8 S8 r8 Y
        return (hex - '0'); ( ~3 L" Q/ _& h& R+ {, G
    if (isalpha(hex)) % B6 m+ a& x, u
        return (hex - 'A' + 10);
. K# [: V8 n' L( v* e) w! K0 O+ Q( L    return 0; ! Y9 ^- P0 Y& k# Z; X
} 0 V. V8 x4 B; X$ S
% K4 p: f# _/ E5 s
string bytesToHexString(const byte *in, size_t size) {
/ C- ~+ P$ M( }: W- B7 k    string str; 0 J/ N$ ~7 K& c6 ^! ^) E; L
    for (size_t i = 0; i < size; ++i) {
0 a2 Q/ x3 O. E: @        int t = in[i]; / S5 F; R& D0 ~# N
        int a = t / 16; ) A$ d% d" C7 K+ y" v7 V  G
        int b = t % 16;
6 o: `. {7 }7 \6 k' O        str.append(1, intToHexChar(a)); 0 g- C$ H1 M4 [2 E
        str.append(1, intToHexChar(b)); " i! }8 K8 J. I
        if (i != size - 1) ! E- T3 o3 w  Q$ j1 N. T) w
            str.append(1, ' '); ; K' b3 x% J8 U7 {# e$ h
    }
0 r3 @2 j+ \9 D( N) J  ~4 x    return str; $ t* x) w$ u  U1 F: \% _, O
}
5 X$ W3 @* e2 X. a/ s0 _( I; w
  T. }- o1 }5 g/ ]. }size_t hexStringToBytes(const string &str, byte *out) { 6 g. a% j4 ^  y, ^/ j: q% l' n
/ u7 }7 Q; Z, v# q
    vector<string> vec; $ |; ~. M$ E$ C' b8 I
    string::size_type currPos = 0, prevPos = 0;
; T/ L9 G# G0 h    while ((currPos = str.find(' ', prevPos)) != string::npos) { 5 G; h! l, E; S' ?5 W# h
        string b(str.substr(prevPos, currPos - prevPos));
0 U& r- x1 h6 f7 v( B, H8 ~% K        vec.push_back(b); $ T, ^( L1 c/ e5 I, Z& F9 l: O* @
        prevPos = currPos + 1; - O, @9 G6 j) Y' U
    }
$ Z7 }% P3 |( D& K+ l    if (prevPos < str.size()) { 2 Y/ s0 ]0 D- U$ r0 e+ E3 a
        string b(str.substr(prevPos)); 1 V( E6 t# @/ A* c1 z5 h- i3 v; D
        vec.push_back(b); 1 s4 G1 _' s2 |7 C2 l* Z. Q+ Z& ^
    } . E$ X& g1 [+ {" ~: F- i
    typedef vector<string>::size_type sz_type; , h& w$ y5 I$ ^
    sz_type size = vec.size(); . h% \% Q+ m  _/ n1 p# u
    for (sz_type i = 0; i < size; ++i) { + G+ a1 `4 n: n7 u3 {% e3 w/ D1 \: [
        int a = hexCharToInt(vec[i][0]);
' P3 o4 M+ l9 h9 X4 n2 Y        int b = hexCharToInt(vec[i][1]);
6 I2 z0 e6 k$ h& M+ Q5 X3 X        out[i] = a * 16 + b;
) D7 C0 N& X$ H4 Y1 n8 ~* t& p/ O    } / o6 d8 b, C# t; R2 G8 h# ]
    return size;   F+ Z" g% ]8 C  G1 ?
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 4 w( w9 c1 u3 ]0 m( H3 p
#define TEA_H
9 o; m: G! U2 H0 p
1 S/ A# k5 m" N1 O% \/*
! w) @4 B9 S6 M7 k*for htonl,htonl , y. `2 \. h  C) i) Q
*do remember link "ws2_32.lib"
# g1 o" @6 ^) J) ]* \*/
, N" ]! j" O' i1 C. ^#include <winsock2.h>
% y$ o1 j2 o) d* M, I, q4 m! d#include "util.h" $ _: f6 T1 n0 }* Z- B( k9 K( N$ ?
2 r6 C+ G1 D0 p% |1 v
class TEA { 3 h2 x$ F5 I; J+ |$ ~( p
public:
2 `, h6 B5 D: {0 O  D9 ]8 R    TEA(const byte *key, int round = 32, bool isNetByte = false);
7 o# Q8 f, t( ^4 e    TEA(const TEA &rhs);
0 d' a$ q2 D0 `' O    TEA& operator=(const TEA &rhs); : v- o) u1 O2 p4 W) j1 T
    void encrypt(const byte *in, byte *out); 9 S2 A# n& G4 M  _9 p( Y
    void decrypt(const byte *in, byte *out); " {0 F+ z4 t- A  y; A
private: 1 a0 _3 {7 k; s$ v; _3 g' c
    void encrypt(const ulong *in, ulong *out);
# z9 b  N: s$ X    void decrypt(const ulong *in, ulong *out); . P) C7 b8 b0 Z
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
( x8 X7 S0 s* u, N  u5 J$ a    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
8 G& p0 w- U9 z2 i# M$ ]private:
) C8 f3 Q, Y1 P9 P* o& k, @    int _round; //iteration round to encrypt or decrypt 4 |) m1 b6 \5 d5 d* \
    bool _isNetByte; //whether input bytes come from network
! i" g& i2 ?  w: ?- `    byte _key[16]; //encrypt or decrypt key ) j& e2 G; c" w. D/ u# T
}; & S* X" @' ]/ n) J8 Q4 {
, b% m3 X7 R0 m9 ^7 c2 {2 c5 R
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
6 _1 Q% m/ P" e) G 2 #include <cstring> //for memcpy,memset
5 L2 O, r4 y/ W2 n 3  
% J+ p0 C  `# P 4 using namespace std;
7 M! j6 q/ {& r' w) G+ z 5  6 `9 M$ B- k# X) U% |* C! I3 n8 z
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 0 r  V; R7 z3 v
7 :_round(round) 8 {. z% N1 n" n- w: _. {4 Y
8 ,_isNetByte(isNetByte) { 0 y$ B& d6 n& g4 s7 y
9     if (key != 0) 2 c2 U5 i7 }0 |6 q  A* ]- d' b* t
10         memcpy(_key, key, 16);
& p9 t2 |6 m$ a6 L5 }11     else
' ?! U& z3 M! m* R' _% c12         memset(_key, 0, 16);
8 {. Y: B' g0 X13 }
$ G) x& f4 c% y4 [8 u9 h* N. Y: _- k14  
& f7 Y' _: R  W9 G6 ~9 k15 TEA::TEA(const TEA &rhs) ( }2 v* D6 P1 ^2 B, e3 `
16 :_round(rhs._round) ! ]5 B/ L) e4 o( o" J, X5 X) D
17 ,_isNetByte(rhs._isNetByte) {
: x' e: Y8 L' ~. G! q6 b18     memcpy(_key, rhs._key, 16);
/ i% ~- p9 \5 ~* Y6 q' @/ h3 x19 }
" d1 u; |: e# E0 s20  + Z) b$ K, a, A% W; [# I0 h
21 TEA& TEA::operator=(const TEA &rhs) { 1 d/ [2 i/ }7 U- r: m
22     if (&rhs != this) { : c7 `0 _8 R3 i$ E: C& j
23         _round = rhs._round; 7 u2 F- u8 t2 M$ Q
24         _isNetByte = rhs._isNetByte;
8 R+ \- j/ j( N$ R25         memcpy(_key, rhs._key, 16);
  `  |  A! V5 I0 D, l  \, B' f) ^26     }
% p+ i9 ~2 d$ R( I$ P27     return *this;   P, m, J; _+ ^7 a
28 }
' g' ], ~9 @! ^5 h7 `; k29  - V/ A8 U+ Y, R6 H
30 void TEA::encrypt(const byte *in, byte *out) {
! x" B# h8 ^& \  p& X31     encrypt((const ulong*)in, (ulong*)out); ! p0 z& h+ [  M3 b/ z; R- N% N$ v
32 } - @- g% n3 k" r' @. m* m8 N
33  
/ A" U. i/ s2 p34 void TEA::decrypt(const byte *in, byte *out) { # r: ^& r1 F5 U$ w4 K
35     decrypt((const ulong*)in, (ulong*)out); 2 h# r8 U+ H" c$ V  {+ l
36 } , L; Q) O3 ^8 V" s2 f* @1 P
37  / v7 I0 R  n6 ^+ Y8 v8 L
38 void TEA::encrypt(const ulong *in, ulong *out) {
, O) I4 @; _0 l! p39  
/ n- p! t  t6 H( [% C: [9 c. r40     ulong *k = (ulong*)_key;
5 l8 E$ L, X$ A, W0 Q' x) A8 @' B41     register ulong y = ntoh(in[0]);
4 V  S( A! ]" K& Q42     register ulong z = ntoh(in[1]);
$ v$ P) `* e9 W/ _; o43     register ulong a = ntoh(k[0]); ! e5 d  E3 L6 [7 b+ X* W5 a
44     register ulong b = ntoh(k[1]);
7 Q4 W/ Z( W3 j& D; t( H' |45     register ulong c = ntoh(k[2]);
2 y# a5 x/ O3 B3 K46     register ulong d = ntoh(k[3]); ( g& c. |/ ?0 k3 J# [+ P( x, E
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
7 u  j% V6 d0 _( B  l- {9 f48     register int round = _round;
! I, F6 b& C& q49     register ulong sum = 0;
  j  y: m$ h3 x50  5 A0 ?# L: O' [) x1 v" ~% K7 G; M
51     while (round--) {    /* basic cycle start */
6 L* m! |4 @6 f52         sum += delta;
1 v6 _7 b3 f; l- _. x6 Y53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 0 e, e$ ?! s7 p" T
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 7 }1 e7 v1 Q% j
55     }    /* end cycle */ / Q. p3 v5 g# {' u& ^7 S: R
56     out[0] = ntoh(y);
$ q( w% Y. \! ?# r2 G57     out[1] = ntoh(z);
7 U# _+ V2 D  I3 G+ \58 } % B5 H' U  K/ R/ H& b
59  
; T6 k" f( `8 ~: K* z60 void TEA::decrypt(const ulong *in, ulong *out) {
; {; L% t+ @9 R8 d( o3 P  I* {61  % }/ v0 v0 N/ v* a2 `/ ^
62     ulong *k = (ulong*)_key; : u! ^6 a8 O1 Q5 P" z" u
63     register ulong y = ntoh(in[0]); : R" X7 g2 A7 X8 P
64     register ulong z = ntoh(in[1]); " H7 _. N& w# [, M  ^& P9 Q
65     register ulong a = ntoh(k[0]); / O. T5 D$ A. I$ x
66     register ulong b = ntoh(k[1]); 2 F0 L$ C, I3 G) T5 T: G5 u
67     register ulong c = ntoh(k[2]);
5 X. D3 e6 c* v  t68     register ulong d = ntoh(k[3]);
( j( D3 A) v$ G69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 4 z& |( x& S$ I& i
70     register int round = _round;
- l% \/ ~/ g  K* a9 ^* V2 m71     register ulong sum = 0;
1 o7 L& O# V# B$ Z. a72  1 O. }: t* C) O, C
73     if (round == 32) ; K1 m! w, S" U& i( l$ C4 R
74         sum = 0xC6EF3720; /* delta << 5*/ - }; T: S) |7 p/ R* B
75     else if (round == 16)
6 Y; b5 S/ ~: E2 _4 e. ~) O76         sum = 0xE3779B90; /* delta << 4*/ ( F$ i) b, S$ F6 e6 F) h
77     else / H  K/ P$ w6 k& H. A2 `# _2 n
78         sum = delta << static_cast<int>(logbase(2, round)); 8 }0 D& v1 l% U  k: X' n7 |( q, \+ ~7 u
79  
6 p5 H5 C  `6 W80     while (round--) {    /* basic cycle start */ # D& F, o; H; P5 ~+ ~
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ) x7 f6 c$ l+ r2 n" y, e, k9 @
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ' Y2 O9 |8 k5 h" X( d
83         sum -= delta; ' S! r# \# k' A. E" `; `8 s
84     }    /* end cycle */
& q$ H" W& S" O  z) c; P3 t; A85     out[0] = ntoh(y); & w9 r. ?8 S: s3 w6 _
86     out[1] = ntoh(z); 7 S( B) o2 h4 J  T6 T" g; R7 u3 Y
87 }: @* W% J$ O) x$ `% c1 }" Z" W* }
0 R- w1 a7 b+ x( s
需要说明的是TEA的构造函数:
+ Y0 `0 J, d, H& S1 qTEA(const byte *key, int round = 32, bool isNetByte = false); 9 R$ r( {% ]4 a- K1 s
1.key - 加密或解密用的128-bit(16byte)密钥。 ' K. v# E0 E- T/ U0 p
2.round - 加密或解密的轮数,常用的有64,32,16。 5 \3 {3 R# b9 |0 S; b5 P
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
& S6 h6 W) b" `- ^5 o' D* g4 j
. `4 x+ v0 r  {; N! K% y最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" % P6 k' r  p% i4 [; |: I
2 #include "util.h" , M" Q: D& v( C) K3 ~4 ?
3 #include <iostream>
% U3 A# ^/ }8 @2 V6 U4 }+ g6 Z2 x 4  8 a) H, D& P$ e7 o3 x
5 using namespace std; - Q: X+ R* ]# C7 ~
6  % a2 z" b0 @4 N2 c# t  F- A8 a3 F8 ~
7 int main() {
" ^5 i* W! H$ l$ ? 8  8 K$ X1 Z/ O* t* x
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ( W3 s& l- X' Q# r: V' f- G( f
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); " i" \) ]3 b& [  @  d* X
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; . P* a# e$ j) \' H$ W
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];   U6 b: g1 Z& u5 W
13  
% U$ }3 G& i+ w6 [- h14     size_t size_in = hexStringToBytes(plainStr, plain); 1 v4 L' H, e9 I  p5 }
15     size_t size_key = hexStringToBytes(keyStr, key);
) Q  P- K$ ~7 R; z& e16  
4 e, J. t3 D6 O1 q17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 4 C; w( P+ m: u
18         return -1; + h, m# ?! B+ o3 h( |5 M- L. J5 K
19  & N4 E4 |6 r" Q. O* }
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 4 w9 U- J1 i0 E. t. k5 L- D
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ) }7 b- w' k# x9 x' o& E' G+ x
22  6 e( I9 p  l& I3 S5 b' l( n
23     TEA tea(key, 16, true); 8 T' q# M' x5 M; k0 K, z+ w" `
24     tea.encrypt(plain, crypt); 5 n! ]3 }% F+ W8 k5 C5 B' Q- @
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 8 i0 Y: Y6 `. g8 w/ S! Q3 M
26  ) z9 T3 \, E! P- y& z; R, J
27     tea.decrypt(crypt, plain);
3 f$ e5 Q" T* A; z' X* E28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
0 R3 n' m; r- l  Y29     return 0;
" \! i3 e  ?1 ^3 z# f30 }
: r$ C$ c/ k5 q) h  x, y$ g
" A$ m7 A. _8 s! u本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx! F2 B4 u( f  ]+ f4 p/ `& _0 B% h2 B
运行结果:
7 H1 `2 v" T9 S7 S; L. p- x, [Plain: AD DE E2 DB B3 E2 DB B3
' T+ N# l$ l  d- r. D! H- n7 xKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 8 @+ u; G' f& r" m1 Z9 E8 w/ O! e8 F
Crypt: 3B 3B 4D 8C 24 3A FD F2 1 Z% e; S8 W, k2 C( c
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 16:43 , Processed in 0.020912 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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