找回密码
 注册
搜索
查看: 37674|回复: 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轮):
6 ~4 Q2 @# W. h3 ^微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 9 Q4 C7 z% d# N( ]) h" T+ n- l. \- t
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
! Z: u/ s) c3 a$ g% l( c8 H% {, C5 J1 ?之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
& E' B' @- y. }# X+ r2 Y. x在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
! T/ g4 [" V6 s, U* u, t+ m在 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& z' B9 L0 Z' n# t
  2. void encrypt(unsigned long *v, unsigned long *k) {
    , }; l7 s3 h; I' G3 @
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    - @) c" o& S* _+ A
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 7 S4 R) |7 m( B9 [( d& K& ~  s6 k
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ + O9 B1 o: @+ w; k+ N4 H3 b9 z* M
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ' I3 w, h' {4 ~, v: _4 s
  7.          sum += delta; * W$ _$ r, }' {: e2 c' z
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    . O8 }/ P! x, u
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ - ?$ I, X- f( A- W( `  D, H
  10.      }
    & d7 ?5 M; i9 f0 Q+ r4 `( z
  11.      v[0]=y;
    . l% |4 N) l! m" y! b
  12.      v[1]=z; * `) d8 u  S/ K0 Y8 B# r- ]# a3 Q- ^
  13. }
    9 x. A4 a" ?7 R/ h0 N  h/ h1 _" O
  14.   
    % R$ J/ n0 t# ^3 X; r
  15. void decrypt(unsigned long *v, unsigned long *k) { + R$ b6 ]+ V! f) @- i& b
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    , ?' `" t* z0 p$ F% v/ e
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ % c  C' X$ x; H5 P! {
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ & l. k1 j" L) L& o' D( d0 j
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ! a% \. p5 P: k! j+ b
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 5 C% S5 K2 {  b- u
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 8 {5 C' Q% m# u/ ?
  22.          sum -= delta;                                /* end cycle */ ! Q( f) f$ U* A9 F4 J% K5 }- r
  23.      }
      ?+ Q& c) I3 r, k' \" y
  24.      v[0]=y;
    ) A4 f8 P3 j$ ?9 r! j
  25.      v[1]=z;
    # y8 z0 M2 m0 v
  26. }. U# d' i/ Y2 i7 j, I
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ( i+ w7 E7 {: a& _: M! V
#define UTIL_H   h# s6 h4 M" {0 e, Q0 T: ?& N

, F" h/ p0 {7 u) R6 L#include <string>
2 `. d, P( D. N8 C#include <cmath> " d3 V8 N; h: O0 ^; w7 [2 l. {
#include <cstdlib> 5 u7 |, F# l* c, {% M; q
. n9 Y9 H4 |7 b; f9 I2 G" C
typedef unsigned char byte;
5 J! E# }- E; d3 W7 k$ ]: ptypedef unsigned long ulong;   S$ l3 G& u. n- t) P/ o
/ n. v( `6 e+ D* s2 Q% A" \
inline double logbase(double base, double x) {
( ]  T2 ^& h3 R& P- e+ ?$ E    return log(x)/log(base); ; d, ?' l8 e! y2 H, f: m! w4 `$ x/ P
} 2 i% }# f. |7 U5 v

1 W% s% R6 E& E7 l/ o- |/* 6 p$ [8 [2 {/ Z4 v" N7 n
*convert int to hex char. ; v; U# ^  _7 G
*example:10 -> 'A',15 -> 'F'
! L. W5 g7 S. ~8 T, }*/ $ c$ P0 H; N. j
char intToHexChar(int x);
! I# X7 ?& Q- ~" f" m 9 ]  |! D, m0 A% Z9 j7 N
/* 7 p6 u) ~' |( B5 I  r
*convert hex char to int. $ }$ w1 t8 q- S$ g# P: i5 m/ L( R
*example:'A' -> 10,'F' -> 15 1 I* k: u/ f3 ~# L7 x& p
*/
/ w- z. D# E' b1 uint hexCharToInt(char hex);
, i1 g0 r. h, c( n: a% J2 Y ' p5 i1 i2 o  y, W/ f& f1 N% F
using std::string;
* a4 \+ f5 T0 ^' K1 _7 Q/*
- _6 n9 K" o2 D6 E( e*convert a byte array to hex string.
0 h- @1 F6 |* ]9 P" G*hex string format example:"AF B0 80 7D" 2 P5 \6 v5 J' k* @. X- A% E
*/
, s6 W" K) H$ m) {string bytesToHexString(const byte *in, size_t size);
/ q% H9 e& ?6 z1 y - e7 S6 ], \/ ?" `1 x
/*
- N" d1 O+ H7 w*convert a hex string to a byte array. + b: {+ k6 I7 k! o$ m
*hex string format example:"AF B0 80 7D"
% K. Q: }( ^4 y! m2 [*/ 5 @& O+ t8 H4 b7 w5 ~' z
size_t hexStringToBytes(const string &str, byte *out);
( p) u+ p2 F, a! Y ' D( Q5 w$ z; d  ~* g
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
0 Y* p* I+ b8 I1 m#include <vector> & V# U2 Z( x( o6 v( w( w
1 t; a& Y( z' k* z! K4 @8 h
using namespace std;
6 e  T! Z6 Q% c# E6 C( ?7 G
% i; s& H. e+ Lchar intToHexChar(int x) { & W+ K2 y( h+ Y5 h3 F0 z$ A
    static const char HEX[16] = { & B% o' v( ?7 C' j$ P8 X
        '0', '1', '2', '3',
& d4 [  a, _6 o0 q1 P% F* f; P$ d        '4', '5', '6', '7',
  U0 f! [, T1 l6 i+ I8 e9 d        '8', '9', 'A', 'B',
( D( X7 X& Q9 Z$ P% j1 @8 w        'C', 'D', 'E', 'F'
+ t5 Y- x+ b# ]% h% D/ Y    };
! w9 \* |0 u% T$ j* \5 B  ?3 D+ U    return HEX[x]; 9 n  l. ~8 T  M" W8 d3 @
} ! y8 V6 I7 Z% N) B# n

8 l% \. r% r" {int hexCharToInt(char hex) {
- V0 g' |# ^+ y; v) i: u% K' R7 T    hex = toupper(hex);
! Y5 t. |. Q% ?! D1 D) {* F/ n    if (isdigit(hex))
" _! ]. a) u* @# s0 I        return (hex - '0'); 5 a0 t0 [4 g1 m$ m
    if (isalpha(hex))
! O0 o# b5 O0 O7 R1 @" V        return (hex - 'A' + 10); / n4 w: ]4 Q5 R& }7 K! p7 l
    return 0;
( T7 E% f) b! Z4 u/ g} , J7 D& t0 _) ?# j* ?' o; j
2 P6 \& Q; K/ m4 R- h
string bytesToHexString(const byte *in, size_t size) {
- c& d  D* m2 Y* r% {7 o    string str;
4 G6 G$ a5 Y- A1 ^, S# c3 E$ I: S% z    for (size_t i = 0; i < size; ++i) { 6 y& _! W% u# Z) F& A( Z
        int t = in[i]; 3 v0 h5 c) `/ g0 k
        int a = t / 16; " |, _, v6 F8 m$ Z9 j- u5 k" o2 a% Y
        int b = t % 16;
$ J% T* U7 n# y9 n7 \- X5 l( t0 ?        str.append(1, intToHexChar(a));
! |0 g' Y8 A5 c- ?3 U        str.append(1, intToHexChar(b)); # ^4 @! c9 S" g  x
        if (i != size - 1)
" `* X+ P* [4 ~6 F7 ]. s            str.append(1, ' ');
( V9 z: }" N) ~% `7 i! z    }
9 U& z- l1 y* Q0 J2 r" H/ `/ t    return str;
; r; L" u9 i! ~% {' y}
. a. T& V8 i$ M/ Y
5 M% l3 g0 R: Y1 h: [5 v; @0 u0 lsize_t hexStringToBytes(const string &str, byte *out) {
4 p/ b* e- o6 u; a- f  x % Z- ^3 d5 Y3 ]- l; d7 T# s8 ?
    vector<string> vec;
6 f: E6 H( a, R2 m# y2 u1 [# ?    string::size_type currPos = 0, prevPos = 0; ! p8 L& r# C* @4 M- O
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 8 E; ~: T3 z# G4 h+ C
        string b(str.substr(prevPos, currPos - prevPos));
: P; O+ K' ~" M0 J4 y! o4 M        vec.push_back(b); ' G8 K3 q' _- \% \$ u
        prevPos = currPos + 1; 8 x  P; z- g/ ~1 h4 Y  D5 N
    }
( U6 s" T- Y' ~& [6 R7 L1 o    if (prevPos < str.size()) { ) @7 \: n( \; l0 o: I- T2 j
        string b(str.substr(prevPos));
$ `& f% q0 p% l2 U9 K" Q% ]/ `        vec.push_back(b);
; b  F# z% j- U. t5 [- v8 ~    }
7 f2 k+ Q6 {/ U2 g. b0 D3 S    typedef vector<string>::size_type sz_type;
% p2 y/ o0 D8 ~- g; D. V# _) c    sz_type size = vec.size();
) z4 C& d/ z, h' K    for (sz_type i = 0; i < size; ++i) { : Z7 r  |" a# P! {8 q  t! V
        int a = hexCharToInt(vec[i][0]); " r- y' @5 i4 }7 z
        int b = hexCharToInt(vec[i][1]);
. b; L& c4 c6 o$ b, s        out[i] = a * 16 + b;
/ c! F4 ?) L( }4 o    } & M+ C$ T( i4 f, {( [9 ?
    return size;
* |0 a0 [+ [( d8 d/ P( l# T2 Q}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
, \4 X4 }5 U* X+ @#define TEA_H 1 G: p+ {# R! R3 @1 r

8 |0 D4 @7 N0 U/*
" G* U- d7 I, j*for htonl,htonl * r- I1 z& D+ L" f( s& I& D5 V* r
*do remember link "ws2_32.lib"
! ^; J- i* R" K4 U/ B*/ ; m8 c/ w/ d- o( s4 L9 j9 ~# O
#include <winsock2.h>
( H( g" T1 {1 G/ @$ _#include "util.h"
8 V0 B/ k* ]5 z$ p" ^  n7 l   E* H* f3 }2 B5 f
class TEA {
& U; D" d' Z, t9 lpublic: & t2 L: C% W& @# ]) C* \3 v
    TEA(const byte *key, int round = 32, bool isNetByte = false); 3 y, |0 d: {3 ?7 A$ b: c
    TEA(const TEA &rhs);
, M" v  y% h  l# Z" O3 @    TEA& operator=(const TEA &rhs);
1 k  @9 ^7 Q4 ~# y2 @! Y4 C    void encrypt(const byte *in, byte *out); - @2 Z) f# z# W5 i6 j
    void decrypt(const byte *in, byte *out); , [+ b7 c" I6 R$ @! @
private:
4 ~. _8 c  Y8 p, P# X: r    void encrypt(const ulong *in, ulong *out);
' o& I* t5 S; K% z, B$ B    void decrypt(const ulong *in, ulong *out);
) k6 O0 b& }3 `( i0 _# X8 e2 D    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
9 C3 E) F6 G/ y    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
- i) w: m# V8 u5 i/ u: a; f2 ?0 Tprivate:
  H4 ]8 U& j) ^% U; a    int _round; //iteration round to encrypt or decrypt
0 |' {2 {& J% a5 i! X    bool _isNetByte; //whether input bytes come from network / l5 }9 q( R) w9 C2 ]; }: Z. `, L! y) T
    byte _key[16]; //encrypt or decrypt key
' @& Q& Q' I% ^( m& [% A; ]};
+ ?& I, X8 W; L* `: g, t5 N/ { 7 P) s7 A# V5 x3 U' R
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
/ R' j3 h$ J" n& ]# ~  `, g/ \/ U 2 #include <cstring> //for memcpy,memset   x6 h! b% t/ o1 ]
3  
5 f. |$ v* B# P1 W: J 4 using namespace std;
% e0 U8 t' x( O, n% O! U/ P3 F 5  + W: S8 U; {) N; m/ j) K/ G
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) + `5 e5 J: G& B# u9 U3 i" R, l
7 :_round(round) ! S# P' t8 K4 |: U1 x/ i/ p* a# ^$ h% B
8 ,_isNetByte(isNetByte) { 3 h8 W8 w, _! l
9     if (key != 0) 0 N1 t* @* l( u
10         memcpy(_key, key, 16); - X7 k4 q5 a4 Y$ i1 U0 J3 P4 m/ W
11     else
7 q% E& [/ t3 u" Y: G12         memset(_key, 0, 16); 2 \& T6 a- z/ @+ m/ l
13 } " q! `, G0 W  M* ^1 u$ ^# D; X
14  
  \3 v# Z8 K1 C15 TEA::TEA(const TEA &rhs) 2 }# a+ F4 ?8 V3 k
16 :_round(rhs._round) 7 q+ j6 i; b0 }$ A* o' |9 k' X
17 ,_isNetByte(rhs._isNetByte) {
+ i! s' A( Y- z# k& L' O; F9 j" Z6 J  T18     memcpy(_key, rhs._key, 16);
9 ]4 r/ O' p, h7 P# o+ O19 }
' b( C( l% L% r! c0 ~8 O$ s20  + p5 r2 O2 w/ a- u
21 TEA& TEA::operator=(const TEA &rhs) { ; `6 H4 g6 i/ R
22     if (&rhs != this) { $ i& p2 J3 D5 J. [& i' ?
23         _round = rhs._round;
! |6 F# j  p: I7 _5 n& f& `24         _isNetByte = rhs._isNetByte; . p- {8 t4 q- B) g0 I
25         memcpy(_key, rhs._key, 16);
- p* ]) }; ?9 }, P4 z. m26     }
' {/ B3 V1 ]% K1 S1 {( w7 V# h8 z/ m27     return *this;
) ^3 @/ ]4 D0 Z) r6 E# b6 h6 g* `28 }
9 n. B+ L# b2 j1 S: u; @$ O29  
. \# f: K4 t, Y, H$ D30 void TEA::encrypt(const byte *in, byte *out) { ) }9 Q/ |5 r# V: s
31     encrypt((const ulong*)in, (ulong*)out); % o3 O/ F; {0 j+ E* E! t; j) s" A9 ^' W
32 } 7 q/ c! B% p3 P% e
33  
* l& F4 q/ g/ ~' c34 void TEA::decrypt(const byte *in, byte *out) { 3 j( @, m! X# T7 C
35     decrypt((const ulong*)in, (ulong*)out);
/ L0 R2 r9 E2 y  `/ w36 } ) {+ q! r) X! b
37  9 S' R, b; q, q( @' Y
38 void TEA::encrypt(const ulong *in, ulong *out) {
) P( \: v* U6 K; h39  8 ^1 h2 N$ @6 V% [' ?7 P1 o
40     ulong *k = (ulong*)_key; / D3 x5 a1 K$ x2 n* B7 V
41     register ulong y = ntoh(in[0]); $ B: N+ q( [" \2 G! P2 g9 D" v, v
42     register ulong z = ntoh(in[1]); & u' E8 P( n0 }$ w7 g8 P
43     register ulong a = ntoh(k[0]);
) E6 S7 R3 |& b" m6 G, L7 s# j7 I44     register ulong b = ntoh(k[1]); / h5 o  ^& M2 B9 P5 E  B; l
45     register ulong c = ntoh(k[2]); 8 t$ `) ^1 l, t) A! L/ z
46     register ulong d = ntoh(k[3]);
7 Q/ T! o; [" _- L- e47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 8 r: f3 u. j6 \* o# U! `1 f
48     register int round = _round;
/ l* p8 b8 X% V1 o49     register ulong sum = 0; ' J/ z; g( q( S9 N
50  2 F+ y/ C7 J- z) J" U# ^! q
51     while (round--) {    /* basic cycle start */ & u2 Y+ B4 R0 L$ T4 L
52         sum += delta; " [5 ^3 B8 }2 p: [2 O  o
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
' I! s5 D# w/ N* ^( U; N54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
4 W; h; ~1 Q8 g/ |55     }    /* end cycle */
& J2 |1 Q+ w! I& _  g56     out[0] = ntoh(y); 5 Z' B% c1 t# ~
57     out[1] = ntoh(z);
" m- B0 ]$ o" k5 C2 E, S58 }
! U5 v  M" T" i59  5 f# p0 m  x6 s2 N4 Z6 k0 U# w6 w: p
60 void TEA::decrypt(const ulong *in, ulong *out) { 2 q5 H8 o" z" n, \9 Y9 W" A
61  2 _+ \% g4 H4 K* Y
62     ulong *k = (ulong*)_key;
/ ?! u# M( ]6 s5 k0 ?; e63     register ulong y = ntoh(in[0]); 9 V: k0 h8 T) r8 W
64     register ulong z = ntoh(in[1]);
5 n3 j% e; P0 j$ M, K65     register ulong a = ntoh(k[0]); ; q2 u' I) h# {$ Z
66     register ulong b = ntoh(k[1]);
& K$ Z- y: z7 ~' A8 U+ y2 T4 X  I67     register ulong c = ntoh(k[2]); ' `6 m! D3 K; c9 W. _9 w, o
68     register ulong d = ntoh(k[3]); + }6 Q, H! P* I* V  i
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ $ ~7 l0 X9 n% t! m  q: ?
70     register int round = _round;
9 q  W9 b) b- |$ |1 y( X0 m2 p71     register ulong sum = 0;
# A. q) l/ T5 g( t6 F72  & v4 W. ?8 h7 S+ X  a9 T% Q" V
73     if (round == 32)
  R; K% _/ m3 p, ?7 _74         sum = 0xC6EF3720; /* delta << 5*/ ) U# E& R& W" |( ^
75     else if (round == 16)
3 q3 V" m7 }8 V76         sum = 0xE3779B90; /* delta << 4*/
( d, |5 u- Q" S, N! S; M$ |/ t. n$ e77     else 7 D9 B  ~2 [" `  W, v& O9 [
78         sum = delta << static_cast<int>(logbase(2, round));
$ {3 h8 G3 m; |3 k6 g79  7 D/ x, S8 n! H8 {, v- f( H$ D
80     while (round--) {    /* basic cycle start */
- |! {: O* S4 b" F81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); $ ~4 c1 g  F" r( H0 e: q, y
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
% P0 @) F+ m- ]" J) {83         sum -= delta;
! q% ~+ j- `# t2 P, v% H( q84     }    /* end cycle */ : J# @4 a9 }/ w: Y+ a# m$ Z
85     out[0] = ntoh(y);
  R( Z# u+ {/ K9 ~, ^# A+ b86     out[1] = ntoh(z); 9 h% i- {' P2 Z
87 }2 _! U& k" E$ X1 Z0 T

: |2 O) a; u+ l* l6 K需要说明的是TEA的构造函数: ' k- [. {& K7 f* [0 {( E# j
TEA(const byte *key, int round = 32, bool isNetByte = false); ( F7 B% O- Z+ e1 H% v
1.key - 加密或解密用的128-bit(16byte)密钥。
- s% }& d3 l/ T! ]2.round - 加密或解密的轮数,常用的有64,32,16。 + Y# J' L$ i1 I- U# m
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!   K9 H) c% R+ u  f2 p/ H
# n' ^5 J2 Q  G# }" s3 ]6 k+ s
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
% S* L& r2 e" j+ H" u/ {6 h# m2 } 2 #include "util.h"
2 o2 |6 d3 z7 z4 t. { 3 #include <iostream>
8 ^3 O& w7 x# j( ]$ ] 4  " {$ {% n; {! ^6 E0 u% }1 d" Q" `3 P
5 using namespace std;
0 O7 ?/ U: Y/ X  Q  `5 a, r- r 6  , Y5 o0 U, M$ x1 a1 y9 L5 N
7 int main() {
- s# T6 e+ ~) `# q 8  
! O! }5 ~2 }; C 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
* }" @' W: V  i  t8 r10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 6 S: p7 o, H$ u- F1 Z, \7 C
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 1 Y( s  [2 L  Q( P9 X
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
' x- s6 w9 [' L( `% y* e9 J13  ( q- h' Q6 k7 U- J" p0 |0 _
14     size_t size_in = hexStringToBytes(plainStr, plain);
# R" c- Y4 I3 x15     size_t size_key = hexStringToBytes(keyStr, key); 7 u+ r4 K2 s3 k- g
16  
0 Q" h  Z8 Z, n  O17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
5 A' C  N9 p( R. I) n18         return -1;
0 U& U! d  V. U4 W$ l  O, V/ I- ~19  0 k$ p; ~1 L/ @# \: B
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
2 @4 a9 F- I" g3 ^- R( {21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
& q( H4 k  p3 K% y; s6 L% O22  ( O: a; w0 Q) F) s
23     TEA tea(key, 16, true);
% A9 w4 H% a% V4 ?24     tea.encrypt(plain, crypt);
- ^2 d3 }. c  X25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
8 h: Q2 @7 E4 V+ W26  ( A9 d/ [) t( J, X. X
27     tea.decrypt(crypt, plain); . @) T. ?) }3 v/ U; c+ S# F
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
4 r( D: d. N) V* _3 G, O4 K* N29     return 0;
1 r' m# S6 D; b30 }( K4 O: I. j0 O  I3 q3 \" s) p) p
3 C8 v8 t4 K4 f7 G# {
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
, P; }0 K' c3 P) K+ E. J运行结果: + g7 S' M# B9 U! B9 R* q
Plain: AD DE E2 DB B3 E2 DB B3
- `0 g4 ^7 Q2 T. [7 Z8 F, cKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
' V; p- `/ i( @2 o& W1 HCrypt: 3B 3B 4D 8C 24 3A FD F2
/ U0 E$ {8 i2 c6 _' H  NPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-13 08:47 , Processed in 0.020131 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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