找回密码
 注册
搜索
查看: 38333|回复: 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轮):
/ q  X! |2 w6 B/ }+ Q% l: j- Z) o微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ( E) `- n& d' B$ I" b
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 # K0 [! c" L- O4 ]& j& b! o+ t9 L6 t7 T
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
( k1 ]% ~$ S4 R+ D& Y2 a: U) ?在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
* P& O+ q/ n- b1 q- q/ r. J! l在 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. & ^( L; G% M) V4 j* A( B% Q' x0 u
  2. void encrypt(unsigned long *v, unsigned long *k) {   z+ X; L2 ^! t+ j& h7 \
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    * v( |; p' H7 t1 F+ Z# d3 K
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ / r% n* u) v4 |+ I3 B3 L9 x$ |
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ # z8 i& Q' z& O/ F  L
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) J$ q, Z; j9 j# ~! V8 W9 `
  7.          sum += delta; 0 x) f  R$ `1 H: E  ~9 h) T" d% m+ H
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); , A4 s" x, C, e$ P& r% z4 d* A
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
      o; u4 [5 f, \4 f( H
  10.      } 0 x, E1 V# C: v. T3 E* G
  11.      v[0]=y; ; K7 y& K- i* I* F6 I% \
  12.      v[1]=z;
    8 l  G3 m4 L6 j& g( d% P9 V& l' g
  13. } 4 z) O7 i2 B2 O9 }5 @
  14.   ( l7 L& e6 ^2 Z
  15. void decrypt(unsigned long *v, unsigned long *k) { . ], z- d7 n% h. o, d
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    1 p$ P' q" a$ J! ^
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ * p  q# P: p  F  V/ }& U7 `
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    $ U$ _& a7 H4 A1 m+ s; `8 L
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ' }3 f* F% ^' R0 y9 l2 R! v
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    , K6 }; B& O: B  R
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ; K/ Q2 `+ c  O8 G3 B! E1 b4 U
  22.          sum -= delta;                                /* end cycle */
    2 z9 h' ?  p/ N( B! `
  23.      }
    ) p: z1 r1 p4 c% R
  24.      v[0]=y;
    . Q) A  @5 [2 G, l8 q
  25.      v[1]=z;
    3 m. Q$ O; f2 J, d
  26. }
    4 H: a1 q; l- Z; c4 V) |; c" `
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
: K+ a* V1 z2 U. M9 u# X#define UTIL_H
, H$ r7 z5 f6 ^5 ?6 R. ]: F/ u4 V" l5 u/ }1 G) y  A4 h$ J
#include <string>
% u7 A3 l5 x5 u. x#include <cmath> & B0 I& n$ v- ^0 L/ U. d
#include <cstdlib> : K, h" ?/ `! j/ D0 f& f4 t
- b- J8 ~9 m3 v# c
typedef unsigned char byte;
0 h' C  t  X! etypedef unsigned long ulong; 0 Q, s1 O6 r/ j5 k* N$ O$ Z
7 Q! a! E$ |/ h, v# B
inline double logbase(double base, double x) { , `8 M7 I. \! A1 d
    return log(x)/log(base); ; D& y2 j; ?( y$ @7 h. {
} * _, K- f0 |8 S1 o# m" G( o& y

- ^- u; @' D& V1 l/* / C, ^7 a0 g. e+ H/ N0 }4 e
*convert int to hex char.
6 {, S* A+ H9 ]  j; ]*example:10 -> 'A',15 -> 'F' . z; ~: q( t3 Z# n, a0 d
*/ ) T: I& d& \: y' Z. N& M* C
char intToHexChar(int x);
% v* b5 F# C3 F6 x
% W8 n" |7 j# Z1 h* W  i# l/* " |- N2 E( P/ o
*convert hex char to int.
; f/ l# l" e" M5 N% G. g& _. X, M( s*example:'A' -> 10,'F' -> 15 ! o- c2 `( y8 D% |) O* Z
*/
6 n" [: w. l; P7 [9 X) R, U# }( dint hexCharToInt(char hex);
6 E0 I0 W# V9 ^
, L6 c# ?* T* f( _) tusing std::string;
  s" y% i' q( d3 V; H$ A4 o, j/* * i4 P% i3 m- ~) O! l  H
*convert a byte array to hex string.
; ]. M0 f# `. W& C*hex string format example:"AF B0 80 7D"
. y1 T7 }$ K( ?) J% m, C6 U4 e*/ 8 {& f: Y1 h0 p4 V1 P
string bytesToHexString(const byte *in, size_t size);
( @" k2 e/ }5 Z5 u6 p  g
7 Y0 z4 y# G: @' o# K# F7 i9 w1 t/* ( j9 D7 o0 e+ o" `
*convert a hex string to a byte array.
( Q* a3 U8 h) s8 u) u; _*hex string format example:"AF B0 80 7D"
) W# U# S! T9 w  k*/ " [( F1 B$ b) s. n# l) w5 \% b
size_t hexStringToBytes(const string &str, byte *out);
) [% ]9 B# a% F; ?$ \! |( j
3 C* M- c1 C$ [8 p#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 8 r) }; J! G# w$ b9 Q8 R& y+ k
#include <vector> + U2 ?, H, x1 f

+ z0 S: H) n7 B- s" r/ cusing namespace std;
* M. I7 i9 O$ P$ q9 }( f
3 h8 i1 X; G% b& C  `; o9 A1 o; i4 g& A! i9 Vchar intToHexChar(int x) {
! I; L6 o/ X; J    static const char HEX[16] = { 5 S& I" x; D' \% r' \: @* N; d2 M. o
        '0', '1', '2', '3',
6 q! a! r% u& ~! A        '4', '5', '6', '7',
, X3 v, V& A# }7 o        '8', '9', 'A', 'B', - p" Q+ h- X) H4 t) Y  u
        'C', 'D', 'E', 'F' # c4 D$ V/ b; l' h3 e
    }; 8 Y$ t. a9 f: H  z
    return HEX[x];
" N: u5 S3 Q# j4 e. O}
6 t3 k8 t1 I, w6 r# `( ?
' s. x( B, W+ I5 R& Q" kint hexCharToInt(char hex) {
) G8 J: V" F  g    hex = toupper(hex);
6 _) r- x) P& ^, w    if (isdigit(hex))
+ Z2 G2 `5 ]/ w4 x3 p; n# N) j: A% J        return (hex - '0'); 4 Z9 _5 W* A9 A- j8 ]( m: H7 k
    if (isalpha(hex)) 2 ]0 w1 l  |$ }& T
        return (hex - 'A' + 10); + b" c/ B: E6 S2 M3 G
    return 0;
, L4 l) r, S* `}
4 T, ]) y) l3 ]) ~. T
6 [# M: B/ T$ H( v% P7 M1 b5 [& u7 N  qstring bytesToHexString(const byte *in, size_t size) { : X1 b+ q3 f3 H8 |$ k$ N! h/ F
    string str; 9 Q  a* j$ P) f6 P2 ]
    for (size_t i = 0; i < size; ++i) { + K$ d/ d5 B4 C$ r! j% K
        int t = in[i]; - u- ~" }7 V. l6 N, @9 Q2 p
        int a = t / 16;
' X! f- l* D6 U        int b = t % 16; 9 Q  v" b- C" L0 v5 x( ?
        str.append(1, intToHexChar(a));
# j" S" e" U: b6 F( W        str.append(1, intToHexChar(b));
( k. C, V7 Y7 U  }        if (i != size - 1)
) o- ]7 y( z- f( w            str.append(1, ' ');
* H( z% f  i. I6 j    } / A( g% V) c& m0 d: a* x5 l" |
    return str; # ^( \1 Z- o7 R1 \0 F
} & m- C, q$ x/ _- n& F% O2 f: k

, U. t# N& j" W" w: I: M* j2 psize_t hexStringToBytes(const string &str, byte *out) { ( n& i# ^! s% d
+ q; |' a6 |2 ~: ~, ?
    vector<string> vec;
' v- v7 ^! f# F    string::size_type currPos = 0, prevPos = 0; 0 ^; i- ~! m2 ~# D' ^
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
0 [' }( [" u' o9 A( H. R# f4 q        string b(str.substr(prevPos, currPos - prevPos));
. M) y  h4 }  w6 {4 I        vec.push_back(b);
4 s5 a+ l9 p8 I$ n* ?) x        prevPos = currPos + 1; / @/ z( ]5 u) L+ P& y
    } 5 w3 a& |1 g8 x$ t
    if (prevPos < str.size()) { 4 H) n2 x6 S; o; e
        string b(str.substr(prevPos)); & h( ~" h& v" m! i! m4 e+ d) n) a
        vec.push_back(b);
6 n* m0 q' l3 N+ w3 I6 ?; J    }
) E% P, c# E( Y2 T$ c; A$ _- H* l    typedef vector<string>::size_type sz_type;
: {& K/ ]2 J4 F" T2 l    sz_type size = vec.size();
+ d" ^/ }# e2 W& n# P8 C# J( H3 ]    for (sz_type i = 0; i < size; ++i) {
% r% b# X2 E$ B( ?8 |        int a = hexCharToInt(vec[i][0]); 3 o. M- u, B) H9 ]5 F, |% G
        int b = hexCharToInt(vec[i][1]);
7 X. X2 d  m2 D6 C  u0 s" V: J5 D        out[i] = a * 16 + b; " a9 v# }* p' L; G$ Z  Y2 F6 m+ q
    }
# I$ d, ]% M& ]* E# A    return size; 9 ?6 H* h) ]* l* p2 y9 `7 `/ m
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
" f% ?- u) A, [5 J" b9 n9 C#define TEA_H
7 ~& m3 s- r1 r& J0 ^, a3 `: O6 ^/ ~8 d 7 E9 O" S$ H  U- ^) B2 t% H+ @
/*
  _3 Z/ e+ G3 a) w5 F) u*for htonl,htonl
# O$ b3 C0 m) [4 E*do remember link "ws2_32.lib"
! R* h+ t" Q! T*/
2 v, ^" f/ e  Q  a/ j0 p3 k3 {#include <winsock2.h>
, O* u4 T3 Z. n3 o7 @! `#include "util.h"
8 A0 T0 p2 j7 ]3 a& Y# k0 Y( T
! i* q, \( m$ iclass TEA { * W9 v, w$ P# v6 A9 }8 }0 ^
public: 4 k1 ~; N* G$ V! w
    TEA(const byte *key, int round = 32, bool isNetByte = false); $ H3 i9 r1 _/ U
    TEA(const TEA &rhs); * c3 C- T) G7 p4 B9 M" _
    TEA& operator=(const TEA &rhs);
5 f( y/ G" B  s& F6 x$ i    void encrypt(const byte *in, byte *out); 3 G/ @% H% A! O! k: p
    void decrypt(const byte *in, byte *out);
8 y+ @1 ~1 b& S$ aprivate:
7 p& g4 G- |* {7 F    void encrypt(const ulong *in, ulong *out); - S$ g6 D( d) w! A: x( \. O  N& B
    void decrypt(const ulong *in, ulong *out);
& b: s) p  a( j. N( Z    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
9 H, m) z* k" v    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } / k9 W" }" n% o1 l: @" ~+ x3 E6 n# u7 {
private: ) S# A6 g5 `( p* ]% U- k/ d
    int _round; //iteration round to encrypt or decrypt
) U/ ~2 k8 _9 a3 L    bool _isNetByte; //whether input bytes come from network
1 _" I* }7 W8 Q) f6 M3 R& Z. ?, h    byte _key[16]; //encrypt or decrypt key 5 i& Y2 y  q+ ^
}; 5 z2 s. N9 H. `+ h
1 w- |0 d$ f  g2 \  h- o7 Z
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
8 r) v4 C2 ]$ i! t$ b4 Q' Q 2 #include <cstring> //for memcpy,memset 7 I4 u0 }: q3 `% f0 z. H$ {
3  
% S* H9 P' D( t 4 using namespace std; ; H0 T: _3 J6 T, d
5  " m+ o5 O6 Q- U& s. }! S. r
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ' J$ G5 S; Z8 w, ?7 R2 X8 l
7 :_round(round)
. m( a# B7 N. e2 S2 k 8 ,_isNetByte(isNetByte) {
1 y6 U8 V) s: j/ c  L1 b 9     if (key != 0) 9 s5 h  r5 {% y/ F* @! D& K( F
10         memcpy(_key, key, 16);
3 i0 y) K. x/ X# t11     else
5 Q5 u: s+ ?8 B3 ?( k# o12         memset(_key, 0, 16); $ u9 ~! W$ ?" U2 i7 f. f
13 } , o! f' S. Y+ ?3 v% o, h
14  ' H4 u, Y. J2 Q8 h5 [3 f* n+ \. J5 k8 i4 u
15 TEA::TEA(const TEA &rhs)
, s4 W! c, X( a2 U  v7 @* |16 :_round(rhs._round)
* b, e! t& @- j; z5 I( x- A7 v17 ,_isNetByte(rhs._isNetByte) { 5 z" J8 b* ?: ?$ e
18     memcpy(_key, rhs._key, 16);
! `8 t# S+ \# Y# r" ~19 }
1 i' p# X; d2 p  M4 w20  
, Q; k  T1 _/ v) c( Q21 TEA& TEA::operator=(const TEA &rhs) { ! y& p! I9 [  P
22     if (&rhs != this) {
' r. ?) Y3 V6 S/ Z23         _round = rhs._round;
  W/ U' K6 L1 H+ Q24         _isNetByte = rhs._isNetByte;   y4 Y7 a+ A) u6 g6 @
25         memcpy(_key, rhs._key, 16); 7 E+ a, x" Q+ ?7 }% l8 J
26     }   j0 _  a: ^7 f7 {2 j
27     return *this;
, P! a# c5 Z2 b# R( G7 x5 j28 }
6 t* e; l7 K, C% D% q' p  u2 y: K$ S29  , H* ^- f6 M8 s+ O
30 void TEA::encrypt(const byte *in, byte *out) {
- `5 S+ b9 J& N/ V5 w! E. W( M31     encrypt((const ulong*)in, (ulong*)out); 6 t: `# N" M% y3 }7 a3 [, z* T
32 } ; H& \' z/ i$ D) E! b2 \8 }
33  % q( F9 f2 T0 W5 v9 w
34 void TEA::decrypt(const byte *in, byte *out) { " U$ c; E9 F% |
35     decrypt((const ulong*)in, (ulong*)out); 2 X3 q. E/ S! A0 G
36 } ( U# ^; Y+ U; q- N) Z' x9 |
37  6 h! Y/ R! i( n7 q0 N8 a5 z
38 void TEA::encrypt(const ulong *in, ulong *out) { 6 f6 C2 g$ d7 g* z4 E# r+ r) p. Q
39  ; }3 Q9 k( P1 [0 T7 ~# Z+ N
40     ulong *k = (ulong*)_key;
- [4 `% ?( R3 }8 |% ^7 B41     register ulong y = ntoh(in[0]);
& R. X* ~/ }0 E7 b: C. T  |42     register ulong z = ntoh(in[1]);
* Q- f' l" d4 s: i43     register ulong a = ntoh(k[0]); 6 F( g4 j/ K5 M
44     register ulong b = ntoh(k[1]); ; V( g5 [  i! g
45     register ulong c = ntoh(k[2]);
. J2 x1 y! P. o( k- q46     register ulong d = ntoh(k[3]); ) G% [3 s+ Q" A, P
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */   P% W8 V* L$ a% I0 M; n0 n
48     register int round = _round; 2 ]9 e* \. p) k. g
49     register ulong sum = 0; ; R( b8 \4 ?) `; [
50  ( T' E' M1 v8 J% v9 c' @
51     while (round--) {    /* basic cycle start */ % V7 j/ O. N" ^2 W2 Z! g
52         sum += delta; ! q# G9 D3 w& L- s' B) `: l
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
9 ?- T" u" W$ @) i2 j6 L  }54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
. h! A( B0 S% b* y7 ]  P55     }    /* end cycle */
( _: \3 `% I& T& s56     out[0] = ntoh(y); * n0 F# C, k  J$ ^
57     out[1] = ntoh(z);
! h* j% }! K) s9 s( j/ D8 ?4 d' s) S' Q58 }
0 W/ f; h# }' F59  
8 X$ X# C. |2 b0 G: _; z7 F60 void TEA::decrypt(const ulong *in, ulong *out) {
& T+ _- @: G+ e% M/ l  D% h: {8 M61  4 Z9 L) s& H) J0 @. A5 L
62     ulong *k = (ulong*)_key; 9 V% Q" J- i: B6 }+ ?3 v' n! Z6 F
63     register ulong y = ntoh(in[0]); 5 Q$ H- i! i0 e* Q( L/ e; g1 V
64     register ulong z = ntoh(in[1]); 9 P/ x3 }8 E: u9 a7 t* C0 v* C  N
65     register ulong a = ntoh(k[0]); 4 r, X- F3 v+ h: `
66     register ulong b = ntoh(k[1]);
  B- s$ p. F+ C  C! z) S67     register ulong c = ntoh(k[2]);
. s$ @' h2 u7 s5 \5 t7 ?4 D5 k68     register ulong d = ntoh(k[3]);
& O( E  Q- m+ A69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */   }2 A+ U9 D4 K$ c* D2 c4 e
70     register int round = _round;
+ A5 i  N( E4 f71     register ulong sum = 0; 2 s$ U; G9 x6 Q5 z9 S5 a
72  
8 W" e6 \, N+ Q73     if (round == 32) # [* e; K; d" I5 _
74         sum = 0xC6EF3720; /* delta << 5*/
, E6 L* C5 v5 [' ]/ d75     else if (round == 16)
, }" e& K$ M$ D' l' P76         sum = 0xE3779B90; /* delta << 4*/ 2 q* Q# t7 |* A; s7 i5 ?
77     else
. A( I( L- i" ?6 J& j6 e; X! `, w/ R78         sum = delta << static_cast<int>(logbase(2, round));
( j" N. L+ Q( [$ ]8 R79  8 m4 @  b: u7 {1 o9 Q
80     while (round--) {    /* basic cycle start */ & A  F- }% z! v! y1 t
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
8 J9 ~4 L# k; b; ~82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
5 L% h% T3 ]) M  H$ f9 _2 d83         sum -= delta; 6 q  {& v5 Q! Q9 i0 I7 J, }" M
84     }    /* end cycle */ 4 s, H0 N3 T5 L% Q: t  S6 C- f; ^9 m
85     out[0] = ntoh(y); 6 ^1 \; K& z0 U1 ?7 w1 L$ C
86     out[1] = ntoh(z);   n7 B+ b+ ~/ b. j9 a
87 }6 j9 d& j; f6 O- e

, X6 ?2 K/ z% @- q需要说明的是TEA的构造函数:   N8 D9 h8 R( S( Y/ \: V3 ?
TEA(const byte *key, int round = 32, bool isNetByte = false);
, M0 V, T+ w6 T' J* R0 _  z1.key - 加密或解密用的128-bit(16byte)密钥。
# w4 I; D9 \% `) n: n& Y* H2.round - 加密或解密的轮数,常用的有64,32,16。 ! [5 O; G9 B0 [% X
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! , n/ j4 f( C% o, r

% a8 C' f8 p# Y1 R% m+ m最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
  _% N- k6 J/ g) x: v, h, T 2 #include "util.h"
% s8 c0 |6 L% E$ p 3 #include <iostream>
( e4 T7 p# c. a/ z$ h& n 4  
3 n) @' @! R8 D4 v8 g 5 using namespace std;   t# Q4 K0 s! l2 E+ i6 I
6  
2 o+ E4 w" v- k/ S3 V% P 7 int main() {
4 b* P* y* ^- R 8  
, P) t! a) V; Z5 W6 l 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); $ H$ h& [% i( n  B
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 1 c) b" [8 m9 e$ `
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 4 A8 L+ T+ U: O+ |- F* p, K& u
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 7 X8 W, T* ~: l+ K* J6 P! S+ u
13  7 {6 B6 _: {# q# L, V3 N
14     size_t size_in = hexStringToBytes(plainStr, plain);
. a9 p7 r: L* L  c+ p15     size_t size_key = hexStringToBytes(keyStr, key);
- K3 X9 ^/ Z' T3 N) F5 K16  
: l* k! M' _: \! \# j17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ! S0 P0 j5 e/ N  X# O6 k# g' _
18         return -1;
. y1 N. `; U1 X) k. d+ V. u19  
$ w" K$ c' l" C& ^+ |3 o20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
5 y5 i' X6 v1 O! o- R3 I5 K21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
% L4 ^8 f4 `( I" w+ r22  3 N8 f9 @" n* e, p7 `% l! `( M
23     TEA tea(key, 16, true);
( ^/ m& O3 V, }/ o: h( T7 E24     tea.encrypt(plain, crypt);
( m+ L; Y1 k0 k) G25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; / B1 S; R/ A; P
26  
. x! K' p6 v4 u+ }. p4 x8 v; s27     tea.decrypt(crypt, plain);
# b3 o2 w: a; e% n4 J; h28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 7 J$ j( e% R( p+ g& _/ h! d  F/ K
29     return 0;
, r0 x4 L/ x1 Q" |$ o30 }" \9 A3 d0 y+ x4 A

; D1 v9 `1 _5 h( O6 U5 W; ]本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
  }3 f# T, h( q3 Q运行结果: / b  q3 Q7 F7 u. ]3 |1 {
Plain: AD DE E2 DB B3 E2 DB B3 " [  C  }9 x# ^" G
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ( t  ]& t0 a! ]9 [, `: N" V, z& a
Crypt: 3B 3B 4D 8C 24 3A FD F2
  H; i9 P8 r% q# D! b, g7 U- qPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-2 07:35 , Processed in 0.021456 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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