找回密码
 注册
查看: 39023|回复: 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轮):
8 r5 G. L5 a4 ^6 S& ~  N& a4 l微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
1 y" n$ n& v! YTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 + U2 G9 H, s. M9 S7 a
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
5 j, I/ C& s+ k9 O" v在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
2 [2 z8 A0 X3 e在 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. 9 C0 ^2 h- t2 w& g" @3 F4 I& r* z
  2. void encrypt(unsigned long *v, unsigned long *k) {
    + h4 D' N0 K! a* Z2 H; D7 H
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 4 s" [1 O) G, Y1 v: g
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 6 Q9 A0 o# _$ {# x7 O
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    $ O) S, P: N! n- ^/ r
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ / C$ e& v9 K: |# D' n( p
  7.          sum += delta; 6 Z+ k: ^5 G  h4 r5 v
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ( {( X* b5 |. e& w- ]
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    + V: @3 G0 \* C; y3 j, l; I
  10.      }
    0 o/ J* |2 n/ N2 \. @
  11.      v[0]=y;
      |) E9 F- T4 q1 h/ m( V
  12.      v[1]=z; - ~6 G, o3 i# E( R; l
  13. }
      n  I- [# W  i0 L
  14.   
    ! f) L  s( ~1 T( ?
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ( o/ T, q; w8 e$ y7 @& \
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    " Z6 l4 r) f, w" d! t7 T
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ * S% o9 |* X- d! E' t
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 0 j: M' k, }2 s( f% H
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    2 F4 G7 I- Y  W9 ^
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    & T( a2 s& N. Q# o
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    : \& I$ f) e- \- i! K+ B
  22.          sum -= delta;                                /* end cycle */
    7 L" E3 H; U% S+ ]8 h, `1 ]
  23.      } / V4 B. ~) D& `; w
  24.      v[0]=y;
    / M5 \5 _- j; v7 a9 l! {2 R1 [
  25.      v[1]=z;
    ! |. @, v2 F% z& x4 Y9 z
  26. }* T; L2 z) Q9 \1 f) ~+ _5 p
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H & m7 t+ W" I4 Q  c: C1 l' t
#define UTIL_H   ^2 y7 I8 g& H: e2 a$ ~

) B3 Z6 x1 n* k5 ?+ s( @#include <string>
* l* l  f$ w6 o2 ?4 _# O1 p#include <cmath>
* y* R5 q' x( v% d+ A#include <cstdlib>
4 `5 A" F' ~; p9 {8 u3 G4 K7 _
* X# x" n- k. t# o' xtypedef unsigned char byte;   D( y) g8 i! a8 U- {2 v
typedef unsigned long ulong;
" h3 S- y/ m3 E  k9 |' ]+ c+ Z$ ] 9 K0 Q- s5 ?+ e) \1 R2 D
inline double logbase(double base, double x) { ( f; b: ^. d2 x. _1 x
    return log(x)/log(base);
* v* Z2 m0 O$ v. d4 d7 d1 O} $ S; f1 I) ^2 u5 |8 k) J

( q2 p7 t5 Q9 ]! p/* ' a; t1 y: R9 `2 J- _4 G8 x0 L
*convert int to hex char. $ n6 O+ S2 S* _' f# D
*example:10 -> 'A',15 -> 'F'
2 s8 h7 _& C2 P0 U) D' }, c; ~*/
7 X- m& D' H" \6 e* ochar intToHexChar(int x);
1 c9 D' }: Q  q8 B' b 1 L& Z8 J1 q  V( N' b' D
/*
* w. y' a/ Q/ f' t4 [*convert hex char to int.
& N) ^+ v" O- ?9 I& k*example:'A' -> 10,'F' -> 15
3 J/ F: C0 \, p*/
/ a  ~- E* O: e/ B! `6 Uint hexCharToInt(char hex);
$ Q4 \" ]  Y0 A- q* k 3 Z, V% C, P7 z0 E( @
using std::string; 0 L. C$ Y  b' N8 V, F& s# x
/* $ f! R1 f5 I, C0 I) S8 l7 A# y) {: l
*convert a byte array to hex string. % ]- O* H: @4 G# Q" \
*hex string format example:"AF B0 80 7D"
  L  R* v& h0 G3 M" u4 i*/ 3 }5 K6 B, F% ^0 H# b
string bytesToHexString(const byte *in, size_t size); 0 ^4 F3 r3 o9 Z  o4 ^3 y

0 e6 I1 H: [: n2 t6 B" n, h7 x/*   g& I) X0 B" }* o" j, V
*convert a hex string to a byte array. , F( l$ d+ [# X2 r4 k# u
*hex string format example:"AF B0 80 7D" * ?8 @- A6 H5 c& b. M# A
*/
* p: t* h2 a" X! W; asize_t hexStringToBytes(const string &str, byte *out);
& f4 A# h3 j; i1 B; V0 H5 f 0 S+ l: ]( q6 o& t0 r7 a/ o7 K3 K
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
! W' I( y/ N9 {1 n#include <vector>
( g+ S8 G& v+ L$ ]
; a& h. K2 n4 nusing namespace std; + m4 _. E- y( z( q: s% F
- E; k6 w( g2 y' L4 O+ Y
char intToHexChar(int x) {
8 f2 d- V( P6 g$ c5 _+ ?  d    static const char HEX[16] = {
  W4 u( e: r! ~1 h  i5 O0 e        '0', '1', '2', '3', ) `( O* s2 K" A, i4 Q! t
        '4', '5', '6', '7', ! d* q# B9 Q1 r6 v2 o7 Z
        '8', '9', 'A', 'B',
" B- Q8 [, C2 j( C        'C', 'D', 'E', 'F' 2 o$ B$ [# T, p& F3 S# A7 u
    }; 0 z2 x% u5 `: h3 e# h
    return HEX[x];
7 m/ |+ d$ [3 b& V$ Q( k  S# y} 3 A3 Y# C$ g: U% b5 a2 X
1 O, I2 [. P6 v3 T1 `% q% H
int hexCharToInt(char hex) { . Z2 G3 a7 D- N
    hex = toupper(hex); ' }: x4 U: }5 V+ I3 n
    if (isdigit(hex)) & `. w0 {7 E) N
        return (hex - '0');
( N1 N' \( I. v: [' ]    if (isalpha(hex)) ; U$ Y( \2 J/ r3 ?
        return (hex - 'A' + 10); * Q3 P, g7 a& R: V0 N) L5 r+ I
    return 0;
+ X1 S( R( O# j, P: B2 S} . k  |7 E/ m0 E4 ~# }7 |3 ?
- b2 x$ G, i( ^. O5 L/ B
string bytesToHexString(const byte *in, size_t size) {
8 k  S( B. Z0 Q" W4 x3 w  {$ F    string str;
7 R1 m+ K, k' d' I2 c8 L! s' |    for (size_t i = 0; i < size; ++i) { . d6 o5 z2 d' F" I8 p# g
        int t = in[i]; 1 P/ E/ L  o4 q  q) v/ w
        int a = t / 16;
( r/ L* s% b1 E# H2 r8 G& ^3 q        int b = t % 16;
) I" p% [, C: [" a+ i# c        str.append(1, intToHexChar(a));
# h. j. C. N2 O8 Q9 Q" _        str.append(1, intToHexChar(b));
' ^2 ]  O" a! K% G2 S4 @        if (i != size - 1)
7 ^0 c; r: [) P4 i2 I- H* c, {: G            str.append(1, ' '); , |6 d$ Y& L  h. \7 D
    } 9 ?" P* }3 `( @& T! U
    return str; 3 p# o. p# {/ O# }& T( C" o4 Z
} $ Y. d5 H) i7 x+ h- s

3 R; Y$ a- Y% v  r; X( X3 \size_t hexStringToBytes(const string &str, byte *out) { ( i+ S8 r! f: n9 }5 a6 {# U  V
: x. E1 J% T& E
    vector<string> vec;   w& d$ y0 E& x/ ?6 R$ H
    string::size_type currPos = 0, prevPos = 0; 9 K) Q1 j8 z# p4 Q
    while ((currPos = str.find(' ', prevPos)) != string::npos) { # F$ m) X: {8 I7 |/ z* u
        string b(str.substr(prevPos, currPos - prevPos));
5 x( q; V; g% q4 w        vec.push_back(b);
$ d/ G* Q! v+ f        prevPos = currPos + 1; 9 w! A; ?5 S+ J8 }5 ?( v
    } * A) O! ]8 m  j- M  _) c
    if (prevPos < str.size()) {
, c( K4 ^4 g; K8 k        string b(str.substr(prevPos));
- S$ M( W' t1 i2 _! d. q        vec.push_back(b); 4 N  S4 N2 Y/ `/ ~6 E4 L& P! S
    }
) q4 l& p: ]! n8 |: J4 y) I    typedef vector<string>::size_type sz_type; $ V5 ~# F) n, V( u
    sz_type size = vec.size();
  D5 q2 N+ M  ?( T6 Q0 @    for (sz_type i = 0; i < size; ++i) { - f1 |8 p1 A3 [  a) \
        int a = hexCharToInt(vec[i][0]);
% @. l5 |* H; y. k3 j        int b = hexCharToInt(vec[i][1]);
3 R) h, @2 w) p" W        out[i] = a * 16 + b;
8 A/ [% h) o1 p0 H0 I' d' ?    } $ j3 X) c  h4 R
    return size; 3 z$ _5 u5 R% c4 \$ v
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
% e$ _0 o- w, T+ D& o& I9 N#define TEA_H 1 @$ r, x8 v5 i5 f7 \$ |/ S7 Y

5 o2 q& j1 ?3 G/* 9 t3 S, ^% s8 q' D2 w0 K: }
*for htonl,htonl 9 h7 l+ i2 `; U% T
*do remember link "ws2_32.lib"
/ j! g9 R8 k: J*/
) R# M* |- V$ g# y4 I#include <winsock2.h> + m( X6 I( O" \5 |9 ~% v) V
#include "util.h"
$ J( N' N3 d3 `. Q" Q 1 i* m1 d1 j# P3 {; W
class TEA { : R6 T8 n( x. s8 Z# n
public:
  X, a/ Q, P7 u    TEA(const byte *key, int round = 32, bool isNetByte = false); 3 H; t+ P& N* s& F
    TEA(const TEA &rhs);
( K) e. `) d/ A! @3 M& |7 ]7 D    TEA& operator=(const TEA &rhs); : h& V% }1 U' u
    void encrypt(const byte *in, byte *out);
. N3 y/ X  ~8 D3 @& ~    void decrypt(const byte *in, byte *out);
8 v( \8 \# M1 Y: _. hprivate: 1 R$ g0 G* B9 A5 r3 g' S
    void encrypt(const ulong *in, ulong *out); / r4 d% q' i3 w/ i  o3 H. ~
    void decrypt(const ulong *in, ulong *out); " w3 E0 ~8 e. E- V
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
; \8 A; r4 H2 P7 J/ c: q/ S    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 8 X5 G* k0 U, _3 ~5 D; S, N1 e
private:
! Y) `" B4 v8 f0 U& f    int _round; //iteration round to encrypt or decrypt 1 ~4 E* }$ ~0 S9 s0 n- B) l
    bool _isNetByte; //whether input bytes come from network
' R* n% n! A; B$ O    byte _key[16]; //encrypt or decrypt key - h$ _# j8 C8 ^5 U
};
" ~/ x8 `! ?  P! W# x3 E( n" Q - w5 `  g1 C; I/ X2 K9 [
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
3 k9 J) }) L  l6 S7 k 2 #include <cstring> //for memcpy,memset / H+ C( L# X4 r: ?) _* B
3  : a# F7 a/ N$ P+ u3 t
4 using namespace std;
1 f7 u' v- Y  O+ z) c 5  
$ k0 J" j3 b. g! n: w/ ] 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) # ?- O! F! a' C, v
7 :_round(round) & U+ m- C% h4 J# F% \
8 ,_isNetByte(isNetByte) { & Z+ a5 b: R; v: @+ N
9     if (key != 0) " k& y) b! x) F* q6 K& M/ d5 u
10         memcpy(_key, key, 16);
7 _2 Y- s2 `+ q. V$ \4 u8 `11     else ' c2 `; }+ f; y, @7 E
12         memset(_key, 0, 16); " P& ^. Q' \: L1 G4 R
13 } & q; K  U$ `, t2 d4 E! F8 O& N; l
14  ( h. Y) s: a! ?- R( X; b
15 TEA::TEA(const TEA &rhs)
& `! _" \" }$ g/ p- w' f8 g16 :_round(rhs._round)
6 P, o0 s0 X) u+ @* q/ K17 ,_isNetByte(rhs._isNetByte) { . q5 D. y- ]5 I0 P6 }% z
18     memcpy(_key, rhs._key, 16); 0 F3 ^9 ~0 a9 w5 b7 L$ E$ ]
19 } ! q( ]9 Q; B$ i/ E
20  
: }- L0 |) ^$ G4 u21 TEA& TEA::operator=(const TEA &rhs) {
9 @& A3 U* r0 @! I% c22     if (&rhs != this) { $ d- G6 n8 ]- ?
23         _round = rhs._round;
5 W; H( x5 g' ?1 G: Y# k) ~24         _isNetByte = rhs._isNetByte;
4 i% F; Z# T0 X$ d25         memcpy(_key, rhs._key, 16);
% r" x# J+ r* H$ h26     }
- i; o0 d& w; \2 U$ d& n" N6 c27     return *this; 1 n! n4 }2 s/ `. b; o
28 }
% W( Q5 s: y& k8 a; @; ~29  
/ X0 B+ Z( h+ T% U4 A9 o- {30 void TEA::encrypt(const byte *in, byte *out) {
" [1 W0 d4 ]% c  o$ W( Q3 ^3 }; L31     encrypt((const ulong*)in, (ulong*)out); 5 w7 W( M8 U7 f4 g/ B" x
32 }
! S9 I/ B/ @# g2 N% M( O; z. Q33  
  j3 S' P" z7 ]# F34 void TEA::decrypt(const byte *in, byte *out) { 4 X6 s( m. u9 q8 m" D% ^2 y7 c
35     decrypt((const ulong*)in, (ulong*)out);
, C8 x; ?+ B+ F36 }
: @7 A+ b' K2 t( ?# O, Q37  : I& m  i& E3 @1 d- i8 u# n
38 void TEA::encrypt(const ulong *in, ulong *out) { " S! o: h& P$ ~" L
39  ' d1 r: J2 i2 c9 N( M
40     ulong *k = (ulong*)_key; 0 |, R# u8 t8 A2 ~, q
41     register ulong y = ntoh(in[0]);
/ w# U& z6 U9 r9 y! Z! I42     register ulong z = ntoh(in[1]);
7 |; a; e$ V7 T. ]43     register ulong a = ntoh(k[0]); + c, {2 \+ z/ a) L. K' W+ O, m) u0 z$ ^. D
44     register ulong b = ntoh(k[1]);
/ o# z6 G1 o: v; w7 W  S. r45     register ulong c = ntoh(k[2]); - M% D0 J/ v1 Q  G5 E
46     register ulong d = ntoh(k[3]);
7 D7 z7 k  {* M# ^1 _' @47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ! ^% A! P7 }# x7 K5 @: z8 C
48     register int round = _round;
! t" s/ ]2 p7 D* ^$ P49     register ulong sum = 0;
/ B$ v, ~$ ~: |) `( s: y# p8 m( @50  7 [# d& K3 E% W- \0 h9 D4 C. n
51     while (round--) {    /* basic cycle start */
% s) ~2 z% g) j# |  g# M52         sum += delta;
/ \/ G4 `4 S% \& ^. J# [3 D53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);   g9 k# K9 h3 u1 t
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
# a6 G$ ]8 e  ^- Y# t1 w55     }    /* end cycle */ ) _3 N; V) k6 `7 H# K
56     out[0] = ntoh(y);
2 p# D6 v2 y3 ^; j& T" W8 p57     out[1] = ntoh(z); 8 K. u& H& {- R$ \! B  L! n- c3 j+ W4 a& o
58 } # i5 p+ h* Z1 X- x2 `' R$ x1 {
59  8 J& Y. }: y5 w; ^
60 void TEA::decrypt(const ulong *in, ulong *out) {
1 j7 \$ y+ s" C61  
4 W+ k/ ^) L$ W& \3 X: q* E62     ulong *k = (ulong*)_key; ' Y2 I, T- {& g* X' X! B& _- g
63     register ulong y = ntoh(in[0]);
+ f" P1 n9 r0 r' e8 N0 d64     register ulong z = ntoh(in[1]);
) @8 l/ T4 J! v3 s3 D65     register ulong a = ntoh(k[0]); ; o3 \% h% b9 k6 q0 ]" }( Z
66     register ulong b = ntoh(k[1]);
* v: J, }7 f5 S5 l1 u67     register ulong c = ntoh(k[2]);
4 g  Y) M5 b" ~% Z7 P68     register ulong d = ntoh(k[3]);
# f. _5 n$ k$ C# _" Y69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
8 m2 _, Y: X; n8 D' d1 Z( ?- s70     register int round = _round;
( i! f* w; [+ L# A! a* J. ^4 Z71     register ulong sum = 0; 1 q. U5 _1 b6 K5 {5 g" v8 A, N8 i
72  . E2 u; ?: o1 Q
73     if (round == 32)
) d' w+ t7 S; w# z1 D74         sum = 0xC6EF3720; /* delta << 5*/
6 `. y3 W0 _* t7 H) g' G( l& J: ]75     else if (round == 16)
0 L" j6 L6 v: c1 L76         sum = 0xE3779B90; /* delta << 4*/
' n. p  D7 \* |+ h77     else 5 G4 `, S3 C! u, }
78         sum = delta << static_cast<int>(logbase(2, round)); " t  v6 @& {+ M& ~, Z* S% U' q, a) [
79  
% |5 ^4 J7 y' L( f3 o3 @( l$ p. }" f* r80     while (round--) {    /* basic cycle start */ , x7 K  I- U7 e. [# ?, \. i5 ]. l
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ G5 ^8 R) w8 U1 i4 \/ r- f& K82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( q6 |% t. o5 c" D! @. ?83         sum -= delta; 0 a. ?" M8 U0 \
84     }    /* end cycle */
7 d5 E1 H  z; O3 r8 j; p- K# F85     out[0] = ntoh(y); % D' ~: Y2 U2 L+ u* T* M/ ^. i
86     out[1] = ntoh(z); + ]& J& H( X4 x
87 }
7 H4 ^) E3 f. z" D0 r, T0 B6 A5 a3 C/ u. z
) |; n) `) ?0 c; F; K( t# ~& f需要说明的是TEA的构造函数:
3 R. Z7 a( ~* Q; e! fTEA(const byte *key, int round = 32, bool isNetByte = false);
  w2 _( y; W5 U8 p1.key - 加密或解密用的128-bit(16byte)密钥。 . Y4 Z& O; R' i& x# n
2.round - 加密或解密的轮数,常用的有64,32,16。   q5 u& ?# @7 o5 n0 m7 s* R, ?
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
# k& c( _' |9 v# \7 D8 b
2 L- k. p3 \5 K3 R8 @) ?5 U0 N9 Z. Z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" , o7 j9 R8 K, F2 k% u
2 #include "util.h"
. ]1 s1 ]# {* I- u. P 3 #include <iostream>
  o  y2 I4 W5 w2 d$ S' c+ K 4  
. J, @% o; c  k0 `* `' R 5 using namespace std;
3 ?7 \5 b5 v& {) I; P, [ 6  8 S# ?) b  {4 o
7 int main() {
) C! @% s3 x7 h, S1 K3 M0 [; f 8  
' g. |3 u  O5 A 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
* o3 ^& A! ?2 h. u10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ! @- _: L2 V) v. n$ F. @: G' c( S
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
; c& `/ ]4 J' T3 f1 V12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
! O5 a! @3 r6 }4 s13  - ^7 c( s, q( j6 C; k
14     size_t size_in = hexStringToBytes(plainStr, plain);
# j; [* W1 i. l/ L) _& }- u+ ]% u15     size_t size_key = hexStringToBytes(keyStr, key); 6 B1 w3 Z$ }: b1 D: c
16  2 s; U* b1 h( t( f4 q/ T5 r' D
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
2 D1 T$ I. i5 D+ _2 N8 d8 D. K8 o18         return -1;
/ s0 h' l1 m  Z) M1 i19  3 h! [6 {1 k# F- `2 H* P( [
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 0 H+ e2 I. n) W3 i
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; # u+ }3 I: N3 q' m- @9 S3 Z
22    i3 A0 @  P6 ^0 R
23     TEA tea(key, 16, true); ' i2 [$ P5 p3 I0 z$ K
24     tea.encrypt(plain, crypt); ; H$ D/ Q+ b0 `: N7 e+ Y# N9 b
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
% \" \( y5 g$ C3 Q, A$ \26  
. b% c4 r5 R: |7 F4 w27     tea.decrypt(crypt, plain); / N% |8 R% A% k% Q- o
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
9 o2 a# l# r9 p! w# z# `29     return 0;
" a6 b! @. S3 ~1 ^# L( R, }30 }2 H% z4 B: S) z4 a

6 i! v4 V* W1 B5 q) u! h+ n本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
* Q9 t. N" |( W( p运行结果: & o. s+ J8 k4 M; ?/ p# y
Plain: AD DE E2 DB B3 E2 DB B3
0 U* a* Z3 g8 F7 }- qKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
8 B9 Q0 b7 U" s5 [/ }8 ]Crypt: 3B 3B 4D 8C 24 3A FD F2 6 e; G$ d2 s8 i/ Y5 X
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-2 04:08 , Processed in 0.018259 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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