找回密码
 注册
搜索
查看: 37487|回复: 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轮):
5 o0 p1 T7 I8 g; U$ u8 P' ]微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
, Q2 y) J, |, g' Q" X5 `' B- ]* a4 cTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 3 w$ I) x/ N3 x
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 9 f* @5 R) [5 _% k" C) N0 t
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 / u( Q9 r0 ~3 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. 0 _5 u( N3 i1 o7 B
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ) x8 l" o! ?% H3 [
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 3 N% N% y; g$ m* J5 v$ i' `* w
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ - k. d3 `! r* r* M% ^$ C( i  q6 W3 G
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ ( K. ], d% y8 o$ i0 C* z
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ % Q4 p, w$ F+ `' Q2 ~; l; _* |& T
  7.          sum += delta; 9 s2 o' l- o  M. a
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 8 x/ s( f, i0 ]  b2 ^
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ + S- |! z' w* E( D; f5 N
  10.      } ( A( a& A# x+ p) X
  11.      v[0]=y; 9 Y: ?  [* Z6 H+ \& B2 e5 I
  12.      v[1]=z;
    ! n- O; a. b* z# A. u! O6 h
  13. } 9 Q5 p6 a7 c% o( R1 z
  14.   ' n6 Y5 _. }- K& S" h
  15. void decrypt(unsigned long *v, unsigned long *k) { 5 I! S% a7 V6 [' S) K, ~( _, X
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 3 Y  e3 Y% `# D1 D: u1 I: y, R
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    9 o: `: n( d" s, |) i
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    8 o# L) ^8 B+ `9 m; E
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ! O2 r0 M0 o; J8 z7 W1 @
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    5 b3 H5 ^# c8 h$ u
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    5 G  h( y" n) |
  22.          sum -= delta;                                /* end cycle */
    " A" G" N+ j' ?5 [: H
  23.      }
    : }2 Y- F2 M3 e6 I/ {: [) _
  24.      v[0]=y; ( a+ W' h9 V6 ~4 q0 P8 k
  25.      v[1]=z;
    7 x/ |. e, E1 Y; T# m/ B
  26. }; i8 o/ {. P- P! ]& O! q
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
1 Q. p5 w. P8 n" j* |! Q#define UTIL_H
' k) Z% S" K/ {. @, P. w2 @
9 m" c' o! R/ j  A5 K7 i#include <string>
% ]- F$ r, k1 L#include <cmath>
& a5 R( f* Q: u+ H& o% x- r#include <cstdlib>
3 V0 S# A& J. x. c
5 s9 X) F* d) otypedef unsigned char byte; $ P7 ?1 C/ }% T8 V2 l1 ]2 t" V6 \( n
typedef unsigned long ulong;
) f; L+ D& h- m# D0 k$ ~
7 ^7 T3 ~1 [, m9 yinline double logbase(double base, double x) {
0 a$ v, ~! F' c6 d  p  K    return log(x)/log(base); 4 r# p, F3 ]8 S/ k- C% \+ B5 w
}
5 v5 M8 R/ y3 h( h- C" ?$ g3 T
5 V4 Z7 N3 x: O/* . u: ], m6 g+ }8 v  _
*convert int to hex char. 4 s, x) _% N( ^5 z7 A+ [) {  i
*example:10 -> 'A',15 -> 'F' ; p0 D/ M) f0 R1 ]$ q0 I9 Q
*/ & H/ @! y. v7 {3 _( b2 I
char intToHexChar(int x);
% O" N3 @2 g; C  ]6 M/ N8 Z
6 b$ X, T" L3 a- c/*
( H4 O6 X- p4 M5 w/ c& h1 O*convert hex char to int.
) o+ L5 w4 t0 s+ T7 A- L*example:'A' -> 10,'F' -> 15
: w$ Y& \' \% g" j. I7 j% _/ L3 F) ^*/ 7 q6 K; t/ ]1 q3 |) `
int hexCharToInt(char hex);
. l  z1 `3 m/ ^( V 5 S' Y) z0 k1 u6 J" l8 c& e
using std::string;
. s+ o  s# F5 V* s( F/* ! {! _' m, V9 I2 y4 V) F
*convert a byte array to hex string. # @0 E7 S! j9 f8 F+ N
*hex string format example:"AF B0 80 7D" 6 j3 {1 C! N9 d
*/
8 m% P+ Y" [, s# Ystring bytesToHexString(const byte *in, size_t size); ' A! Q0 Y2 d7 h) U) Z
$ s" g. Q2 N8 D3 e7 Z0 W- s; r
/*
! a1 m! w  x& ^* r*convert a hex string to a byte array.
/ S3 d' f" h1 V) }8 Q0 J*hex string format example:"AF B0 80 7D"
6 W/ Z) z2 A8 u( z+ V7 W# y/ |*/
# ~/ ?, m1 [) r% M9 B* E/ ^size_t hexStringToBytes(const string &str, byte *out); 3 z" L3 a% ~8 d4 }0 |2 U- s) ?* P

( ^% P1 G  \: j3 B% X4 u& ^8 z0 C  E#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
: O& O4 W6 }% ~+ U) ]% S, R3 p& d0 l5 f#include <vector> 0 N, ^$ I0 G, k$ i. [

# R; z+ \& `! K# U! |$ k& }1 Q  ousing namespace std;
7 W- @$ {! d7 c: b
( G. @1 u9 E8 b( ]% r  o. qchar intToHexChar(int x) { - Q( {1 |* ~! _
    static const char HEX[16] = { / W! @( j4 }  G7 a8 R
        '0', '1', '2', '3',
* Q; [, _" T/ [8 J. b4 A        '4', '5', '6', '7',
( }. f$ h* t  O7 A: r        '8', '9', 'A', 'B', ; P# p5 z& g- G9 e
        'C', 'D', 'E', 'F' 2 v4 v6 s9 [1 l6 L
    }; % [  [# M5 N2 b1 O. [
    return HEX[x];
5 e! K% _1 C+ G, f: `: W3 A}
5 b' N) Z" g( g. z
$ M6 M  ?  p* F3 ]% V$ A% Cint hexCharToInt(char hex) {   Q) V' d1 U1 R; J- B; v
    hex = toupper(hex);
4 r5 Z7 b. V' W, `$ p2 _    if (isdigit(hex))
2 h4 k, I! y9 I# R/ a        return (hex - '0'); 4 j) I. O& A% o
    if (isalpha(hex)) 8 x; c! j8 ?9 a9 Y6 |2 K" H3 b0 S
        return (hex - 'A' + 10); 4 N  w" b; [& A$ e
    return 0;
- k* }. L% @7 _+ ~}
' N& e/ y; L: V2 K) H! | % c8 }: ^' s% t8 i* {# u- ^
string bytesToHexString(const byte *in, size_t size) { 4 r3 O; h5 V% U9 ?0 o' x* j
    string str;
- w: ~, A1 L1 Z, H# j1 i    for (size_t i = 0; i < size; ++i) { ) R* r3 N, `. e/ d+ }& t) a8 k  H
        int t = in[i]; ; l$ C" b7 ~$ J, v0 {
        int a = t / 16;
) w* N: K9 M  v9 ^9 A6 m        int b = t % 16;
) R5 S1 j$ L2 a: n; @7 f        str.append(1, intToHexChar(a));
! u! l/ S) n& h2 p" `+ t6 @% Y( r        str.append(1, intToHexChar(b)); " J: A0 k$ P; R* j7 m9 ?' ~
        if (i != size - 1)
  }  f( A7 g# N% }; h. v            str.append(1, ' ');
$ E) g' o$ D% B% E1 U    }
) h8 i* ~6 u" F' v6 y# y$ j( w    return str; 8 y! u# u7 ]1 X$ Y; c
}
: L3 p7 C1 y1 k6 X& \0 D8 X' E " O3 X$ E" B1 y; o  q' g
size_t hexStringToBytes(const string &str, byte *out) {
" i1 E" U" I, C9 Y
3 j6 A5 q. _0 C1 j6 [    vector<string> vec; 6 m5 |( Z& u2 ?' j; [
    string::size_type currPos = 0, prevPos = 0; # D1 ?  V' x  _- q/ K6 V
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
7 e# E5 B$ L8 ^& h" M        string b(str.substr(prevPos, currPos - prevPos));
. C) U4 N5 U1 a        vec.push_back(b);   M, y" ~) L) r/ ?0 U0 E" r
        prevPos = currPos + 1;
. J+ ]/ t+ m; {2 D' u    } * P0 x% m9 K, ~! M( B/ L, @: t
    if (prevPos < str.size()) { 4 z- }0 I4 |. C0 D
        string b(str.substr(prevPos)); 4 e2 h1 S( [. g( F' x+ Z- y
        vec.push_back(b);
9 q7 n0 W% o& c+ d& ]    } " f& x$ Q  \) \: z) T: V
    typedef vector<string>::size_type sz_type;
% F6 I+ ]4 j  K8 R, h$ ^! }    sz_type size = vec.size();
# a* K# M2 d5 P/ P# [    for (sz_type i = 0; i < size; ++i) {
2 Z  Z: M/ p1 E( ^9 s        int a = hexCharToInt(vec[i][0]);
. n! W1 t4 p6 z; o/ b/ L% _( A        int b = hexCharToInt(vec[i][1]); : ]5 G! R2 }! @' _; Y) _( l9 Q3 b$ y
        out[i] = a * 16 + b;   S5 J# \/ g6 t" N5 `
    }
4 O: @. G9 ]& D, p- G    return size;
; ?* s7 D$ {4 t}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
5 E" |6 h! w! ~4 G#define TEA_H
0 \$ J# N4 p; Y' n( U1 |1 C : a5 ^5 L8 t8 R% l; ?- ~
/*
3 f/ q0 m& l$ L4 q3 L; J*for htonl,htonl
7 x) Z0 m  o) g*do remember link "ws2_32.lib"
- Y2 O6 v/ ]- C. Z  K' F*/ # I# t% ^0 v; Y
#include <winsock2.h> ; s  }3 N. B7 k7 U6 ~
#include "util.h"
5 [4 B& N3 f( X $ b6 T% B+ a' K5 y+ C5 L( b, B0 x
class TEA {
& h; s9 {0 d" d3 N5 x) ipublic: . x, Q4 [5 `$ T( l& k. L
    TEA(const byte *key, int round = 32, bool isNetByte = false); - m: s( O' F9 d& b
    TEA(const TEA &rhs);
) _# m& d! r4 h8 ?    TEA& operator=(const TEA &rhs); - `8 u, ?! a& a! R( K$ ^8 }( p1 @8 A
    void encrypt(const byte *in, byte *out); + h* V) V# m1 [2 N' J/ }
    void decrypt(const byte *in, byte *out);
( V1 s8 Q( A. E& iprivate: & O8 b; P/ F' b! I$ J  Z$ P
    void encrypt(const ulong *in, ulong *out); ; E) T" S5 v; q1 s8 q
    void decrypt(const ulong *in, ulong *out); # r3 j  S& F" o  V" s  j
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } * S, w% p# J" n1 ^5 W
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 2 _9 D; |% H" c4 `
private:
, t1 v  u( R7 E3 ~    int _round; //iteration round to encrypt or decrypt + P; r* {: {; P( w& T4 W8 o
    bool _isNetByte; //whether input bytes come from network 7 C! s* k3 `) h
    byte _key[16]; //encrypt or decrypt key
; b3 }$ @* V; c}; $ m& }# z0 {7 l) a$ e7 {
1 Z9 ]0 f2 O3 r! l; O
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ' B* L. n- u0 Z. n6 k6 R6 e# V
2 #include <cstring> //for memcpy,memset
! \$ q2 Y, h& c( ^0 L  ]- e 3  , G, m/ a3 i& S% }5 G
4 using namespace std;
7 V  |5 ~: c% j4 o: r 5  
1 s  ?& z% I) o  k 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)   m1 Q  U8 ]& E" L# K7 B$ M
7 :_round(round)
) p8 h* f/ q4 S* {3 o4 g& [ 8 ,_isNetByte(isNetByte) { , a2 x  ^$ b8 h- `$ l( X2 v
9     if (key != 0)
2 Q3 J* X% _2 @6 N4 n+ T/ y10         memcpy(_key, key, 16);
3 t* X. m/ L7 i2 o1 |- x4 Z2 L11     else 6 B" I; Q5 i& |4 h% n! o
12         memset(_key, 0, 16);
- B/ l5 Y# ?6 N# \9 Y( R" `/ f; O13 }
: l9 O( `. h( k4 X14  
9 R( \5 y+ k. G5 A/ C$ N. F15 TEA::TEA(const TEA &rhs)
0 S* R+ L  [) E; y16 :_round(rhs._round) - H( B7 i9 m9 ]  |' K; O- W; d
17 ,_isNetByte(rhs._isNetByte) { 3 _# _, |( n7 D
18     memcpy(_key, rhs._key, 16);   j0 M8 M* i( {: l
19 }
1 B! _" {4 n9 }% M2 x9 p20  $ l! I0 [7 h8 r) `
21 TEA& TEA::operator=(const TEA &rhs) {
1 t7 W8 Y9 z( z3 [' v4 E22     if (&rhs != this) {
& w0 q7 b6 s+ B: O% t9 r5 o23         _round = rhs._round;
# O. W: f* t+ }3 T24         _isNetByte = rhs._isNetByte;
3 ^0 V. D3 m+ i! Q6 v) T. u; ?* d25         memcpy(_key, rhs._key, 16);
8 D9 n4 @2 j  O( I, V26     }
0 u; M* W8 R6 L+ {2 i: I$ P; f$ n27     return *this;
# q& k# O: z* @" V0 Q; D( P28 }
& e7 k1 n8 J. U$ u29  ( N: `8 p& W, I! q0 T( A
30 void TEA::encrypt(const byte *in, byte *out) { # b4 b5 ]4 h5 O& m: d7 N5 v1 W
31     encrypt((const ulong*)in, (ulong*)out);   x1 n% M$ ]6 W2 \, h0 o
32 } + b# M/ r5 ]! ]7 H3 x
33  : ^& T( W; W# P- z  A6 J! ?: U! ?
34 void TEA::decrypt(const byte *in, byte *out) {
" `9 f2 a. E' T" w6 C  Z35     decrypt((const ulong*)in, (ulong*)out); / w( \% `# k3 X- r
36 }
1 ~, ~" s0 O# p+ V37  2 r$ _, j# X3 D* d. `* S
38 void TEA::encrypt(const ulong *in, ulong *out) { ' K- A  e% j5 W  l+ B1 b( p
39  ' B9 r2 ^& g" f- J" `5 V0 O  e, v
40     ulong *k = (ulong*)_key;
. s7 [2 ]; g0 D41     register ulong y = ntoh(in[0]); 6 M2 Y% p, H3 D7 s0 o/ a( ]8 T
42     register ulong z = ntoh(in[1]);
6 b9 F5 f. \& Q9 s3 K6 ~( g: q43     register ulong a = ntoh(k[0]); ( n4 _* ]3 }' Y
44     register ulong b = ntoh(k[1]);
$ K* v' b- X1 w/ j  s% @% i45     register ulong c = ntoh(k[2]);
9 i, X4 x; o& {" ?46     register ulong d = ntoh(k[3]); 3 i, h8 W4 E5 @- y# y3 W/ u
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
! a) `. v& I* u, B+ m! @48     register int round = _round;
' i* x. }' e8 d- J. B49     register ulong sum = 0;
5 `6 D4 E  f! X' O- e: i50  
, y* L  y7 x7 K, Z. [! O) L51     while (round--) {    /* basic cycle start */
) b4 Z2 g+ D1 s, D2 K52         sum += delta;
  C3 k/ [( \5 F4 \2 i! L, g53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
% a( I; H& N  C6 z$ H54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); & Y5 W4 c( G  |! x
55     }    /* end cycle */
- U! y# l0 F1 W56     out[0] = ntoh(y); 8 a5 a& z  P" H$ T% g3 Y% a
57     out[1] = ntoh(z);
& G; u' c; ?$ M. v58 }
8 I1 _- m6 j/ }: I1 ^8 Y' n& Z% N0 t59  
5 L  P; z$ A& w( J/ T- m60 void TEA::decrypt(const ulong *in, ulong *out) {
0 w! S' |( R' P) r% J: }61  . f% g4 M% y1 c
62     ulong *k = (ulong*)_key;
  R$ L8 ^8 O- d' j63     register ulong y = ntoh(in[0]); 5 F0 n" I) N1 R! q7 P
64     register ulong z = ntoh(in[1]);
3 c# P. `& U% L' d/ Z4 J* O65     register ulong a = ntoh(k[0]); ! H2 |5 x) a; L
66     register ulong b = ntoh(k[1]);
3 w1 n5 z. y! h: P" i67     register ulong c = ntoh(k[2]); 1 H1 F7 v9 _' [: `
68     register ulong d = ntoh(k[3]);
6 Z, [0 @8 ]0 o0 m: f9 m69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ! y* A% I1 {  z8 g( O
70     register int round = _round; ) V- A4 y3 v% ?! ~: C
71     register ulong sum = 0;
3 o/ H. \4 p3 i( [72  " ]% [! A" e+ F) B+ f
73     if (round == 32)
6 a3 H( n) c# N& Z6 m: I74         sum = 0xC6EF3720; /* delta << 5*/ 8 p3 u9 a. F% Q4 v7 j; A3 a- E
75     else if (round == 16)
3 `1 o. z9 Y0 V  Z76         sum = 0xE3779B90; /* delta << 4*/ / \6 Q( L. Q/ p" T, T6 t
77     else # W* m5 v0 r4 O7 \/ x6 F3 d
78         sum = delta << static_cast<int>(logbase(2, round)); ) B& w' r) T& m7 C
79  ! Z' F; F. N7 {7 A- r% N" y, q  j
80     while (round--) {    /* basic cycle start */
/ K5 t! J6 V1 c, M: i7 q81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
1 t' d. H7 W5 _0 Q. W82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
" U3 @# ]' ]4 U9 `83         sum -= delta;
, _) @. c: ]& H. U84     }    /* end cycle */
7 H0 A+ `' _* O. |8 N  f* f9 y85     out[0] = ntoh(y); $ w5 @1 H. v9 K. ?+ y
86     out[1] = ntoh(z);
7 ~4 Q$ r2 y9 K3 R' p87 }
7 v. C, p5 H+ r, U! I" Y" [9 |1 f2 |" F* K" T
需要说明的是TEA的构造函数: # M. c- [0 M" \1 n) G3 s
TEA(const byte *key, int round = 32, bool isNetByte = false);
+ O- ~1 {. t7 b, \1.key - 加密或解密用的128-bit(16byte)密钥。
3 Q) L9 j) y, I3 f# V# u2 j2.round - 加密或解密的轮数,常用的有64,32,16。 7 O& y1 T9 R' C% ?) k- a
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! $ `2 k  s( b- `6 x

) o" S0 K& i( C9 q9 q5 r最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
- l1 E2 C* C( `6 Z; g  @ 2 #include "util.h"
0 w) r5 |$ k' p2 ]2 y. _ 3 #include <iostream>
7 I0 p8 `1 K6 c 4  
% D. {8 v7 a. l 5 using namespace std; & X% K* Y, Z2 v( \0 I; ^: |& D
6  
7 q, C- U! @2 j4 l# P 7 int main() { / p- u5 L% q1 d  m
8  4 o& y) S$ q+ t* S: h1 j/ E& E
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
  P* n) S. B; I# G: b5 W) I7 E% b10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 5 C6 V  n0 F) w( ^# K2 V+ o/ ^
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
0 D( p7 ~2 `& h12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ! O  [( R; u3 v  `/ `; b
13  
) A% @1 j1 @! c" G* w6 I14     size_t size_in = hexStringToBytes(plainStr, plain);
$ O' q8 D' Y+ y) M7 C15     size_t size_key = hexStringToBytes(keyStr, key); $ _' @/ s2 h/ h, L4 F; ^# {
16  ! b/ j! K8 l! f$ i: ]0 H
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
6 h% [6 c; `6 G. |0 O18         return -1; 3 @: }+ @; `' N( a) a
19  $ _* J/ Y; h1 c; p' O% m5 _- S
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
% p, [' f* D; e, Z8 O3 F4 h' B21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ; p( {8 s3 ~$ S3 E0 S
22  ) Z  @& D$ \+ q% }; }+ T( K5 a6 Q
23     TEA tea(key, 16, true); 7 u5 v4 d& k! L$ h2 _9 Q8 @0 b+ s
24     tea.encrypt(plain, crypt); ! e+ a( h' E' b# t. C6 a" o, Z" E8 s
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
( N' ]4 F1 G+ f$ [+ D/ @26  ! P- B$ @3 \6 l4 u
27     tea.decrypt(crypt, plain);   a2 o0 R7 J# j
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ' A' v4 p4 x9 ~* d
29     return 0;
6 T$ @6 w3 p5 ~- H8 Y7 n5 w& ?30 }. v5 e; J+ J, R3 [- j6 J: |/ v

+ G! t0 M  ^( g: m' K本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
! s+ P+ k0 r; D" O运行结果: & c1 n, L: W' e3 |$ X
Plain: AD DE E2 DB B3 E2 DB B3
' O, Q/ K  {# V- Y. dKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
( w) U6 K, X8 Y' r" v& {Crypt: 3B 3B 4D 8C 24 3A FD F2
5 m+ t2 }3 J( y% D+ j! {Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-23 15:16 , Processed in 0.026546 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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