找回密码
 注册
搜索
查看: 38543|回复: 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轮):+ H" U% A2 N! I$ t; }1 k  @
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。   W! T) l" s) j: c  O) _
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
% P. E$ ^4 f* O# ?% D之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
- k7 y, ?2 {# U" d) K& e  f在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
2 ]( o7 w" l: d0 W5 e: O9 y在 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. % r, e: f+ Z, H$ L0 N
  2. void encrypt(unsigned long *v, unsigned long *k) { % r  F0 c" z4 i$ R; X2 v2 x
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    & l4 H1 m' r7 G7 s) H( A0 u
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ + K4 n6 j' d6 m, R8 }6 g4 A
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 0 u  p* a" H7 d
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */   G  r5 q/ N: ~+ c  J5 P% }* ], e5 g
  7.          sum += delta; - K$ c+ `2 h( T/ L3 X8 l7 R4 \- b* u2 L
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); , R) k! I3 k6 @& P! s3 T1 U
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 6 \, h( c6 }* ?
  10.      } ( d5 ^( }: n* ^- @8 f5 v
  11.      v[0]=y;
    8 v7 M5 [% t# W1 C& _+ `' k7 C
  12.      v[1]=z; " E6 k* j' \5 X! @9 G. D6 _
  13. } ) J* J7 O/ w1 u) y+ W& N/ V! T
  14.   
    4 U; w4 K! b/ o# H: \7 s- S9 |/ i
  15. void decrypt(unsigned long *v, unsigned long *k) { & L: G( }0 H* q; r& K
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 6 B  h3 ^* e  f6 F) Y- p9 o  _
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    . B& W8 o6 x$ f2 O$ v% o
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ / o$ M; k3 S- X" N2 g
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ - F) }8 X8 x$ h6 p
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 9 P; h% W/ {/ n) u! Q
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    0 t4 A+ z& o% Y  O1 S- @
  22.          sum -= delta;                                /* end cycle */
    2 S6 a$ S/ f- G& }# g
  23.      }
    . ]9 k. `. @" u1 Q4 q
  24.      v[0]=y; 2 x/ W+ F5 d- l/ ]* p9 A$ A
  25.      v[1]=z;
    0 j" h. u4 }# G) y, ?# w3 g
  26. }
    + X: E- i4 g, [
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 9 K' \5 A7 v0 n+ a
#define UTIL_H 7 P: q. O' S+ H0 S& ^

4 e, p  u/ A" [  P2 v. X4 B#include <string> $ S8 Z& o- b7 |- z" X, U, @
#include <cmath> 6 B; w, H$ i* _
#include <cstdlib>
0 \, q' o0 e" ?. v  N  ` 1 M9 T' k$ Q8 R' m5 y/ Z
typedef unsigned char byte;
) j0 o0 _! ~" ?: |% Ntypedef unsigned long ulong;
# U9 `0 f: p. ?' [
8 c8 }! x6 v6 Uinline double logbase(double base, double x) { ( [  p+ [) ^6 @# W5 t9 K3 k
    return log(x)/log(base); ; g5 b- x# ^5 p5 U
}
& P  _  e* }2 ?, Q  X  P
- I6 ]7 I9 ?1 u9 l5 o/*
) \) D+ w2 s' q9 c*convert int to hex char. ; j) `( {3 g3 @. e
*example:10 -> 'A',15 -> 'F'
4 P( u5 Q$ {; n, ]. v' @: J*/ % l% @/ |6 I* f9 f) U9 i
char intToHexChar(int x); 7 Y5 B" D+ v! B1 v
: C) J8 B; j1 Z& b. L
/*
6 ~4 K5 r& Q( p9 f*convert hex char to int.
: X! D$ k( ^7 b( J*example:'A' -> 10,'F' -> 15 4 x7 p2 a7 n( j9 _! n+ N3 B- |( ?
*/ 1 Q7 M" b/ W5 O1 A4 W. R
int hexCharToInt(char hex); 8 ]' ^2 b  G9 F6 N# F

! \. _- P9 z! G- T% @using std::string;
: c; W2 g6 q# y& a2 j9 T- M/*
  O1 P5 ?! O( W. C2 K*convert a byte array to hex string. : d+ B$ }7 T# `7 e: a  C
*hex string format example:"AF B0 80 7D"
5 b/ n- ~: O5 @  {- h*/
# i4 _& r  X) E, t, r! q5 i. dstring bytesToHexString(const byte *in, size_t size);
, ^: `4 i$ i/ `2 u8 e
0 V9 p/ L) V( f$ c8 s' _+ i/* % z& L' N, o( ~7 Q6 g
*convert a hex string to a byte array.
4 [: P: L6 P. H0 @0 s  \' l$ t5 V*hex string format example:"AF B0 80 7D" / |0 {  Q7 @+ N6 q2 j1 y
*/ # s4 i9 m/ R/ n# N2 [' E( \, t9 ^- Z
size_t hexStringToBytes(const string &str, byte *out);
/ o3 y' _% ^# [; M# H( O8 u) Y9 s: d  J   q, |; N# H6 u
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" % D- h. e( ]# f7 C; z# ^5 N6 `1 Y
#include <vector>
' z# R( I1 k# h9 X0 E& a0 R6 q$ \2 D ) m0 n/ G' u, R: b- F
using namespace std; ( j) L6 `/ T0 Y# @9 D; y7 C

" u0 Z% i5 I1 r& h0 L* Tchar intToHexChar(int x) { 8 m6 I. b6 S3 v) Q
    static const char HEX[16] = { 6 A6 z5 {" y* W
        '0', '1', '2', '3', / i) O8 H; @+ C$ w, {$ W
        '4', '5', '6', '7', 9 ?" ^; @+ X3 C
        '8', '9', 'A', 'B', % J, I' _7 |9 e, J$ h, L9 h: E
        'C', 'D', 'E', 'F'
0 X: ?( W8 ^  q6 }+ C    };
" K5 ?8 P  R! U& {  P0 w( c    return HEX[x];
) ^3 x  K. C6 g/ A} 9 L! H: q' \* Z. e
* Y1 V4 s4 w$ y) g/ j6 h& d
int hexCharToInt(char hex) { ; j) M* V" e- B9 r
    hex = toupper(hex);
8 v: l3 }8 L: A4 a- E    if (isdigit(hex)) + h1 ^7 Y5 Z4 {" S8 v' l9 X- }0 B' _
        return (hex - '0'); 4 z9 n! l; ?3 _- D' n3 S
    if (isalpha(hex))
1 a( h3 `% a! f8 z8 ]2 Y- ~) L( s- t        return (hex - 'A' + 10); 9 a# W. s: O9 b% r( \
    return 0; 4 k( p: S) @8 x, r* j) k
}   L! I8 T$ H0 k0 S
4 P: P+ s7 g, A5 _9 K
string bytesToHexString(const byte *in, size_t size) {
2 x" ]& B6 U' ^+ Q2 S! ^) t    string str;
' W& j! B2 k% R# @9 e    for (size_t i = 0; i < size; ++i) {
! r5 g+ m" n0 r5 O. }        int t = in[i]; ( e# d8 `0 s  y& W7 T! P4 G4 s* Q2 P
        int a = t / 16;
8 }+ \, v0 K6 f2 f$ g        int b = t % 16;
' a% M8 {$ c0 ]; T( r0 a        str.append(1, intToHexChar(a)); / y# y, ^8 P5 v( G) X( ~& R8 b
        str.append(1, intToHexChar(b));
& j5 U' ]4 E: C5 i        if (i != size - 1) ( N4 e9 M2 u4 P9 Z+ L
            str.append(1, ' ');
8 S9 d' K0 {. c7 \. l% K. k    }
) D# M$ G: [0 U$ {2 ?) }) B! G, V    return str; 4 m8 o5 r4 E4 ~, _' R
} 2 |6 ^. q& s$ D
9 X* c$ w$ t4 h) ]7 g# p1 A( H, d  d
size_t hexStringToBytes(const string &str, byte *out) {
+ Y0 Q: S: c' r. y5 r8 { 0 k" j' |& a1 s, O5 ]+ ]! t
    vector<string> vec;
' s' d3 f5 u6 q: d, z; ^+ Y    string::size_type currPos = 0, prevPos = 0; 1 G3 ~: k% P/ x; y, D
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
2 e1 A9 L% ~6 X5 O, ?9 c' ~7 [        string b(str.substr(prevPos, currPos - prevPos)); - N) [$ T" M. [% @) Z" i
        vec.push_back(b);
. k: f( l' \1 L4 ?. w        prevPos = currPos + 1;
" Q1 m. ^8 D: S! L    } 8 i( B' `7 Y/ }' J/ F
    if (prevPos < str.size()) { ! D  P3 W, R4 j
        string b(str.substr(prevPos)); 2 M0 s/ p5 M! V- j- l, t* G/ w. }& K
        vec.push_back(b); : I( e5 Y5 _: _8 ^  \
    } 7 J' Q1 g. h# `8 k& f# B
    typedef vector<string>::size_type sz_type; - u- _$ c. H, Q
    sz_type size = vec.size(); ; b8 K: w8 d4 Z4 {
    for (sz_type i = 0; i < size; ++i) {
, F' C4 O8 R+ x# x: @  y2 U5 T3 b        int a = hexCharToInt(vec[i][0]); ; y# |  T( H9 S+ X
        int b = hexCharToInt(vec[i][1]);
4 H& I8 [, {5 y8 X4 H        out[i] = a * 16 + b; " b6 f. |) y8 y' Q& n; p
    } 9 h( }; n% V" N' P0 ~, L
    return size;
8 ^% T# J  r: H+ w" ^- ?}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 9 j9 A3 i4 [8 M  ?4 I! y! X, C1 U1 [
#define TEA_H
5 f4 b: y, ~$ k, S  @" Q: k. ]
0 E1 @6 ]$ @  p& ]# G/*
/ t% o5 J: f& l" ^*for htonl,htonl ' q/ T* g  f/ V" E
*do remember link "ws2_32.lib" " L! h8 C8 R5 w. C9 {
*/
( x( q" {% n. r% h1 j! o#include <winsock2.h> 7 C7 s7 c! p- G7 [! u! K3 |
#include "util.h" 2 m; o& k6 C' y; O1 y
7 D& ^5 n4 |4 d& D" V5 T9 f
class TEA {
( k# P# p1 r! a* ipublic: ' Q8 H3 F8 n3 I& ~* `! t: U
    TEA(const byte *key, int round = 32, bool isNetByte = false);
) z& x2 ?& \( B8 o+ i, C* z) |& q    TEA(const TEA &rhs);
" K4 O: D8 o3 j9 W8 x+ W    TEA& operator=(const TEA &rhs);
' K; l) B" K9 L6 N, N) q! x    void encrypt(const byte *in, byte *out); 9 [) \" x, X9 ~2 Y+ ^& A
    void decrypt(const byte *in, byte *out); 6 ?% G5 k; ]" k
private: 1 J' Y; M, y4 D, J) N  r& Z. l9 J0 p
    void encrypt(const ulong *in, ulong *out); , L, P  |) C; ^- w& o
    void decrypt(const ulong *in, ulong *out);
" M# |, p! |! a; X7 t* l    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
' M, b$ z0 M% z7 P1 M7 I, }    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
& K2 j- R6 t  \  l2 _4 Fprivate: & h/ L5 ^$ X/ N0 N* ~8 _0 ]
    int _round; //iteration round to encrypt or decrypt
+ k  v9 J$ w# H    bool _isNetByte; //whether input bytes come from network # s" G' p7 s5 L( n; b) i" t
    byte _key[16]; //encrypt or decrypt key ' y. n, W9 z. ]% O& K* v
};
# z9 S5 q* W) o1 O3 X
$ P. H2 h% |' F; |* i4 A6 W#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" % W) s3 h  V: c8 \
2 #include <cstring> //for memcpy,memset
; L- E% _- b7 f' J- {! ^ 3  
( ^' }3 A( |; q7 p0 w: [, y 4 using namespace std;
, C1 e4 u, Q. t$ M$ _ 5  
9 {# q/ {* I/ {( g9 `# o 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ' b# V6 n0 N% R) B6 w' n
7 :_round(round) & R2 d: j' K9 I  R1 t2 Z
8 ,_isNetByte(isNetByte) { 9 c% y9 ^( o5 v+ B
9     if (key != 0) & s9 |2 H  O. i! O2 o+ l
10         memcpy(_key, key, 16);
; J* g7 Z! Z7 w, y5 Z/ j& V11     else
0 g, c% ^, \( t1 ~7 M12         memset(_key, 0, 16); . Y3 T+ X+ d1 e& W8 s
13 } 4 m- r9 q# y9 ]  t* B6 g
14  
. a( V2 g0 B" u, T$ s: m; o15 TEA::TEA(const TEA &rhs) ! @/ g0 Z, U' a/ \* Q1 Z* l
16 :_round(rhs._round) . Q9 f# g" D5 h
17 ,_isNetByte(rhs._isNetByte) {
% \" ~% O$ R: W/ @18     memcpy(_key, rhs._key, 16);
- v$ I6 v7 b" [9 A' R" m19 } 3 B% i) I* C9 s( h' @7 A# w
20  * k/ u; @( D7 M- w* o  U
21 TEA& TEA::operator=(const TEA &rhs) {
& p- t0 Y4 i5 n$ N2 a5 o, x0 p! \22     if (&rhs != this) {
/ @. x. Y' S7 ^4 `7 }' O23         _round = rhs._round;
! X# X$ W3 n- y; `# E/ G24         _isNetByte = rhs._isNetByte;
# U% n1 `& W8 b' X, l25         memcpy(_key, rhs._key, 16); 5 M- i  L' R* b& U7 n$ s$ c
26     } 9 I; t5 C: ?7 r5 l- t# [
27     return *this; 8 }1 n) X0 m  p1 e
28 } ! w1 I6 }  `9 v0 e% E9 b
29  1 H+ f% S% L' u% M$ S
30 void TEA::encrypt(const byte *in, byte *out) {
8 u9 Q! R* G8 G1 O4 ^) ]31     encrypt((const ulong*)in, (ulong*)out); # X0 K; @) K; J9 \
32 } - b: j0 c" N; a
33  2 d% g% U4 i- G6 D
34 void TEA::decrypt(const byte *in, byte *out) {
: D( [) Y' B# K* m1 n7 [. j7 h( M& x% \35     decrypt((const ulong*)in, (ulong*)out); ! e5 k+ B7 B* \$ R: X7 J
36 } ) t9 L4 l5 F- t" s% ?
37  
$ G0 j0 K3 x5 }9 k4 a. I38 void TEA::encrypt(const ulong *in, ulong *out) {
9 }4 D8 X) m: V1 \( v) G39  
( N  @) `4 }! c0 v) M- s! A- u& N40     ulong *k = (ulong*)_key; 4 M4 U* n- K3 I- f
41     register ulong y = ntoh(in[0]);
! J, Q) m5 |6 y7 r4 B. ^42     register ulong z = ntoh(in[1]); 1 N: Y5 z6 |) V- }
43     register ulong a = ntoh(k[0]);
" g+ n  j, E& Q# ]44     register ulong b = ntoh(k[1]);
2 A+ X) }( O1 t45     register ulong c = ntoh(k[2]); , b( l1 L6 C8 a/ O$ k
46     register ulong d = ntoh(k[3]);
7 I3 L% t2 O+ }47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: `% v  q1 N/ H48     register int round = _round; 6 f' [# }, U2 }' }. t3 m
49     register ulong sum = 0; - _3 _8 P) Q' ^8 S3 n
50  
* }7 k5 `4 F6 d2 l' P51     while (round--) {    /* basic cycle start */ # T8 Q, m' [* g3 }# R
52         sum += delta; , ?: O) C1 r3 O, b( Y  k
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); * A4 V& U4 H% n1 a: p
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); * M' B2 h7 g5 ?6 h
55     }    /* end cycle */ , O9 ?: k' V1 t' e9 J
56     out[0] = ntoh(y);
  K2 y' V/ N. h- `57     out[1] = ntoh(z);
( r) r( J6 F: @+ X/ `58 }
8 S% X; H2 A5 p  j* n( G59  
3 `. u* u8 C/ Q% e9 E60 void TEA::decrypt(const ulong *in, ulong *out) { & U+ h. p+ Z+ N5 Z9 k8 g
61  
9 F- F9 V; k) Z& t9 X62     ulong *k = (ulong*)_key; ! V$ |) y! Y3 J7 _
63     register ulong y = ntoh(in[0]);
, I3 a0 ?  A2 w% z. N64     register ulong z = ntoh(in[1]);
7 F6 I% A7 Y1 G: s  ^+ o& T65     register ulong a = ntoh(k[0]); 5 z6 I  g' y% Y# v' y
66     register ulong b = ntoh(k[1]);
+ e& B: P" i" s( ]6 \# W67     register ulong c = ntoh(k[2]); ' e; B8 N8 {; Z8 R6 L$ E
68     register ulong d = ntoh(k[3]);
% Q- _8 P/ K- ]69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: K6 s% R2 \' i4 T  W+ E70     register int round = _round; & W( t2 a: N3 X+ o2 D
71     register ulong sum = 0; : t7 A5 D- |7 I$ \: E
72  : D5 h5 j" c/ E6 W' t( p
73     if (round == 32)
5 T+ X) W* o! H6 H' \74         sum = 0xC6EF3720; /* delta << 5*/
# y( J! g: w& T7 o  l2 }75     else if (round == 16) 5 W/ G+ J6 ?$ o6 V6 G. N9 Y
76         sum = 0xE3779B90; /* delta << 4*/
* ]6 O9 q0 N; u1 D77     else 7 _: P; m! a  k- Z- _1 i0 _
78         sum = delta << static_cast<int>(logbase(2, round));
2 Y# C4 q. Z/ r- A79  
) S* \- r- H, G; x/ i$ k80     while (round--) {    /* basic cycle start */
+ Y5 x2 y+ Z8 L4 i$ G+ r9 U81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 7 C& z+ k1 i/ E  R9 c: |) h7 ~$ \
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); / Z8 G: E1 Y8 n! N3 @
83         sum -= delta; 7 ]: R6 x0 A" s
84     }    /* end cycle */ * `7 Z9 ~: h2 [6 K: O8 j
85     out[0] = ntoh(y);
8 E5 x# J/ M# g( f- V) m86     out[1] = ntoh(z); - R. j" E1 C$ \
87 }
9 z5 V- Q5 Y1 U0 m" Q( U1 Z4 Q! M9 z1 D/ m, F: U
需要说明的是TEA的构造函数: , l: }0 ^3 T0 N2 a+ j# _2 ], i* q
TEA(const byte *key, int round = 32, bool isNetByte = false);
/ s) p! b, ^  L" y. w) h1.key - 加密或解密用的128-bit(16byte)密钥。 ) D* X$ L3 }' E6 a6 }+ b
2.round - 加密或解密的轮数,常用的有64,32,16。
5 T: n( x4 h: V$ v+ o0 N- Y3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!   a% o' ~9 f8 S3 Z

& J0 |) c! h1 d6 f7 _" V最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
/ G$ d# V7 U% {% r/ K% r( V 2 #include "util.h" , j5 o3 t% u" e' P3 i
3 #include <iostream>
" q' ?& ^7 k! r( _ 4  
" D# L# L, U2 o- X7 N 5 using namespace std;
3 ~* F" C3 N- |8 }6 n! J# o. N4 r 6  
2 N! A; Q) D' C 7 int main() { + p! H6 d$ x+ _$ o
8  
, z) @% S: W1 y; {, f 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); # o  i6 }1 E4 w, h1 H# R' @
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
5 ]3 m* U, L( ]8 _0 W* C11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
. I& m) Q; H* P/ f12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ; K8 w+ O9 g6 W: Z# m, z
13  + @: Y- P' J/ N' h
14     size_t size_in = hexStringToBytes(plainStr, plain);   M, W7 z) R' l4 p
15     size_t size_key = hexStringToBytes(keyStr, key); - @. f0 Y! }3 R. X
16  
$ I5 [0 W  [" l' ^- r17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 2 t7 A# K0 O" M% g4 w$ o1 G* G# |
18         return -1;
5 i, O/ o/ ]0 _19  % q+ ^: m5 x! L* A& S
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
6 e3 c# t2 G6 t% w9 `4 @21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 8 f; W. r% R% R* e, M
22  5 u. |* i( v. n/ X$ A, G
23     TEA tea(key, 16, true); ) m  L; @- z, V- y/ }
24     tea.encrypt(plain, crypt);
4 ?+ H# r7 T4 ]25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 3 E. y/ K; Y0 b7 L3 J
26  - x& I  d2 a2 Q( [$ S+ A$ l
27     tea.decrypt(crypt, plain); ) q. J3 F, Y% p+ F. U
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 7 e! e2 Y1 s3 o( ?1 |, X
29     return 0; / m! o. C1 `: H4 {8 h2 m7 ^2 U
30 }
9 Z+ X; R; }  ?3 u# t8 k) U9 K: T, x/ {/ n
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
) o# J. r. R* ]运行结果: 7 g7 }# q- X; D5 H9 H3 F
Plain: AD DE E2 DB B3 E2 DB B3 " z2 ^6 C( C% {5 @
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ! X+ c, t% i/ ]/ e- z
Crypt: 3B 3B 4D 8C 24 3A FD F2
6 e- ~& j/ |- j6 RPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 08:00 , Processed in 0.018960 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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