找回密码
 注册
搜索
查看: 37802|回复: 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 @9 x9 K  f" r% ^) N. A
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 4 D' p6 K5 Q6 Q2 D: n. g* W' d
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 . d0 s$ G/ l: b0 S2 f2 D4 r  Z9 U
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 . D+ }/ y% a2 ^! q
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 4 V' x+ C; ]; k1 Q; C
在 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. % `" x* a, `! G" _
  2. void encrypt(unsigned long *v, unsigned long *k) {
    % L* x6 q2 q/ J7 z# _, q0 R
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ " ^4 R3 _+ Y( S9 N
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    0 s/ F1 W9 O- X2 D4 D) z- v" ^+ l8 I
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
      R& I, P# Z7 C9 H
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ : b" `( z1 |1 [2 m. z6 X0 Q
  7.          sum += delta;
    1 I  E: E5 B: Z3 H0 x' S, v# X
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); / p5 E/ }& B7 d  F7 k0 m. p
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ & L# a  D  z: Z' E/ s4 W0 M
  10.      }
    " e" D3 Q, p6 ^( \* j0 J  t
  11.      v[0]=y; . {5 x; z4 g$ p7 K  w+ |* w9 X$ G0 S
  12.      v[1]=z; 0 @8 u9 r4 \- t6 }% l  L- m# e' N
  13. } 4 j8 o! |$ g; [1 m: D7 u
  14.   ( B8 z- l! h! q' @% N
  15. void decrypt(unsigned long *v, unsigned long *k) {
    5 n- a( }5 `' A" ?2 M% o
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 2 h, E" c4 B. ^( l; x. w9 o' R
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    * H# g9 C6 f& V+ G; _2 Y' ]
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    0 ?2 G2 y5 A# |; M* P( J2 A% `* p. C
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ " O6 g& y5 O1 n. U- }
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    4 O5 r! g) X: }: q
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 2 s+ J( P3 ~2 ?' g1 q% \
  22.          sum -= delta;                                /* end cycle */ ) f8 }( l0 |3 ~2 ^6 ^) Z
  23.      } - {! W! b1 R2 S: O9 l# |
  24.      v[0]=y; ) V. y2 F* P) ~1 A( I" K' B: n4 ?
  25.      v[1]=z; 1 w2 v) I7 M8 k1 @; O" _
  26. }. M  d# |3 ~! w
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
: _) ]3 Q- i, }3 A#define UTIL_H . c1 c5 ^. B  O( j, x! f# h
3 y+ ]$ b8 m4 p3 p8 }; P0 b: V
#include <string>
( S+ q: Y; X0 ~8 P$ R+ P9 ^#include <cmath>
3 T+ Z$ R1 g4 w+ p( {5 f* T. J% B#include <cstdlib>
6 C% P* A- {; s3 y7 K! T 1 [1 i/ x% u! M- j1 G& ]4 E
typedef unsigned char byte; ) F( x% G+ j0 n+ ?4 o) x" E
typedef unsigned long ulong; ; ]7 W  a6 k( u1 q
: v7 H1 X2 A$ h, g: j; Q% |
inline double logbase(double base, double x) { 1 I( b) M$ z2 Z* f6 Y4 @+ k
    return log(x)/log(base); # i0 C% _) R. |- K5 k
} $ r0 W9 ^9 g! U4 b

) S5 a; d. P4 ?* K( e/* ) y. k' x0 V  h& K1 c
*convert int to hex char. 2 w- z# e: ?) S
*example:10 -> 'A',15 -> 'F' ' d! k9 l2 L! ^* a$ s9 j  j
*/
& Z2 G% ]2 W# Z8 A; m1 v/ {char intToHexChar(int x); ; z  ?- x2 `2 g% o' x

( h2 F1 B% S; h5 i" G8 D! g" M! G/*
7 k. }& ~1 L8 d& m, V# R* \9 ]' p*convert hex char to int.
4 [! o2 Y6 U8 ^+ M*example:'A' -> 10,'F' -> 15 1 u; K9 P+ c6 Y% b7 n# j, {
*/
! c! l5 P5 b( s2 H4 Eint hexCharToInt(char hex);
& J- `9 Y2 E6 k3 X& B - G4 |1 c' R5 N0 D& G
using std::string; , `% v' E7 b) T7 N8 R+ i
/*
2 t' ]8 r: R6 l$ p" v*convert a byte array to hex string.
* x3 h3 v% n; d5 J/ ^" r: w- n/ M0 P*hex string format example:"AF B0 80 7D"
% ^$ S) T6 `$ c; c*/ 3 T# ~7 v; o2 @7 @
string bytesToHexString(const byte *in, size_t size); 0 u0 g' R5 V$ b& q

8 q) {- v" Y" i& \7 b/* . P2 @& ^/ K+ a: h+ C* P& O' Z
*convert a hex string to a byte array. % j: T( F- `: j
*hex string format example:"AF B0 80 7D"
$ w; A& Y! m! R/ a" g6 ^/ p1 f*/
1 b" \7 D7 N7 b* Y+ `4 Vsize_t hexStringToBytes(const string &str, byte *out); * e' d9 K( U) [% H
+ V8 q, \) l7 F8 F, B. G0 }) f
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
% Q5 x. q& B6 O7 u- M1 C/ ~5 i#include <vector>
4 @  S* k( \+ O; f
: @* [6 `' s& Q' ?7 W! Susing namespace std; 4 x1 b9 r' x4 B' E- g( _! s+ A; w

/ U$ W& M5 l( h, P& @- g, F9 Hchar intToHexChar(int x) { & a# c5 B# N8 x, d$ p' f! `
    static const char HEX[16] = {
* s: c0 L) ], K9 G  g        '0', '1', '2', '3',
8 j4 E6 Y% o+ K9 N- q        '4', '5', '6', '7', , `& W/ e: v, ]6 T0 }4 _
        '8', '9', 'A', 'B',
" l- }& @  n  j& L6 v+ r7 z        'C', 'D', 'E', 'F'
6 l( e* M* B4 \% c- d0 A  W4 P    }; 2 |' T2 o4 ?' t: R( r( g+ q: Q
    return HEX[x];
. t% T* `6 S# M) l/ o2 z9 f}
5 X* m2 P0 i+ |& n" W * h( D; Z' y& o# O& Y
int hexCharToInt(char hex) { + E  M- E4 M; ~4 f
    hex = toupper(hex);
" n  A  p' E6 G7 q( z    if (isdigit(hex))
: `- w5 l( r9 H% o        return (hex - '0');
0 t4 L& ]1 X6 H# c6 ]1 c  d    if (isalpha(hex))
; q. I+ r/ v  h, i0 {        return (hex - 'A' + 10); ; N4 {9 T9 j$ e+ |( g. q
    return 0;
: ^- `4 w5 s( s# @( K' y" a} - r4 y2 ~# y' F5 t
4 y9 b2 K% ~  ?1 V# y0 {: B' h4 s
string bytesToHexString(const byte *in, size_t size) { $ V' W+ H5 R6 s8 Y  @
    string str; * C1 F) M% q/ C% v
    for (size_t i = 0; i < size; ++i) {
4 e# p' I0 l0 V7 Q        int t = in[i];
# f$ c- U: I# s) W+ U        int a = t / 16; ' Z6 n+ ^$ a" A' |5 A& }3 Z/ v& e9 \
        int b = t % 16; ; g/ f1 x( m; R# C
        str.append(1, intToHexChar(a)); 2 z' b- O( v- C+ V, b% z
        str.append(1, intToHexChar(b));
1 i' n, Y2 ~9 W9 x; B: E4 A        if (i != size - 1)
9 G  d2 |8 [: @- L, d" y            str.append(1, ' ');
% e* @! ?: a6 y& Q* m$ p+ V. h    }
: u2 ?+ L, q( g1 X/ ^4 |8 Z    return str;
" A  Z. S! {3 C}
* S: Z8 ?% ^" |4 ?- D: q, v& t ( ]1 z7 B, v) y% V: W, n
size_t hexStringToBytes(const string &str, byte *out) {
0 i0 O0 Y9 g5 Y/ C8 i
" V2 v6 ]& _' N& k+ s) v6 B    vector<string> vec;
% }7 I& f1 J5 F    string::size_type currPos = 0, prevPos = 0;
9 w: M2 R/ J: c2 m8 P( c. u5 S    while ((currPos = str.find(' ', prevPos)) != string::npos) { - M7 p. e: z+ t
        string b(str.substr(prevPos, currPos - prevPos)); 5 r# R" q, R2 ^) n6 C; c
        vec.push_back(b); $ Q; G# ?2 d5 s% y+ l) s* l) H0 u
        prevPos = currPos + 1; 7 ]3 T8 s( p9 \- Y* V
    }
$ w. R' j  F7 L4 b' V    if (prevPos < str.size()) {
4 N8 m+ D, W& g1 g+ U7 |        string b(str.substr(prevPos)); 7 B# h- C' ?/ m9 a9 |; }
        vec.push_back(b);
8 i# _, ~' H8 T2 v    }
8 X+ m2 p' ~: O" r& v    typedef vector<string>::size_type sz_type; / ]+ F" G0 x( m3 }# {
    sz_type size = vec.size(); ) N$ Z; d+ F5 d" {/ r4 z5 D
    for (sz_type i = 0; i < size; ++i) {
) c8 u2 x4 L( f        int a = hexCharToInt(vec[i][0]); 2 K$ _$ Z5 O" w$ q/ i
        int b = hexCharToInt(vec[i][1]); * s! h: J3 R$ \0 T; f2 @
        out[i] = a * 16 + b; 5 Y7 s' |2 ~  n+ F: e0 L
    }
8 {  J6 q/ f* P9 T' e    return size; # E% h; B: L* m; u  Y. L  ]
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 5 H5 i$ N" t8 l) F( n' H8 r1 ?
#define TEA_H
; ~( F, M: e) o 8 ]: N3 N9 Z  S9 J1 O# b
/*
" [" B) b5 v) `! S2 M' ~*for htonl,htonl
" S5 w& }# r$ g, S& l*do remember link "ws2_32.lib"
4 h4 ]. ~% f, O*/ 3 E* f: ^3 L- r/ K
#include <winsock2.h>
1 _% f& U6 T2 A% d, v, H/ n/ P#include "util.h" " `, `' k) i2 s

; _8 x: U% Y6 Z. u8 Jclass TEA {
7 a, \, C& ^5 q" l1 i! |+ M* A6 Apublic: 3 T" Z3 O; F: |5 O4 C) B
    TEA(const byte *key, int round = 32, bool isNetByte = false);
% ]0 T1 [- ~6 w; K5 ~    TEA(const TEA &rhs);
* c+ t; h7 l9 u+ a- q2 N$ A5 a    TEA& operator=(const TEA &rhs);
0 h7 x1 w8 W9 \  N( Q& x    void encrypt(const byte *in, byte *out); . I) C, _# F- }. i  C, c: ]2 C! V1 A
    void decrypt(const byte *in, byte *out);
; F9 p+ Y; w9 L! |, zprivate:
) J) f! ~+ a& r& a5 z3 q5 N$ y& d* \    void encrypt(const ulong *in, ulong *out);
0 H$ _+ ~9 A9 D% d$ C3 A    void decrypt(const ulong *in, ulong *out);
. B' A, {  _' ?8 ?    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } & G4 T" _/ Y; D' u
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } + O# V9 z8 H& A
private: ' c' J% X  j7 y) h* i5 s/ b9 M* \
    int _round; //iteration round to encrypt or decrypt
  y7 V2 b9 V" L* c9 d    bool _isNetByte; //whether input bytes come from network
6 V( o  ?. O6 L( i+ |    byte _key[16]; //encrypt or decrypt key
3 N* Q. ^1 {7 l};
* t6 y( v, n2 Q
0 [8 w* p  W! C8 y# y, \#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 5 K. Q3 v; j; j5 a" K! D' L
2 #include <cstring> //for memcpy,memset & a# @, E# I0 O0 o
3  
0 G! z# r, `/ d5 A; m4 z4 d 4 using namespace std; - h# [& ?. t: O0 t5 R; p
5  
) D" a3 C- Z* ~: s* v* J1 W, q 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
! ]( w  ^/ _3 Y' x1 Z6 ]+ O 7 :_round(round) 9 r  Y( v1 d4 G5 O3 ~8 ]
8 ,_isNetByte(isNetByte) { 5 Q4 C7 x/ y! A: S
9     if (key != 0) 6 p- o4 }6 E" d! S4 u
10         memcpy(_key, key, 16);
* j& k, b9 x+ E0 ^2 `& w9 W11     else 0 w' r% I/ g- l' Y* a9 P
12         memset(_key, 0, 16); % S; y# a. q8 R1 W( V& K
13 } # U- k% g; p% z7 Q# W3 r3 Y4 p# M% J
14  
4 Z8 S) H1 ?' u15 TEA::TEA(const TEA &rhs)   F1 i7 d1 y) |7 V8 ?2 y% G) [1 s
16 :_round(rhs._round)
. A8 h# A6 _" Q17 ,_isNetByte(rhs._isNetByte) { 1 @: }/ f3 M2 L
18     memcpy(_key, rhs._key, 16); ) s+ ?/ U, u. K  R. E2 V: W) L
19 } & m; X2 i% ?. F$ a1 K4 }
20  $ t2 R- i" }! l6 z9 p7 P. d
21 TEA& TEA::operator=(const TEA &rhs) { ; A4 [' Q+ ~9 I" U: ~" }
22     if (&rhs != this) {
5 B* R' f( A. G/ B23         _round = rhs._round; 3 s  m! P0 _9 N" T( [% e0 E
24         _isNetByte = rhs._isNetByte; # n: w! d, R+ N* G6 H) G2 \+ V
25         memcpy(_key, rhs._key, 16); ! N5 Q! n6 K9 _5 R: x# C  U' t
26     }
& o9 x7 }6 F8 x. O6 p- `% Z27     return *this; 9 _2 A) A& o3 i
28 } 6 F6 Q% ~! }- j
29  - x& K: X6 g' s% w
30 void TEA::encrypt(const byte *in, byte *out) {
* _; x9 }  ^0 H31     encrypt((const ulong*)in, (ulong*)out); * l/ c5 y; m, G4 y, H
32 } " R: |  {1 p9 H2 }( W
33  
, ?2 T) k0 T" n34 void TEA::decrypt(const byte *in, byte *out) {
$ |% e7 A. @! L) X! y35     decrypt((const ulong*)in, (ulong*)out); ' Q) s% u2 p" y5 l6 ~' S- P6 l
36 } & u; R/ W4 O8 W# I" z
37  $ ]; a) k: u( J& E( \& B
38 void TEA::encrypt(const ulong *in, ulong *out) {
# E; z! l1 W6 ^$ t; j39  
% m* N5 W& q1 Q' D4 q7 U0 j9 ]40     ulong *k = (ulong*)_key; $ _! T" S3 @" o( _  Y
41     register ulong y = ntoh(in[0]); 2 n1 X" ^$ z8 R, N0 P- I" o
42     register ulong z = ntoh(in[1]); : T$ ~4 T: R/ S% U% Z; b$ W" _0 ]
43     register ulong a = ntoh(k[0]);
- ]! I' Z% W) c' K% F* ~# M, W; {44     register ulong b = ntoh(k[1]); ' P0 [& J% X8 ~9 N
45     register ulong c = ntoh(k[2]);
, ~, v' ?2 s1 m& L# h* r46     register ulong d = ntoh(k[3]);
: |' N& E% p3 L  K! Q47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
$ A- W+ m5 q; {! j0 ~  R% q; w4 X48     register int round = _round; ; z9 M! n3 g/ I2 r6 _2 ^1 |3 H) S
49     register ulong sum = 0; 7 d; x: g6 G3 q4 C9 X! h- ~3 n
50  / _3 n* C3 ^( M- h
51     while (round--) {    /* basic cycle start */
! @3 u2 g7 ?; {52         sum += delta;
6 R+ i- \$ [0 k9 \( T7 c% F53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
2 b: i" M! m& h: o54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ' J: f, D* }# z
55     }    /* end cycle */ / G& e' y2 U* l6 r2 ~3 C+ Q1 D7 e
56     out[0] = ntoh(y);
/ F/ x9 L/ N) H0 E0 z2 m2 I% G$ R57     out[1] = ntoh(z);
/ u$ a9 I/ B5 J6 K2 O3 C58 }
. h4 ?& c& }1 I8 K3 |2 n59  
: S' v! @9 I$ m0 H& v% ^60 void TEA::decrypt(const ulong *in, ulong *out) {
9 e) C- F  p4 s: C( I61  , H* ^2 |' [6 a: Q) h0 M
62     ulong *k = (ulong*)_key;
( ^/ C" o- ]7 q. ~/ V* }63     register ulong y = ntoh(in[0]); : O7 i+ N/ _8 T4 q7 M' ~
64     register ulong z = ntoh(in[1]);
; _) S% R+ o- E65     register ulong a = ntoh(k[0]);
2 o/ z' |) A6 X66     register ulong b = ntoh(k[1]);
2 l3 v$ H1 W! e/ |0 N1 [  L, u67     register ulong c = ntoh(k[2]); ; r% T% A1 z; ~
68     register ulong d = ntoh(k[3]);
( X# H, J4 K; D! k4 G% S5 }69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
; b: b" R9 n# }! @70     register int round = _round; ; M% }5 w1 _0 M1 G9 a. K1 v
71     register ulong sum = 0;
: ^1 w( X& E* e6 Q0 A72  
0 K! S& g8 C' j8 c73     if (round == 32) - L2 u4 @/ ?5 y7 V# }
74         sum = 0xC6EF3720; /* delta << 5*/
" m$ I8 n/ R6 t, {3 E+ `75     else if (round == 16) 8 x# t3 F8 M7 ~6 a! b
76         sum = 0xE3779B90; /* delta << 4*/
0 Q/ ~& I8 r* S77     else
0 r5 R" d$ L+ \78         sum = delta << static_cast<int>(logbase(2, round));
+ L% X5 |/ n7 G' J1 L) t' X8 Y79  
0 C7 t0 w/ M' U" q" b80     while (round--) {    /* basic cycle start */ - l5 T6 ^! J! {# e4 Z
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 1 V5 e1 W% C+ y4 s' d: n6 ?! Y! m
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 5 S4 W0 x# V7 y
83         sum -= delta; ; g1 s- k* B" g. V+ l; A, y
84     }    /* end cycle */
) f7 ^" K/ P+ C9 i3 X9 R; a85     out[0] = ntoh(y);
4 C, r  `, j) Q) ~$ T86     out[1] = ntoh(z); ( h. p' }: i1 U8 E* `
87 }+ y3 ~! b( k5 ?  V( z* q7 x- w
7 M/ G7 x# ]# v* t% {
需要说明的是TEA的构造函数:
6 v* C1 R' }# ?% yTEA(const byte *key, int round = 32, bool isNetByte = false);
# p( P, d1 B3 v: y5 y1.key - 加密或解密用的128-bit(16byte)密钥。
+ S$ n- }' \& s) V2 d. k  w2.round - 加密或解密的轮数,常用的有64,32,16。 & I" h" g' C$ f9 ]5 r
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! + q( ~3 b; [0 @6 h: C/ O

) S+ X- j* s9 I( R" M% t最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
4 D- E' a0 G9 U/ G8 G4 @7 F 2 #include "util.h"
7 R/ ?1 _& n3 p1 _4 R/ F$ | 3 #include <iostream>
% {& V) F: Y9 Z  p! _ 4  
. @( |2 C& W' T& n 5 using namespace std; 0 ?; C% u( T4 \
6  
- O! v+ u$ w, o* K: l5 T. \ 7 int main() {
. h* |5 i3 z' _5 N6 i) a 8  
) S( o9 j0 ?/ S, D' o. u" K9 N 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 5 a* o7 s* ^/ u! \- h" c
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
5 s1 S$ l; `" |1 b& t2 y# Y11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
# M8 q0 R8 |4 ]5 E: f12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; , u5 J7 `0 X% W2 R- O; q
13  0 P6 M! w, F5 m, k7 H2 q- v
14     size_t size_in = hexStringToBytes(plainStr, plain);
9 u- H8 d4 \" B4 N15     size_t size_key = hexStringToBytes(keyStr, key);
) @/ t) q) v# G0 Z. E2 p. F1 N2 U16  - C- B& W- X, r2 |8 S
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) % }$ @) `9 L8 p4 ]* k% V  F% {8 Q
18         return -1;
; n7 ~/ t+ F4 N3 l; ?( u- e19  ' V% P4 J* a6 W/ O5 ?* p+ M
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 9 S) O: V* M/ d& H9 \0 Z
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 3 m& K$ B6 p3 W5 c0 p9 _- `
22  
+ F) b3 ?3 l. e4 @' B23     TEA tea(key, 16, true); 8 F: U6 o" j: G/ d1 w
24     tea.encrypt(plain, crypt); . j9 O% w% i+ c
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ' R) S* u- C( s% U: ^. Y
26  
& Q  {# _5 R/ m0 Y5 X3 g27     tea.decrypt(crypt, plain);
" \! L! C, W- x- z28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
3 s) Q0 {# R# k+ _1 Y& H29     return 0;
" A+ |2 @& ^. X2 l2 t  y0 d30 }
2 O! f6 A) C  ?7 m& o1 c4 b; E: q: I7 p2 n* @( `! @. J
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx2 v$ z: b9 g* e; A! _  G
运行结果:
5 J+ c5 y1 M6 N( KPlain: AD DE E2 DB B3 E2 DB B3 & G0 X; c" b9 H9 i
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
) w2 z! d' m: }/ W+ Z) X: lCrypt: 3B 3B 4D 8C 24 3A FD F2 # d9 _4 K* T. b4 R( B
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-27 01:16 , Processed in 0.020344 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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