找回密码
 注册
搜索
查看: 37793|回复: 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轮):% r4 R9 m% \1 u! ?( W0 t* e- m! f
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
4 H4 k( C. I% z$ nTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 4 c- t. ~1 X( V; W* e" `
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ; X0 U8 @9 K: }  c& V3 B
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 4 C+ _; x. b$ D( A$ j7 n' W# ]" j7 A; 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. " F6 Q5 r# i) i% s4 N2 e
  2. void encrypt(unsigned long *v, unsigned long *k) { # y: _6 Q! a2 V
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ! L5 c' `* z" Y9 y1 u- f1 N1 V3 h8 ~
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ / v( |4 x  G. a. {5 H* P! S
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ # o; Q8 U0 z- P5 E- P  D: r5 \9 k
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 1 S7 A9 }- n* G. f' a
  7.          sum += delta; 0 j- {7 ]+ [( Q5 K# s
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 1 X0 G8 u! \: k4 Q) c3 ]2 S; C
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    7 k6 e& P+ `. y( C& L  B5 C5 T
  10.      } ; [$ G1 ?% n" [# \9 l2 F- \
  11.      v[0]=y; + x5 X* r4 P& [; w8 G
  12.      v[1]=z; $ H! _+ W  k! w( ]$ M" ]3 A% i5 P
  13. } ; F) E% U9 T4 f( l; @3 ]# R
  14.   
    8 C3 C* r/ m: j/ H
  15. void decrypt(unsigned long *v, unsigned long *k) {
    & [, }# h0 ^2 [8 ^& |$ Y1 T4 p
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ! v5 S: _# H. D5 d  [( i0 G2 ]
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
      @/ G; `9 y9 q' N8 I* y9 ]
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    2 f  a8 j3 e) G: ]1 H2 }! A" V
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ) b0 H( N1 h: j) p6 Z: c
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 0 D7 ?4 c8 F6 n4 N) m5 w% p% E
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ! _3 ]- B! _- ^- D
  22.          sum -= delta;                                /* end cycle */ 7 j* d$ w/ |7 D5 m$ U0 n
  23.      }
    $ f! t  l* {6 z( J9 V7 K
  24.      v[0]=y;
    ) q  Q3 M1 F5 ]
  25.      v[1]=z;
    3 M# l, ^/ ]7 h; S! }- g% r* b
  26. }
    $ Y$ s/ T- G" b# h
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
: b5 x; K$ [* }& L; W) c, O#define UTIL_H
, J* _" H$ U: e3 N& \$ n/ ^6 x) e
#include <string>
1 k' v6 \! d6 A% S. j: m#include <cmath> ; W, O8 y3 U; W2 l3 o6 q- w8 U
#include <cstdlib>
: V- }+ ]# e( F0 y$ g: X" J: u9 @, F ( k* u, u) Y; l8 a- Z
typedef unsigned char byte;
& z0 B% w) Y$ m' _9 D+ h0 K1 ttypedef unsigned long ulong; 0 A& m+ L2 ?+ ^. \* b

3 ]2 k# A( l- O/ |% p0 y- _2 n( N# F1 Iinline double logbase(double base, double x) {
# k& i: ]: a: F( z; F    return log(x)/log(base); , m5 F3 I  d/ z9 x: k0 Q3 o! \5 \
} / m! @* J  j+ i* |
, i, a/ t# C& s# S) E! {+ i6 F
/*
7 k3 [+ o+ Z# b0 j; S' B*convert int to hex char.
7 @3 y! n6 h$ F3 P*example:10 -> 'A',15 -> 'F'
7 N9 e: j- ?! E* T4 Y* R8 u0 H*/
  U/ t0 @( N- H* ^* a6 @char intToHexChar(int x);
0 I# ]6 n+ T# e, R& a5 _5 `9 j) \ : U  g, c( a+ Q8 K+ o& a6 z
/* 3 U7 U3 {9 ?' ?8 r+ w& t/ Z4 @
*convert hex char to int.
* B: k+ R: ?& N( p2 i*example:'A' -> 10,'F' -> 15 - ]+ p& Y1 K; j
*/ * L& o* S8 B0 v! \1 i' e
int hexCharToInt(char hex);
. j: o8 ^1 M9 |0 ^- o  I: f
% f& l; g! R1 m) ^/ D5 yusing std::string; ' D" e9 a" z8 \7 {/ N
/* ( g# |# a. X1 v! K
*convert a byte array to hex string.
; \' a/ Z1 ~0 I( m/ \*hex string format example:"AF B0 80 7D"   ~" p: h" z- i" _. l' ^
*/
. G: k6 N: g9 o& g& ustring bytesToHexString(const byte *in, size_t size); & ^6 K1 s' V& A6 ]  v$ @" N& m. p% x
# M$ ~% e; e5 g+ x+ D
/*
. x. W% Z$ F3 T3 j- D1 h*convert a hex string to a byte array. , x4 y% g0 k9 G/ V# Y& n, S( ^
*hex string format example:"AF B0 80 7D" , O/ n+ C7 }  ~0 l
*/ $ ?+ \: x% |2 h
size_t hexStringToBytes(const string &str, byte *out); ! p) V9 E, a' }8 H. z& e2 X$ e2 G/ \8 H

% g0 M5 n0 S( J9 Q9 A6 A# F4 r" @#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" % c' ]* p+ P9 c
#include <vector> + ^8 I9 [* ]: b4 r0 s' C* L9 [3 V" r

" N/ K, O5 @0 ]( i: |* b. t* xusing namespace std;
, @- q3 {- R3 `$ J0 t8 p' p( ^2 f+ Z
7 F6 r) w' [: _8 ~2 Hchar intToHexChar(int x) { $ |& H8 Y4 |0 K7 X. p& w$ O/ U  D" D
    static const char HEX[16] = {
% Z3 @9 s7 X% l( J$ l" z        '0', '1', '2', '3',
  {1 m  l0 b0 k, t2 \5 \' i        '4', '5', '6', '7', 5 E# f. _! N! S2 h- y$ U/ K
        '8', '9', 'A', 'B',
9 Y- c! y6 G5 t0 M2 U2 `* S. `        'C', 'D', 'E', 'F'
6 ?: e7 k/ d1 u/ t3 k    }; ! h0 C8 v3 ?) Z$ D. r- O" p9 ~
    return HEX[x]; " _, @: q1 H& q0 o. ]
} 3 ]. o' X4 Z7 j+ j$ ^8 R" U

: T0 y3 {" w7 [5 k/ T' c9 |int hexCharToInt(char hex) { ) ^% [2 m# U: O! o! ?! s
    hex = toupper(hex); $ q: P) T! E! _1 {
    if (isdigit(hex)) 2 B# N$ L3 H6 r* [; \* Y
        return (hex - '0');
4 B6 C4 h/ G; Q3 r! B    if (isalpha(hex))
$ }" C5 M7 @# S, n1 S        return (hex - 'A' + 10);
1 M7 T- y$ i7 `3 {' s2 M8 \6 U    return 0; # z# c$ ]6 ^" `2 L" T% g& i
}
8 g! o, a# o' N- G  O
9 Z) F3 T! ^* B0 Y1 ^" U2 K0 t8 B$ Fstring bytesToHexString(const byte *in, size_t size) {
: H4 g) h- G& T: d8 O; q4 Q    string str; . P; t8 G4 Y7 @% G
    for (size_t i = 0; i < size; ++i) {
8 w, h1 V& b2 ^. Y        int t = in[i];
* B$ U. _3 A: T( [* K# ~        int a = t / 16;
# X) q/ b8 S0 o2 Q5 M3 J        int b = t % 16;
/ W) X8 Q+ K6 d) g! s$ K, t( D8 L        str.append(1, intToHexChar(a)); * X* R& K/ h( H; {7 q
        str.append(1, intToHexChar(b));   z1 N  Z" p; P3 R( F. S  [
        if (i != size - 1)
& \" X1 E* Z( @" j            str.append(1, ' ');
* \6 A$ x, v+ m! ~# S& F    } / F' L3 @0 t* f" s+ P8 A# ?
    return str;
1 Q  p0 _. Q7 P$ z$ F}
8 F  K# H3 d* X ( ~; ?) t% A+ J/ |
size_t hexStringToBytes(const string &str, byte *out) {
8 q7 Z) L& j; C$ j
1 M( j& {1 a, M0 ~$ p8 q    vector<string> vec; 2 I- D& o; V# f* u: w; ]5 K9 {
    string::size_type currPos = 0, prevPos = 0; - s, s; {& I8 ^7 |. @+ `, j
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
8 l0 s% f$ p3 O0 K5 O3 Z! O  [        string b(str.substr(prevPos, currPos - prevPos));
0 M- h5 _3 Z* \4 u# P; v        vec.push_back(b);   F& {, A" N7 |
        prevPos = currPos + 1; ' o( R  b2 W& k% _9 {$ ?
    } . u9 {4 c3 l/ e; J
    if (prevPos < str.size()) { 0 x$ u( w2 L4 N. e2 D1 L
        string b(str.substr(prevPos));
; \  [, m& W0 L$ l- J9 Z! N+ B        vec.push_back(b);
. [# w1 f1 }, g+ [8 v/ I* C, \" s    }
4 c* {1 X- j7 R) q) R    typedef vector<string>::size_type sz_type; . r0 E  n9 Q) z3 ?( p
    sz_type size = vec.size();
( h. X; Z# z) f2 Z. _# a$ j    for (sz_type i = 0; i < size; ++i) { " |$ s6 _8 f: {; ~( y
        int a = hexCharToInt(vec[i][0]);
3 j9 ]  U& L/ {        int b = hexCharToInt(vec[i][1]);
; v& I# L5 l! ~        out[i] = a * 16 + b;
4 i, s3 U6 H* b* X6 ~* i  J    } 0 A# l2 o$ T1 R4 E; K* r0 v8 r/ ]
    return size;
% {8 G0 x/ f+ k2 H8 K}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H + k7 I8 |/ e5 z% S  r
#define TEA_H
, I5 i) K7 M9 A3 `3 O3 ?
# Y! ]# ~: G: S: u; L8 [/* 3 r4 R5 S6 w0 @# w" v/ X
*for htonl,htonl * f. t2 X2 T; }# L" w
*do remember link "ws2_32.lib" / i( a1 h2 m0 z" @1 D8 g
*/ 9 n  s/ J2 C; l5 V
#include <winsock2.h> ( R' S8 Y4 k2 d/ {  R
#include "util.h"
/ b, P1 P7 n/ E+ t5 p9 O5 M 9 Q9 ~- ^2 y6 N& A4 W
class TEA {
2 T; A& p8 [: `0 n3 M6 }4 Npublic:
! B0 s7 [/ M$ H3 Z    TEA(const byte *key, int round = 32, bool isNetByte = false);   S- j" F0 j0 |) z
    TEA(const TEA &rhs);
7 O# @! C9 l" N    TEA& operator=(const TEA &rhs); & G3 R/ Z/ A' G
    void encrypt(const byte *in, byte *out);
1 |. T  p0 n" ?7 [! }% x    void decrypt(const byte *in, byte *out);
) t' ]/ d6 T2 n/ v8 [private:
! j9 ]/ l: V* K    void encrypt(const ulong *in, ulong *out); & D- r7 ?) Q3 `0 ]- J. Y
    void decrypt(const ulong *in, ulong *out);
7 x9 j# W- r! p3 G$ J  y    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } + l8 f1 \+ e2 F3 ~* ]9 {7 h# O
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 3 |! m& H8 t7 d- i
private: * J/ p, ^( D3 A' g1 C9 H
    int _round; //iteration round to encrypt or decrypt 9 t9 p* k" r. t3 `9 c  L
    bool _isNetByte; //whether input bytes come from network + x* b; c6 d3 A0 e+ s2 d7 O
    byte _key[16]; //encrypt or decrypt key 5 Q7 {! W5 F" f9 M- n8 d" Z7 I0 ~. M
};
& h2 `2 a: u9 {; C, Z
  C6 Z% u9 h4 }% A3 p#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 6 _9 Q$ ]3 L4 a1 R9 V* ~) c$ i
2 #include <cstring> //for memcpy,memset
; Y) p' O7 L* C& I& m. E  q+ ^ 3  + N) [7 j9 L+ N
4 using namespace std;
( L* f+ S9 Z  n0 |7 ? 5  3 S% Z: T3 @7 F9 P
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 7 Y- A) e  N* d! h  s4 _
7 :_round(round)
# Q' \% M) B/ e2 Z: K2 @' B! M 8 ,_isNetByte(isNetByte) {
2 V4 ?( t% E% o5 q3 M 9     if (key != 0)
8 S: K2 [0 Y( U& t- h5 u/ ^8 ^10         memcpy(_key, key, 16); - n$ s$ X5 `3 z" Y2 F  X: b* u. p
11     else
/ t4 q2 \9 O% p12         memset(_key, 0, 16);
: b  A/ [) r0 {  |, b13 }
( i+ R! q3 A- s14  2 ^6 U$ D4 H7 E% U) e
15 TEA::TEA(const TEA &rhs)
$ |8 F9 U4 T/ |) q; i" D; H, M16 :_round(rhs._round) 2 e! N) V# P7 e+ _3 j- a
17 ,_isNetByte(rhs._isNetByte) {
3 h, k  \5 s6 f18     memcpy(_key, rhs._key, 16);
: Y5 C0 z0 l5 G# y19 } 2 [* h, w) n9 U
20  
1 I# S$ H% z8 J$ u21 TEA& TEA::operator=(const TEA &rhs) {   V3 d& t% [% }5 G4 K; F( K$ [8 i
22     if (&rhs != this) {
# _' W0 \4 f0 {: ]. {23         _round = rhs._round; % c! T; N3 w, ^' P& @
24         _isNetByte = rhs._isNetByte; ) p$ J4 _+ i! y1 @1 t
25         memcpy(_key, rhs._key, 16); ) K+ c9 ?  E1 W) f; }
26     } 4 R0 H8 A$ G3 h; }  N
27     return *this;
! T' p+ H* |$ [# d, [28 }
( J9 f9 c3 R+ t29  
7 c2 {& w. F* o  O30 void TEA::encrypt(const byte *in, byte *out) {
1 c0 @! U/ [+ U  o6 q31     encrypt((const ulong*)in, (ulong*)out);
6 c, f/ K# m( |; c32 } - Z* f7 M: ~0 n/ j( p( W$ j* Z
33  
" J* `# `  c) R% I' P6 }3 H, ?# g( k0 e34 void TEA::decrypt(const byte *in, byte *out) {
7 n+ Z% m: F7 x35     decrypt((const ulong*)in, (ulong*)out);
2 v& G6 Q) T7 \9 B$ I6 B36 } 0 N" n6 G$ _; V
37  
. P0 e8 N0 C; I! n38 void TEA::encrypt(const ulong *in, ulong *out) {
5 U- C0 X0 D* \/ G. B39  
* I/ g( Q- M1 ]) g+ n/ g2 k" r7 ]40     ulong *k = (ulong*)_key; % {. [5 X& G6 _; z, w" n
41     register ulong y = ntoh(in[0]); # q/ E$ A$ l! r3 d. R
42     register ulong z = ntoh(in[1]);   U- p/ |, p* `
43     register ulong a = ntoh(k[0]); ! K8 C  Z2 K% |/ H: ^4 x5 I
44     register ulong b = ntoh(k[1]); & ?8 N8 e$ R2 w+ u2 C% e9 k
45     register ulong c = ntoh(k[2]); , V# D/ g8 q& V: i" E9 G0 n. _+ z& K
46     register ulong d = ntoh(k[3]);
: L8 U. R+ d3 L& A" p; ?47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ G7 Z. U7 R3 P! s& o48     register int round = _round;
+ \+ Z* E- ~2 s0 X/ e7 q' k1 g7 k49     register ulong sum = 0; - U+ |' F; \& {! W
50  
5 L. V4 \! n& y/ T# Y, D51     while (round--) {    /* basic cycle start */ 8 f0 }* I' z' {( n! U: z
52         sum += delta;
6 h% n" Q9 N% T% n5 i  j* h/ j: \53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 9 I' n# ?1 M  d$ T. F+ S1 b
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
2 {/ Q( U! ?5 B2 k; f: c55     }    /* end cycle */ ) W) ~( @, a& L3 x
56     out[0] = ntoh(y); ) Z4 ]8 `$ C; a4 g# u; _
57     out[1] = ntoh(z); 4 Y) }/ j8 D6 j
58 }
, i* Y7 ?7 d( s% H3 G0 ]59  
1 w% P; Q5 k# s$ v: i60 void TEA::decrypt(const ulong *in, ulong *out) { ; H! C# O( |+ y% O: b
61  
# y# U1 i( o, ]. S4 d- e62     ulong *k = (ulong*)_key;
" b% {% `0 Z, c- g4 r! g63     register ulong y = ntoh(in[0]);
% n  y- o( _/ j, j5 |8 f; T6 z64     register ulong z = ntoh(in[1]); ) u; B$ j2 D( D( P  S3 `3 s
65     register ulong a = ntoh(k[0]);
. S8 C  L. d% T: R9 ~66     register ulong b = ntoh(k[1]); 2 R9 K6 A, E$ y5 U6 P
67     register ulong c = ntoh(k[2]);
) h! u9 {) H7 @% h3 G: C# N68     register ulong d = ntoh(k[3]);
) p' C$ V! T1 r; @& ]! c69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
$ }9 `' K3 a9 l1 _9 J3 |70     register int round = _round;
! B5 T9 s( @- V% }$ h9 J- r& }71     register ulong sum = 0; 1 E& o; w& f+ l8 X# z% ^. B9 {# x
72  
8 Y0 [, s, k  M+ ?73     if (round == 32) & C; r* \' T# P, }- M8 g6 i9 P) W
74         sum = 0xC6EF3720; /* delta << 5*/
3 a2 P( S5 |# g0 ^7 ]& f- k5 t75     else if (round == 16) ( U7 d2 u) ?* A3 B+ Q" _, b/ s* M6 I6 a
76         sum = 0xE3779B90; /* delta << 4*/ # A0 d% F% Y' d3 L* V# k4 L2 N7 P
77     else
4 [! q7 c& n: a: x  u: F78         sum = delta << static_cast<int>(logbase(2, round)); 1 p% p, H' m9 s0 ~9 P# J; b9 N
79  5 i! j- k& @. v- d
80     while (round--) {    /* basic cycle start */
& W, y  v5 H! b81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
7 z# V7 y% N) `& Q; D! v7 l82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
9 R( F4 d1 [% l( t# t83         sum -= delta;
2 a' y" u& }6 ]' \84     }    /* end cycle */ 1 \' z% l7 m  ]5 y
85     out[0] = ntoh(y); + n3 A: f5 ^4 b5 {
86     out[1] = ntoh(z);
6 Y% A6 D$ h6 c* m" g87 }, z9 j+ S, `  M0 m- o) m7 S& E

4 I  u3 e# d( U需要说明的是TEA的构造函数: , {9 ?+ g2 Y1 w! A
TEA(const byte *key, int round = 32, bool isNetByte = false);
4 y: ^0 `4 ?& A& Z  g, M4 [8 h! b! ]1.key - 加密或解密用的128-bit(16byte)密钥。 5 o2 r! d& U. O' p5 i
2.round - 加密或解密的轮数,常用的有64,32,16。 1 W+ Z  D) b2 _& @7 ]- f
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
: u! U! n, V5 \! k! g8 D) V6 \( C, l& b! n; l' B4 t# w( o2 g
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" . r% I/ U, C# p: C
2 #include "util.h" ! T5 c* k7 }9 ^6 Z; z  [
3 #include <iostream> * p! x1 i" @+ x( \4 ?
4  2 m" {) ]0 r4 r4 Q7 p1 K8 f9 h
5 using namespace std; : ^' J/ [1 c; Z$ Y; G% ]
6  
" P& Q- K: y6 B' ^ 7 int main() {
6 ]* s6 i8 Q5 p0 n 8  
" B$ B0 {. `5 W3 | 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 1 t& J9 m7 [: E- ]  ^
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); : H( a! v9 X! Q) D* b  c/ ]
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
) C/ _: P, b2 T5 o7 O* F! N12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; # F& z- U9 D! O. q+ `( p* ?
13  
, [, C  p3 C3 _! ?/ q! B  g5 i" ^14     size_t size_in = hexStringToBytes(plainStr, plain); 7 s4 @/ R; j! a4 B! ~0 Q
15     size_t size_key = hexStringToBytes(keyStr, key);
% H! x& i5 l+ e  s16  
* {' ]9 c3 |' a5 ?! `# F& L1 \17     if (size_in != SIZE_IN || size_key != SIZE_KEY) / n$ {# ]3 o! u; Q/ A
18         return -1;
$ b$ j" {/ j* {6 F19  - R6 y8 W9 p6 q. N% V, T
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
" F& d8 k1 y. @. w7 v: j0 _8 c21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 7 H* j# Q* c1 O4 v  J& C  }2 |  l
22  
- N3 O" I$ \8 ]# S6 L23     TEA tea(key, 16, true);
8 h8 B& H% F: [  u24     tea.encrypt(plain, crypt); 1 M. D- s" C6 A$ z4 }& Y/ B3 K
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ) ?$ D6 U" m" {& g" g
26  
0 w& G8 X, `- ^0 |* {27     tea.decrypt(crypt, plain); ( G4 K' @: A! m4 a" L: w
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) Z) s8 y! f* A0 T+ B0 F" W& S29     return 0;
$ n  S" a: g" J) |% s30 }
( x# D8 b& B$ v5 w, b( w! h" [3 Z. t' D
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx% ^, B! G; D, q& }& `6 b
运行结果: 8 u0 s$ G. L$ e& |+ E
Plain: AD DE E2 DB B3 E2 DB B3
! X2 U1 {9 u8 B, K3 a5 wKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
9 J1 w  z6 H2 O+ KCrypt: 3B 3B 4D 8C 24 3A FD F2 % i8 X. C  n! f
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-25 11:13 , Processed in 0.019570 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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