找回密码
 注册
搜索
查看: 37529|回复: 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轮):
+ f! N, C) A# z, C* ~+ ?微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 2 d. a1 n5 l4 O; H$ k2 A1 P% c
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 3 ^4 p. n  i- S, S. }3 O9 j" [
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
9 `$ d6 B' A& Z" F3 o5 J" N. @! Y在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 8 I3 q6 ~9 j- k  _' M" o1 D% H
在 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. % y+ K( z) l6 U$ @4 T
  2. void encrypt(unsigned long *v, unsigned long *k) { : D7 I, b5 k8 `" E
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    * h' \& M9 |5 T. A" N8 \
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ; |! X- a- ^! s0 |; }
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ! b; r: u& l9 K& m' O6 Y8 Q
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    - ?9 o7 S( `% F3 Z( }; U8 r8 m
  7.          sum += delta;
    - }# ]5 f4 k. X. |8 @! g0 @
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    3 P% h0 L1 m- [# W  E) C; o, Q  u
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    + `' r0 D1 o# O" n$ L
  10.      }
    6 Z, g5 N9 ]6 r  ?5 b# e% a
  11.      v[0]=y; 2 H& w* y4 @" A) @
  12.      v[1]=z; * r* o) d" U( R" v% _1 P
  13. }
    , Q  s+ F7 c2 G" w- v4 ?4 c
  14.   9 z! c8 L: l% U; Z4 `
  15. void decrypt(unsigned long *v, unsigned long *k) {
    # b  S* V( }% j6 s; u; D) A
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    2 X% ^5 B% {4 a3 @" U
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 0 ^4 e; y0 Z7 g& X8 G$ H, ~) h
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 6 r1 G0 Q5 H2 `; {8 I' R5 c
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    5 n7 Q& l, O; [2 i8 M
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); + ?2 O, D: a1 |
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    $ B+ E7 K3 P4 k2 M3 E
  22.          sum -= delta;                                /* end cycle */
    ! ?8 X$ M2 F; ~% \: a
  23.      } $ Z! q& O6 G! t% S3 S) ?7 s& U
  24.      v[0]=y; 1 j- u7 Q, r# ^9 Z4 b/ l
  25.      v[1]=z; 1 ]" A% r/ D( R! K4 Q( b# Q( Q7 G8 v
  26. }
      u; C; v6 o# t: V
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ) @6 k+ j' `- T4 Z' {
#define UTIL_H
1 I* C9 [- }4 w6 n& ~" V" r$ t6 K0 R- G+ u2 q
#include <string>   \( f! p  g2 ^3 U9 c0 U% N( I
#include <cmath>
3 V$ D. G( F. h1 W#include <cstdlib> 5 U  h7 @! c+ C, A
" J/ k5 _9 i4 I0 I5 v
typedef unsigned char byte; . G) J/ c4 y6 ]* t1 r; p! [
typedef unsigned long ulong;
& d) W# a. @) v" a   I. \1 U1 e( u- l# y
inline double logbase(double base, double x) { 1 d' v8 E* D7 [$ ]* u% {2 A9 C. l
    return log(x)/log(base);
$ _0 w: t% W% z7 k! d} / S' m, O2 I: c; r- y
+ H5 y* Q1 j: \8 F- \" x! |' F! x
/*
7 R, P2 J7 s# Q# e0 R) |*convert int to hex char.
7 x" `+ f/ v- k' X, a4 F, u+ e*example:10 -> 'A',15 -> 'F' 4 b0 r8 ?2 D, y9 w9 C. X
*/   N3 s9 |8 z4 w+ W" g
char intToHexChar(int x); 4 ]& E8 u) H" ?

7 r1 B0 Z1 W7 _5 d3 Q# u/*
% ?+ c4 `; J- i, `4 @9 C*convert hex char to int.
+ B9 u# b& k! L' H# \8 p: a*example:'A' -> 10,'F' -> 15
2 q9 C, q8 P7 A9 d4 ~% d$ K*/
9 A* x: j$ z; E: ]1 vint hexCharToInt(char hex);
8 I9 |: \* ]2 i/ F6 q
* i: J9 A( ~& rusing std::string; : b; A* F3 h1 E4 i$ ?
/*
. D+ l' k# I  ~8 j  q- Q$ d*convert a byte array to hex string.
! @& l( ?" A' w: A. p  i*hex string format example:"AF B0 80 7D" , B! W1 Y  Q* t. C1 F
*/ , D/ o% F$ D4 J+ R
string bytesToHexString(const byte *in, size_t size);
) y5 G! Q3 Q  ] 3 g* U+ O: M8 A% U
/*
: R6 M/ U# `$ [9 ?*convert a hex string to a byte array.
# \9 [* m# z; A*hex string format example:"AF B0 80 7D"
6 Y3 p# y5 D+ s4 a9 g+ R2 Z*/ $ ^* I4 a8 F, `# W* l* h
size_t hexStringToBytes(const string &str, byte *out);
1 b1 \- s- j+ i; Z3 V + _/ {2 T0 ^( ]4 v  Y1 h* U: U
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" * m: D5 T6 Y$ ]3 l% P4 K; r
#include <vector> / e7 q9 @' i& a1 _

0 `( G9 y& c& r6 U6 U$ s' f6 yusing namespace std; 1 G9 F! _& B) z" R$ f5 v* ?3 p

7 {: R8 C! w. X! z- i! h& r+ ]' c1 echar intToHexChar(int x) {
$ U6 T) c1 A8 X) [' R    static const char HEX[16] = { 3 D' `8 v3 H( b6 Z/ Q( H
        '0', '1', '2', '3',
% r: H: _9 M6 O; [; ~3 a& e+ c4 X        '4', '5', '6', '7',
5 c5 ^% W* \  O. G0 w, X6 w        '8', '9', 'A', 'B', 7 \  y* v# P- T6 P; S) v
        'C', 'D', 'E', 'F' . E3 M& k" K4 ~9 o: A
    }; , n: m0 e, O$ f- m
    return HEX[x];
# G- ]$ Z, z3 o- {: j}
. }! j8 d& y0 J+ q & [( [) q: @' s' [% |) ^$ O" }) Q
int hexCharToInt(char hex) {
! p: g# s2 j# Q7 z( j, J    hex = toupper(hex);
9 N9 I/ I* ?$ {" {& Z$ x    if (isdigit(hex))
- C2 {  f7 ^( ]$ ?4 ~8 i        return (hex - '0'); 4 ~3 o9 m8 W& V: C
    if (isalpha(hex)) 9 r3 B- h" |0 d0 ~: `/ Y
        return (hex - 'A' + 10); - Y1 P" c8 \# U' @( R0 P$ z
    return 0; ! l! L' m  U, L
} + G3 b3 `# O" G' t, D# l

/ `$ H1 F& F- g* ?& ~' w8 Ostring bytesToHexString(const byte *in, size_t size) { & R+ _) y  k% G8 M
    string str;
% Y* a) D7 B1 j* m* g* `5 v3 t    for (size_t i = 0; i < size; ++i) { ) `6 i, H& b/ l: |3 [
        int t = in[i]; 7 A3 a6 I8 a3 {# H+ F
        int a = t / 16;
( D5 D% g! M( I; u) \! \; C  _* q        int b = t % 16;
9 L+ X, y( Q# W9 B) C1 M. @        str.append(1, intToHexChar(a));
) _3 E! \9 S- P) c. r2 l9 J        str.append(1, intToHexChar(b));
) c7 P2 u2 P7 F( ?' Q        if (i != size - 1) ! G- r: e( @3 w: V; C% c0 s  O4 p
            str.append(1, ' ');
* o; @% G5 q: u1 s% {/ U1 t% Q    }
4 t. h; R0 B, v* y  z  b4 N    return str; 2 A) `! L; p# x0 d
}
! w7 u3 ^! b( I5 l' a 5 R' n  ]- D3 L' I+ P
size_t hexStringToBytes(const string &str, byte *out) { ( m" D# V- \  i! x% `) A2 Z, M6 H
3 i' H5 a+ ^" t1 x
    vector<string> vec;
$ L: z( g$ r9 x    string::size_type currPos = 0, prevPos = 0; # |7 ~8 S' g( A6 |5 X# ^
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 8 ?/ c$ k7 |2 d( O0 [
        string b(str.substr(prevPos, currPos - prevPos));
) |/ O3 y+ Q2 b4 z% ?        vec.push_back(b); : q, u- O* C/ F$ ?- C
        prevPos = currPos + 1; 1 p  I( d- P5 z( ^
    }
! s- v3 j4 G- d# N! s3 P1 `$ c% {; q    if (prevPos < str.size()) { 7 E* d& p' j1 T1 v4 A; y5 F
        string b(str.substr(prevPos));
3 S  y6 A) J2 X, B        vec.push_back(b); 2 n- T- G* k1 W* ?" z
    }
4 q- n. {1 p( F8 n    typedef vector<string>::size_type sz_type; : z9 w5 o8 t8 a( p& }
    sz_type size = vec.size();
( L6 \* y" k9 ~* p5 n    for (sz_type i = 0; i < size; ++i) { 3 `1 H  ~5 J7 e0 Z) H9 V
        int a = hexCharToInt(vec[i][0]); 9 M; i' [" }0 }6 z. h
        int b = hexCharToInt(vec[i][1]);
4 Q/ t/ x' f# D* U. d: _* Z        out[i] = a * 16 + b;
; S; w' f* A3 ?' g    } . A6 W6 t% t: W9 [) K
    return size; 2 @( w/ e# h( f1 e$ t0 E8 ^4 p
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 0 q  ?  P) G4 q. i% j( M8 q
#define TEA_H : L1 y: s8 ?2 O

+ g) `# ]# i$ S" e9 [/* 8 t5 m# C. C) D: \( `4 [. X2 S1 v
*for htonl,htonl
0 ?- v4 |# ]: r3 R/ @7 J, o/ m*do remember link "ws2_32.lib"
: H# P/ N+ i2 A*/
  m9 A/ o9 a7 }* l1 P#include <winsock2.h> / W& t; \7 P! h# d' y. P' K& }! V
#include "util.h" 0 W0 N5 S% b- J: a8 X* X

" w: q, J( N; C2 zclass TEA {
* N/ g1 H* q$ G0 lpublic: / V: ?& y$ f9 O: O  L4 R
    TEA(const byte *key, int round = 32, bool isNetByte = false);
- y# O/ H  ]1 n- S& ]    TEA(const TEA &rhs); " M% i1 F$ Z0 d
    TEA& operator=(const TEA &rhs); 9 t$ o# c. G! o
    void encrypt(const byte *in, byte *out);
; @, `* w5 a2 R: z; S    void decrypt(const byte *in, byte *out);
4 q+ C( O- O; I8 ?- E  \  Fprivate: 0 _1 V1 E- s3 F# \7 i$ b  E
    void encrypt(const ulong *in, ulong *out);
! {" }3 e+ y6 t# N& S2 {/ W3 X    void decrypt(const ulong *in, ulong *out);
( X- ^2 L+ k+ C* S! N. a9 H: P    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } * J" y5 u) U+ n- d
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } # Y- }' F$ k! e
private:
7 }* {: V7 }/ F  a    int _round; //iteration round to encrypt or decrypt
( r9 z' t5 B. G  Q4 e4 c    bool _isNetByte; //whether input bytes come from network 2 X; E- N, G5 e7 w2 [* q! S& p
    byte _key[16]; //encrypt or decrypt key 4 ]  g; H! s2 G* ~/ D
};
4 r/ Z$ {+ f0 d$ ^/ t7 z1 E
  b9 V+ Q: A4 \3 c* i2 s#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
% `6 _: A& i0 n8 l$ @5 w 2 #include <cstring> //for memcpy,memset 5 s( a6 R' z" f
3  2 b" S$ q( S4 u: `# D+ B
4 using namespace std; 0 R5 A: q) s: u2 f
5  % b" M3 L$ T* R, t7 k2 G
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ( h$ s8 c. g7 W2 `0 B
7 :_round(round)
# X, G* ~: U# w+ b9 L& H 8 ,_isNetByte(isNetByte) {
5 x* ], ~( o- J/ D. G2 g4 C/ c 9     if (key != 0)
9 ?  o5 D7 c! I10         memcpy(_key, key, 16); ; b8 f5 D, u$ X. d
11     else 4 O4 A' }4 S9 J/ B
12         memset(_key, 0, 16);
- i8 \. }7 V. q8 F* |$ k" K13 } $ }1 ?& ?) `3 C# B( o7 g. U
14  5 a) W! H. @% C0 @, q
15 TEA::TEA(const TEA &rhs)
# [6 r% C* _; A) R+ P16 :_round(rhs._round)
1 V/ [3 p* U4 I1 C- x2 _17 ,_isNetByte(rhs._isNetByte) { 8 _2 D: K& i5 x% [
18     memcpy(_key, rhs._key, 16); + \: A* q" i" m" c( }
19 } ; M* U! [* Q, ^: H
20  
% ~( n1 J* V% L2 z8 s8 n( k( I21 TEA& TEA::operator=(const TEA &rhs) {
9 Y$ `* o$ W% F) y. A22     if (&rhs != this) { ; q  ~. a" E' |) r! a# K6 N5 D
23         _round = rhs._round;
3 |# q' S$ S- Z24         _isNetByte = rhs._isNetByte;
) X7 Y" s7 l! M: Q. j5 s+ [25         memcpy(_key, rhs._key, 16); * \5 C# \9 l0 x0 k. z, h) e
26     } ( M3 ]$ d  O9 M9 d
27     return *this;
+ D# P  {2 P9 i! j8 U' g2 `' H28 }
0 i5 H1 U0 E- t" T  A" |29  ; W) {6 O( o3 L5 p# B& G
30 void TEA::encrypt(const byte *in, byte *out) {
1 L; q2 q4 ^, |4 E! }3 l- D31     encrypt((const ulong*)in, (ulong*)out); ; I7 t6 ^; @0 n, Q! D
32 }
7 G: Y, A2 g& ~33  
$ \5 P9 O- R1 u0 X34 void TEA::decrypt(const byte *in, byte *out) {
( [% d4 r" _1 h35     decrypt((const ulong*)in, (ulong*)out);
% v: v/ v$ i5 x) r7 r8 v8 ]36 } , e; e- v& C: D/ W& g" @6 e% @
37  
( q) I1 l) ]$ y' ^# p38 void TEA::encrypt(const ulong *in, ulong *out) { & }9 N( r6 T2 K3 ~# [2 J# K6 }
39  
) B& a) q0 l3 i; A40     ulong *k = (ulong*)_key; 5 m; j7 y7 H& _
41     register ulong y = ntoh(in[0]); ) ]6 M+ \4 ^- o5 N" u& t: R) w/ R
42     register ulong z = ntoh(in[1]);
+ n6 A3 w2 o% C9 o; p2 w; T/ N43     register ulong a = ntoh(k[0]); + @7 R/ w8 Y2 k9 z1 l
44     register ulong b = ntoh(k[1]); 0 I" q+ _; z) ^) \5 C/ h6 L
45     register ulong c = ntoh(k[2]); 9 l- e3 n! _6 b6 Y' [( @$ }
46     register ulong d = ntoh(k[3]);
" e$ f2 Y- E) L47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 7 [: D8 H( P+ ?* b) e) R+ \
48     register int round = _round; . _& J$ u  |; k9 b* B7 c
49     register ulong sum = 0;
+ A) o  A/ Q- r50  
( ^$ M' E& J( X1 j( E6 I51     while (round--) {    /* basic cycle start */
: D9 r5 T  l) ?2 w8 R( A* N52         sum += delta; " ~) E' W3 |$ }5 a
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
4 q7 x4 s0 W1 L8 T. {54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
  U+ w& W8 Z. u! x+ ]. Q7 y% F' p55     }    /* end cycle */
% R* ]$ H* r. s1 C56     out[0] = ntoh(y); 1 p& v, p  `( O; C* C
57     out[1] = ntoh(z);
- K& K" I2 E$ z, }& M58 }
1 w8 x, g( Q3 D59  
4 w5 g& [  T( }7 ~/ z5 N60 void TEA::decrypt(const ulong *in, ulong *out) {
0 j* d0 y' @% [$ E: M$ C. t61  1 x. U: T" w2 r' |
62     ulong *k = (ulong*)_key; - V% D: W2 f; R' v- G5 v8 c& u
63     register ulong y = ntoh(in[0]); " }! K5 R7 w/ m
64     register ulong z = ntoh(in[1]); 7 j0 n* T: Y# x  P6 q: d% P' `
65     register ulong a = ntoh(k[0]);
  X  V: D1 L8 g) Q66     register ulong b = ntoh(k[1]); * N& E$ Y- N# I$ e2 r9 i, G/ l
67     register ulong c = ntoh(k[2]); ! c3 L8 A% r0 ^9 ~
68     register ulong d = ntoh(k[3]);
& n8 _' m/ @' a  H) \7 [( V69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . Y$ E2 [) ?6 e5 B  u- B
70     register int round = _round;
3 a7 W; `$ l5 X4 K+ e71     register ulong sum = 0; 8 k* k4 K: `6 R( Y3 c
72  ( ^1 ^6 o) R* ]3 J% `% W' h1 ^
73     if (round == 32) , ]1 M: ^, W4 Y4 p; P
74         sum = 0xC6EF3720; /* delta << 5*/
4 P5 p" X5 o8 Q$ K75     else if (round == 16) . K/ K0 b/ V/ @* d: N% W. k
76         sum = 0xE3779B90; /* delta << 4*/ # X) ]( ~4 c/ S% ^/ R; d
77     else
! u4 N3 u$ Z1 a- X78         sum = delta << static_cast<int>(logbase(2, round));
# c; s: u+ B* o6 z6 T79  
9 @4 t4 _/ ]1 I( f, u# G$ w& _9 d80     while (round--) {    /* basic cycle start */ / x, _- j' i* u# ^1 y
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); " a: y5 ~; I9 i. L
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); . S. K6 E" p# R! N! h" n
83         sum -= delta;
8 M$ W6 S8 Z7 d7 V: J84     }    /* end cycle */ : Y9 H- }4 ^. ?, Q* L) G& F: a% i6 j
85     out[0] = ntoh(y);
: F8 h3 a! _( F: m6 ]86     out[1] = ntoh(z);
/ x& q/ Q6 {) |8 T/ N+ v/ H& U( Z  J3 f4 z87 }
' O1 O8 y4 }. n; I3 h% G# S7 F
# i! L* M7 x7 t& B需要说明的是TEA的构造函数: 3 Z, }6 g# P! O+ @* ]0 Y& ^  c, Y
TEA(const byte *key, int round = 32, bool isNetByte = false);
( G7 a; @  X8 `* P5 J1.key - 加密或解密用的128-bit(16byte)密钥。 ! v7 [  L5 h5 b: q. r: p) f
2.round - 加密或解密的轮数,常用的有64,32,16。
0 T- F; _+ ~1 |7 _3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ; @/ ?' P' m' H% C. Y; c/ }. @

  r8 t( C/ G* c2 \) \最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
& {% e# [6 c: s9 s  F 2 #include "util.h" + b# y2 ^5 u* V/ y8 ]
3 #include <iostream> 1 H- o* x/ x3 p
4  
. p9 b6 b( V# T2 L/ i- P 5 using namespace std;
  J9 c& v: k6 y$ V$ I; W/ O 6  
7 D, q5 `& G/ \! v5 S2 A% A 7 int main() {
. p, V; J, I! j- t* J+ j 8  
# D5 u: x5 Z* g1 D1 z! ? 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
5 x0 G1 E6 b/ x/ C" Q10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); - u/ d3 i  R1 v8 R* ]7 X" A
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 9 `, l' Z9 n4 W! P- B3 _$ O+ ~
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; , N; o1 W& v5 Z
13  
, H/ J; U' A+ r5 \% e14     size_t size_in = hexStringToBytes(plainStr, plain);
2 [/ N. V+ g$ p15     size_t size_key = hexStringToBytes(keyStr, key);
  X- U) Q" U8 @: Y/ m* I16  # Q  _7 V9 {" L
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
' ?6 D+ L# T+ R18         return -1;
$ ~/ p  l1 d3 Q9 d- k8 f19  
2 I$ w9 f% i8 I- o: T20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
9 C3 v' d0 g/ \# h) @( V21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
4 X" B# D. U; B8 `+ `22  
" C8 t. c1 Q7 ]% O23     TEA tea(key, 16, true);
! l& f) @4 d+ E24     tea.encrypt(plain, crypt);
  U7 L' B* M1 ]$ Q" ^. U5 T% O25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
( ^* F: ?& ]* |! r# q26  
5 h& ~: }, ]  g27     tea.decrypt(crypt, plain);
4 `" @7 i5 {$ t! R5 O9 O; N28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
* N; U: U# a% K, P& Z: Q0 m6 v9 M' o3 _29     return 0;
4 U2 u4 m2 D4 e# f30 }
$ @5 o( R- S( P* f' z
1 f& e3 w! d6 B) R# N, D/ X" r1 d7 ~本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx! w, c% `, K( N8 G) |6 \* X
运行结果:   F& f0 H2 y, `: s- o7 k
Plain: AD DE E2 DB B3 E2 DB B3 * A8 [  \& `! j5 l# O; M4 z1 N% s, P
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 5 ^& q5 [3 ?" M
Crypt: 3B 3B 4D 8C 24 3A FD F2 ! k4 z) w9 s' \! v1 @# J3 T
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-30 18:21 , Processed in 0.022107 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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