找回密码
 注册
搜索
查看: 37773|回复: 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 n/ x/ e; N0 U# E; E* q: F微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
! V& s4 [  ^2 T5 j8 I. TTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
" z' S4 k# t5 w. |% h& P之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 7 g; Y1 q8 Q2 Q2 w; Z; ~0 a& j# p
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
, R1 A7 F& A8 S: k在 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. * e0 |9 c7 r6 T" y# p8 V
  2. void encrypt(unsigned long *v, unsigned long *k) { - n. x/ q. _' }, F, k
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    9 b; T4 o, r2 P; Z7 L6 \  T
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ % Z" I/ S* h; z! g" B
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    . b, \, A6 J/ y+ k% l1 X3 I! b
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ * g; V8 g, ^. S" Y, Q' ?
  7.          sum += delta;
    % }; o' n/ q, G) L. c! K  a
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ! k% E9 R6 J" ~1 j( H2 I9 B
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    / O# t, f' M$ e/ ]! s
  10.      } 5 T  u: w8 J, R% \9 l7 F. i
  11.      v[0]=y; 7 p" ]" v. L3 G% X( s) J; t
  12.      v[1]=z; " `6 P& M0 n; _/ e, h5 W) C
  13. } 1 Q- Q5 {9 y6 c  \+ R2 A8 E6 |7 H
  14.   
    + J0 i0 p* L% v3 V& A2 |
  15. void decrypt(unsigned long *v, unsigned long *k) {
    + w% x( G; ~" S) K
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    6 H6 l/ V& {. ~5 M- J' B* o
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ; K, U4 j1 j/ s7 n. q; X
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    # e% Z! N5 `5 w5 k- K2 G
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    7 U  N0 S5 x. y6 l
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    . L% t. K1 ]  |4 _$ ^
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ g( S' K5 E" I* t4 f; @
  22.          sum -= delta;                                /* end cycle */ % O# n& j1 `. L9 P4 P5 w
  23.      } 1 f  P6 ^/ I% s1 S/ f6 q2 G
  24.      v[0]=y;
    ) m+ s- v. G2 C6 e' s- y& U
  25.      v[1]=z; ; E( S/ P) |6 ?; a: l
  26. }! U$ P4 |& x5 u, C( j; v7 ?, k
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 9 I& v. }/ o  h3 m3 c4 S9 L
#define UTIL_H
& j$ Q# Q& ~. l' L& m
, J' q$ \( ]* \9 n; [1 [#include <string>
9 w, Z3 R* j% D' ]#include <cmath>
  n& x" X5 j, |9 c#include <cstdlib> 9 Y* F* `2 m5 i0 x

8 h* a0 Z6 ~  h# w1 k/ ktypedef unsigned char byte; : `1 `' v  G: b
typedef unsigned long ulong;
. [6 b+ P. A' F/ T) C
) }" X/ M6 r$ F! a* jinline double logbase(double base, double x) {
+ d& v: r& H- G9 D( [    return log(x)/log(base); 4 d8 j/ n0 {, o; |) W# G2 G
}   N) f, G3 K! \8 Z" ]
( r- a6 n9 F& l4 Z
/* . ?5 T- o) Z( o# w& K0 |
*convert int to hex char.
* ^( G$ c9 F. ]0 ~1 b6 W% K& S8 s% h*example:10 -> 'A',15 -> 'F' / S& q7 V% j9 N4 r) {4 R# X& W0 A
*/ 1 N. ?. Z8 B1 R
char intToHexChar(int x); 9 F7 ]/ p5 U/ }" R0 k) |" N
8 y- l& v& N5 O- d
/*
9 |- i! q2 M8 b* M% W: |*convert hex char to int. 2 L# ?) ]) U1 [; {
*example:'A' -> 10,'F' -> 15 7 ~  s* I. P2 J! l
*/
  C: ?0 `, p6 R7 Q8 ~0 V: G8 h1 g& Mint hexCharToInt(char hex);
4 h) j% `5 {% O
! O- T8 @1 x% `( k! k1 v% Kusing std::string; % c' o' _- ~0 Y8 x) [2 A
/*
- ^" Q% f/ r4 _0 D*convert a byte array to hex string.
5 M0 d. }7 L- |2 ~5 [/ U*hex string format example:"AF B0 80 7D"
: O* H* s2 Z3 K. `) n( ^" E*/ % S+ p# _" O2 o& K! h4 r) I5 Q
string bytesToHexString(const byte *in, size_t size); + ]) }5 Z" u+ p4 U" k
/ O  V% o4 P  J
/*
- ?7 z( `. C3 |! \# M, }*convert a hex string to a byte array. + b/ ]6 s8 ?* L  I6 ^
*hex string format example:"AF B0 80 7D" 5 e/ D* y2 \- D* ?8 v: t9 J
*/
( q  I1 w3 Z$ j1 Jsize_t hexStringToBytes(const string &str, byte *out);
# v3 N. F$ ]7 Q! p" j) D : K% w7 h5 o& A! r1 H
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
, Z# u3 i) d! D! R  i( r7 A. X4 P8 A#include <vector>
; @. {2 E0 v+ b; ]/ A ) {0 x6 ~" d: x9 c- U5 ?  k
using namespace std;
1 a/ l6 e; `! x7 M* S ! d0 a% V& o5 _& P
char intToHexChar(int x) {
# L9 e& X% R2 M) e$ H1 r8 I+ Y% |    static const char HEX[16] = { & ^* Y0 \- a" s6 ~# V
        '0', '1', '2', '3', / [" @4 O1 \' T6 a7 j: }- {
        '4', '5', '6', '7',
$ D+ z7 H" B9 F        '8', '9', 'A', 'B',
/ |& @& T  `4 p. s1 a8 L7 @) B        'C', 'D', 'E', 'F'
, |! _& r( r3 L" _) e/ S& D    };
# }( ]! R1 C( _+ {& E) Y- X    return HEX[x]; 0 O% z! E- G+ T2 O1 d( i
}   ]5 A: _  X2 L! ?( [+ {  L

2 x9 V7 `  ~0 m( p" Y) pint hexCharToInt(char hex) {
' ?" A6 {7 ~  A% U    hex = toupper(hex);
9 R3 C5 q$ X8 d: I7 c! l7 f3 U3 @    if (isdigit(hex)) 2 o) W5 B( {$ i  H3 }
        return (hex - '0'); 9 c' c3 z& p+ P: w' y7 g# ^
    if (isalpha(hex)) % ~. L- d$ j5 y% j0 W
        return (hex - 'A' + 10); % M8 i/ s0 |0 D! N( R
    return 0; $ [) u" }+ ]% H# `* W  [
}
% t& |' c0 ]$ x3 u' q! ^! ] 3 g" Q. Q% r& e! H- o0 V$ S
string bytesToHexString(const byte *in, size_t size) { ( A$ t3 B+ d1 j/ d/ ?% _
    string str;
4 H8 M' b! v/ I- u    for (size_t i = 0; i < size; ++i) { % H* e0 ]3 @3 d) ^
        int t = in[i]; + {% Z* `8 D3 j
        int a = t / 16; ; P; T. z6 l6 C7 z
        int b = t % 16;
3 f; \( ?/ J% w" ]- Z% w1 k# {5 t. f        str.append(1, intToHexChar(a));
3 H- ?9 u9 `# b0 X" T; }        str.append(1, intToHexChar(b));
: d' U; E( e) ]) h* b- z) Y- H; k/ v        if (i != size - 1) " w& u8 _; D5 i. }4 j
            str.append(1, ' ');
/ J7 Q; a, w2 a2 Q# l    }
) E8 b5 M$ ]% H0 {    return str; * f5 g$ r# F/ k
}
& E: h; {* P) h' C" B 1 g/ m( p$ G: @( x& d8 O
size_t hexStringToBytes(const string &str, byte *out) {
$ ?4 M$ h+ u8 ? ; c6 T/ a! J% O! {* {$ w; Q
    vector<string> vec; 7 \  _5 d+ U/ D9 E! g9 @1 N8 u
    string::size_type currPos = 0, prevPos = 0;
3 g- p  B8 D! W0 `5 j- z+ Y* Q- n: @    while ((currPos = str.find(' ', prevPos)) != string::npos) { 1 W) e. F& v7 ]* V/ n1 R2 W/ L2 f
        string b(str.substr(prevPos, currPos - prevPos)); & Y( x( P; @0 W2 W7 t: D
        vec.push_back(b); + M+ o5 o+ B, j2 s/ {4 p( Y* U% K
        prevPos = currPos + 1; / T* a: b7 ~. D3 z# x
    } 1 K9 R& O0 y8 i
    if (prevPos < str.size()) { & z7 u) r7 b2 a2 l! ?
        string b(str.substr(prevPos));   f+ a7 |$ h+ \: }7 r
        vec.push_back(b); - g- a( j2 D- Y. `
    }
: ]( V0 r9 s+ b+ M( c! M" ?/ @4 u    typedef vector<string>::size_type sz_type; 6 X1 h9 q0 P/ v4 ^4 b
    sz_type size = vec.size();
7 G3 X, ~9 E0 T: P6 ~    for (sz_type i = 0; i < size; ++i) { 0 C& N2 ^, C+ U. k4 s9 x
        int a = hexCharToInt(vec[i][0]); ) X, y0 n: I0 {, [: B% }& g0 W
        int b = hexCharToInt(vec[i][1]); ) f, f& R* z/ M  X; v& \
        out[i] = a * 16 + b; 9 L8 F1 i; c4 f5 q2 r6 u$ U
    }
. H" I0 ]& K% `    return size; $ _$ m' ~) E$ N8 r& k2 n( n
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H $ O3 y. \- x( T- x  F
#define TEA_H   C- k% V1 R& M+ q. `. x8 {

( a2 s: \5 n. J* c+ t$ ]+ G/*
3 \" F' f1 H2 F4 D, Y*for htonl,htonl 3 D* {( U% j. B5 R# o. h
*do remember link "ws2_32.lib"
; T( X* ^* T! B1 ~5 Q*/
+ D: D: b7 t, ^6 P* x#include <winsock2.h>
% ?% G" h" w- H* N5 `#include "util.h"
' e* _( p( N$ D# s: Y1 [: T" e/ K
: X' i7 h8 v, h$ L8 {class TEA {
3 x& X+ `  U0 i) _public: ! G5 b8 ^! L3 m2 w6 b# X
    TEA(const byte *key, int round = 32, bool isNetByte = false);
* v* v& h9 X- g; y4 T    TEA(const TEA &rhs);
5 m7 ]1 }9 f$ e- B; c    TEA& operator=(const TEA &rhs);
# k  X1 s5 d' k+ {- y; [& }1 C    void encrypt(const byte *in, byte *out); ) z* |, i" Y0 v( W: g4 f
    void decrypt(const byte *in, byte *out); & P1 o" e2 P, y4 s! V
private:
+ ?6 J1 T& V' p! p, g% \    void encrypt(const ulong *in, ulong *out); . o  Q7 T( F9 z0 a- e- `, T
    void decrypt(const ulong *in, ulong *out); & d9 _" B$ I5 E4 M
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
: I/ Z' p6 x2 b1 s5 a. f/ o& F' _    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ; K/ \% m# u& P* q
private: * B! A3 l- u' C$ @
    int _round; //iteration round to encrypt or decrypt 4 p+ K" G  V8 q, q3 d9 e2 V! F
    bool _isNetByte; //whether input bytes come from network
/ p, p% v: ~# d3 N) a% j    byte _key[16]; //encrypt or decrypt key , w& {* ?( P1 N" m
};
( `2 j+ g6 o5 k' j& F. ~* }
) T5 Z3 ^. ?8 C' E& D5 Y/ i3 M#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
. Q4 K7 a( R1 `. K8 E' s 2 #include <cstring> //for memcpy,memset
  E% i8 g& {( v0 {- q" C2 y  r2 f4 M% q 3  # s; {, |1 E9 n! g
4 using namespace std;
9 g: A. w: I6 I7 E* r 5  
( P: V% T3 }2 H( P: v9 H2 y  D, `! e( A 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
' w# X* P" u0 N6 U 7 :_round(round) 1 J) U( L. U$ p; F/ O( B1 c
8 ,_isNetByte(isNetByte) {
: m% F6 k/ N1 }; ~' } 9     if (key != 0) . ~- m" `9 V) K* v# t
10         memcpy(_key, key, 16);
% ?5 n1 N5 b) v* B11     else 6 B% J! {% F4 Y/ H% S  ~! j5 T
12         memset(_key, 0, 16); & c0 n8 w' D5 @  I; W3 t3 r
13 } 8 o1 ]3 T- c# [  \
14  
) W2 I/ M8 m) c15 TEA::TEA(const TEA &rhs) 8 i9 x/ q2 y/ i8 E% z  k2 M
16 :_round(rhs._round) 8 |9 O3 h* ?/ x0 a# `3 O: c
17 ,_isNetByte(rhs._isNetByte) {
! o2 ~  r3 N& J4 z18     memcpy(_key, rhs._key, 16);
! [4 z2 L) C9 e8 l19 }
1 @: ~# @' H9 o2 {8 w  q" m: M8 Z* n( L20  # K- g8 a; @6 F  F# [5 C. z- o, C
21 TEA& TEA::operator=(const TEA &rhs) {
) D+ M3 I' o: p* F" X22     if (&rhs != this) { 4 \1 |$ A& g) i& [+ _. f
23         _round = rhs._round;
) q2 |' R3 b; F# i, J24         _isNetByte = rhs._isNetByte;
( G' B4 M1 F- U6 z) G7 U* a1 l25         memcpy(_key, rhs._key, 16); , P' S9 {2 w, x9 l/ e! {2 @
26     } * \* D* W( x* f7 r
27     return *this;
) X9 E8 V% B4 `28 }
' L* Q- G# Z: o; Z! F29  ! ^: F3 X# O) s$ d# e9 {9 |9 `
30 void TEA::encrypt(const byte *in, byte *out) {
, R* h. d3 `+ r# n* v2 c1 W31     encrypt((const ulong*)in, (ulong*)out); ! j7 x! i. @  B( @7 b2 I
32 }
* w2 ]. t+ V' A& f0 }* k# ^7 M33  - L9 \" \) q) h! w2 G+ z
34 void TEA::decrypt(const byte *in, byte *out) {
3 r3 j7 l# k7 P35     decrypt((const ulong*)in, (ulong*)out);
( w0 f  {0 H0 O0 `$ z36 } ! G* C! c8 q0 X
37  
& \6 a4 _  P4 t' M, ^% E38 void TEA::encrypt(const ulong *in, ulong *out) {
1 K$ V! B" r7 j3 ^/ T4 v1 ?5 T39  ) I! q1 ?* w' q) W5 E
40     ulong *k = (ulong*)_key; 0 N$ X0 U: R/ x) b& v2 d/ v
41     register ulong y = ntoh(in[0]);
( U7 f, A# u# G- p( Z  y& N6 A42     register ulong z = ntoh(in[1]);
) \8 t- y% z  D* Y0 T; w43     register ulong a = ntoh(k[0]); ' v5 c! t4 E/ ?
44     register ulong b = ntoh(k[1]); , W4 P9 h0 q" v2 g+ j0 i6 k6 V! G
45     register ulong c = ntoh(k[2]);
' K0 L3 J2 W1 B- q" g! z46     register ulong d = ntoh(k[3]);
/ H- k) R8 E* F  Y2 l8 ?' x47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ; A+ y  L& V" Z7 H/ v' l' E
48     register int round = _round; 0 Y+ B6 P! k6 l; T4 d
49     register ulong sum = 0; 5 v" U- e" N  b
50  ! Z, l( w, c9 R4 \: q. z6 h
51     while (round--) {    /* basic cycle start */ 7 W7 _9 m7 K) [6 z2 W1 A" R7 ?
52         sum += delta; $ E; j1 L& |; k6 [3 d: t7 ?: m; ]4 R
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); % W# `5 M: m8 c, w4 o  x0 w
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); % W  ~4 K. o) Z6 a2 F7 P
55     }    /* end cycle */ : z% R& b0 t7 c9 j5 @& t1 S  }2 {
56     out[0] = ntoh(y);
& E, Z% x& W6 ]" h57     out[1] = ntoh(z); " F# L: l& u7 h1 N3 J% Z
58 } ' t, v' ]0 N: t8 W5 y" R4 z
59  , o4 ^+ u$ ^$ U
60 void TEA::decrypt(const ulong *in, ulong *out) {
1 i1 E: y# l# l: X& k7 X61  
+ v* v' ?! {/ X& T$ @+ l62     ulong *k = (ulong*)_key; # o2 e" w- u  h
63     register ulong y = ntoh(in[0]); 5 S+ f, c+ G- f/ ]( ]
64     register ulong z = ntoh(in[1]);
7 p  N% S9 x$ Z, b65     register ulong a = ntoh(k[0]);
! s4 p- f4 u) }+ _$ V) U. W/ m66     register ulong b = ntoh(k[1]); $ _) K2 b8 e0 C' p8 G& F$ W: Q
67     register ulong c = ntoh(k[2]);
* J7 L7 ^! n6 n* A% T5 O, B68     register ulong d = ntoh(k[3]);
6 r1 F5 r% `: j! r( i9 b- Y69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: E' t/ A2 M2 \. u9 ^+ p! F70     register int round = _round;
0 J5 o$ o9 z8 K8 J% v; n8 t71     register ulong sum = 0;
! X. p# b% c6 ?' l4 J72  8 _" [& H, g* l5 O6 \7 D2 T3 G2 a; b
73     if (round == 32) . g) K6 v9 |; j& q
74         sum = 0xC6EF3720; /* delta << 5*/ " Z7 k2 s0 h" E/ Z" k: o, n
75     else if (round == 16)
2 g! q! p1 Z, L7 W1 y76         sum = 0xE3779B90; /* delta << 4*/
! }$ y$ w) t! q5 D, h77     else ' [6 q# D4 w& [. L" g
78         sum = delta << static_cast<int>(logbase(2, round)); 7 r! p( P, S5 \
79  
) l2 n( b( N5 b/ H  g5 N80     while (round--) {    /* basic cycle start */ % i7 z( |' m2 t/ d$ K
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ( e' |# `0 X" S/ H0 s
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
& Q: Y  V! y+ P3 d3 Y83         sum -= delta; . O/ [0 k4 P% `; f/ d) X
84     }    /* end cycle */
- V% ]- U* e$ Y1 e$ m$ V85     out[0] = ntoh(y);
. |; A+ r5 R" D# T# c86     out[1] = ntoh(z);
+ W! j1 O2 v9 z. {87 }0 z. M; M8 g) Q2 }

& e% ^! {% e! M- r4 Y# \: S需要说明的是TEA的构造函数: ; O8 c' ?* q) q5 P
TEA(const byte *key, int round = 32, bool isNetByte = false); 9 Y0 C0 X2 E' b$ ?
1.key - 加密或解密用的128-bit(16byte)密钥。
: z3 B, `: B0 i: U" B2.round - 加密或解密的轮数,常用的有64,32,16。 6 z2 h4 T9 H& `
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! / ]/ F" E* _, u- U) O& T

( z1 I: c. _% R5 w; @最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 4 b( d- z$ m$ z6 Y5 I" d2 E( ^
2 #include "util.h" + A7 _0 `' a0 W, ~
3 #include <iostream>
' ]+ a' x3 K  s8 `% e" H- w5 A/ M 4  
) {# x% S& a7 [/ Z* }1 l1 G% T 5 using namespace std; 5 T# w( _4 h) p% H4 G1 L3 r6 C
6  + s+ s' V/ R3 ]# Y1 w
7 int main() {
/ A. |& i- P$ i! s1 ^0 E 8  2 B" b' x: z0 P3 N/ I+ \
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); % |( R6 h0 v& w. p
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 7 E; V! o+ Q/ K/ m& C( J
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
8 V& ]& M2 R2 X0 E; v" o' g2 I12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ; Y+ I# R9 L9 V2 J9 f: ~( Q0 Q5 l# f
13  
3 s5 L7 _6 r; y- c% V) I. h14     size_t size_in = hexStringToBytes(plainStr, plain);
; y8 g( K, z* n6 ^& n15     size_t size_key = hexStringToBytes(keyStr, key);
, H) I$ ?- l; D, N16  " }# P5 Y  w" y9 r# a1 _
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
9 M4 S: g/ X. e* c" l4 Z/ a18         return -1;
% K' ~9 A( o! e19  
3 g. s  L% N" _" u- g; P0 y20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
, X4 L% d( t  v/ {% S2 G21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
( \0 W1 ~3 P( I. F( F9 L+ u! b22  8 [# o. Z5 q. \0 A% g2 G
23     TEA tea(key, 16, true); ! k0 s" z0 c* Q8 |/ [* }0 i1 J. R
24     tea.encrypt(plain, crypt);
4 \8 e+ r% [$ u, |; J* A25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
5 e+ c- }' p8 D) D26  
# U8 X3 ~! x# Q# }# N# t27     tea.decrypt(crypt, plain); " @1 s2 t' [9 D" U
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; / `# [5 g" q3 }/ r+ E( ?
29     return 0; / `! C# z* C" k/ @
30 }
( i2 W# z! U! H6 Y& n* e; \6 c. N" }9 X
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
; y, [* H' s$ O  F/ r6 x7 D9 F运行结果: 7 O! v' P0 ]" J2 U
Plain: AD DE E2 DB B3 E2 DB B3 , O) I2 V7 z6 E
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ( O0 @$ R  g) I4 }' j# Q+ r6 l
Crypt: 3B 3B 4D 8C 24 3A FD F2 % t; N' z/ {- z
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-23 09:47 , Processed in 0.021018 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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