找回密码
 注册
搜索
查看: 38542|回复: 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轮):
$ n3 I# S7 }$ \; \$ a/ i7 ~3 p  W微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
; q( M; h8 T# U/ E$ w) KTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 3 a' M  w0 O3 g6 x+ A+ ^: Q' g* |
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 - P0 f8 Q* w+ n4 s& ]
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
+ ?4 l- v" x# r在 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. : ^$ O  Z. C) ?; S9 y1 R, M
  2. void encrypt(unsigned long *v, unsigned long *k) {
    . I, |: k& i2 }$ M' t
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    + R! B' R2 ]* f6 S! r
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ * @; g2 D& f& E. x' P
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    2 u, B; {# \) \# G
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ % I1 u3 R, x8 |3 K3 I/ ]; d
  7.          sum += delta; 1 Y$ p, P5 [0 G+ z, P5 w! f$ E' _9 _
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    8 Y; r& k. ?* j% n! `7 z+ f6 T
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    : z4 f$ K( K% G+ M: F& g' q
  10.      }
    0 M/ ]0 T7 x% B% X
  11.      v[0]=y;
    5 Q7 p" C4 F2 w( ]
  12.      v[1]=z;
    , R. w' ~4 t8 s
  13. }
    6 J8 K# P& `5 |! ], X
  14.   + h# ^; [+ }9 Z, o# J6 v  U; t
  15. void decrypt(unsigned long *v, unsigned long *k) {   E5 B( D( k0 ~/ e0 E# p3 K4 E  |( S' p
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 1 f( E0 p+ b: g% x  V0 D# h; E9 _
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ . r4 v9 J" w! E9 u" \% @2 Y
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
      F( }6 K2 c- O  T6 M& n- S$ c1 R
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    * z8 {- W; |  }2 R/ U8 j4 e, @
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
      t6 T% v* E2 }( H
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    9 \. C5 ~+ r/ e
  22.          sum -= delta;                                /* end cycle */ & [, B+ J" ], b7 s1 L3 d2 J' ]
  23.      } # g+ r- ^! H9 c9 q) O
  24.      v[0]=y;
      W* v2 {( ?, M' V: Y7 g
  25.      v[1]=z;
    0 E% L- I) o# \, \- c) L
  26. }" `1 r; y. z* ]' K
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
5 @; \( z" p4 E1 A4 G; M#define UTIL_H / K) B/ q$ [% p; Z$ a

2 H6 |7 t  l- `3 r! l#include <string>
, G( P$ b6 z* Z. z, O5 y#include <cmath>
/ B* N+ B& L5 n+ c#include <cstdlib> $ W9 P  [4 Y* p* O& A
- Z7 R7 s$ Y% j4 @
typedef unsigned char byte;
8 |" f4 j( H/ Qtypedef unsigned long ulong; 3 {9 A% K# h* ?9 o

7 T) o. Y! ?. }! Y: Q$ F( ?8 einline double logbase(double base, double x) { / q* Y( T+ C0 J+ Y2 Q. v5 D5 O
    return log(x)/log(base);
6 Q: s7 A" N' i8 q! a} 2 v! f; ]* ]: z0 y% A

$ P% G$ A) I+ b; v, q/ s/* 9 b* \$ g" ]( i+ e
*convert int to hex char. ! X  T# |+ v: O) K3 v
*example:10 -> 'A',15 -> 'F'
. _5 Q$ P# r4 Y" V3 Y*/ $ R: Y* d: o6 E
char intToHexChar(int x); 3 M$ t1 G% w( ~( k* I0 s
2 Z$ _& Z1 E) U/ v4 j9 b* s7 }
/* . B0 u! ?3 J6 ~- Z" u; y+ Q9 r2 n
*convert hex char to int. 3 o; J+ m) F2 W. R3 q
*example:'A' -> 10,'F' -> 15 ' z9 M! p  I! _0 R/ r, y
*/
8 t1 E: [! I* x1 U8 R- kint hexCharToInt(char hex); 1 q8 b: U9 L8 w* s) x- Y9 i$ n: B( H6 O
1 g1 T4 c* o. P% _# Q
using std::string;
6 \3 J# E9 [4 t7 V) u' ?/*
. f: E- X2 [! Z" O4 j) U*convert a byte array to hex string.
/ W/ R- C% G" M5 g. T% P8 R) i*hex string format example:"AF B0 80 7D"
( n4 e! C# A6 `: F7 j" P! l, j*/
: @9 Z# i' K. S1 }1 W+ [: @5 P) xstring bytesToHexString(const byte *in, size_t size); 7 ^" l7 [/ I. M' \

: C8 n$ ^- e; O) ^7 ?, R: y/* - d9 C' S4 f; {/ r# H
*convert a hex string to a byte array.
# b: e) E6 k. k6 R*hex string format example:"AF B0 80 7D"
4 |3 f2 b0 E" Y) W*/ * g& M& K3 s; {
size_t hexStringToBytes(const string &str, byte *out); ; o) ]: e' L- \0 Z' ^

* _) L; H( ]- P  X& l. i#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" # ]% V/ ]9 {4 w3 h; _
#include <vector>
7 u5 @' @+ c7 Y0 O$ C' c
! r5 L) u) M* D; g2 Ausing namespace std;   Q1 C  ?5 x0 e' {5 D

6 R. A1 M/ ?5 A1 Y/ n6 A2 D* Wchar intToHexChar(int x) {
, P. ~4 Z$ ^: w( Q8 r+ J  f- L    static const char HEX[16] = { 7 h; l3 C, A2 t4 q4 _" s
        '0', '1', '2', '3', # u* Y6 d- Y$ i+ }& k4 ~. p
        '4', '5', '6', '7',
9 m9 `2 m/ e0 t8 T* ^' j0 N        '8', '9', 'A', 'B',
' F) ^: M( x  O+ j4 K; i        'C', 'D', 'E', 'F' " M6 I0 D9 Q$ I& ~
    }; " ^: e8 u1 `7 w5 `3 f' |
    return HEX[x];
) t. l0 P" o5 j} ' L: L& U! G- O/ ?
! `& S; g' z6 G2 j7 _. U
int hexCharToInt(char hex) {
. |: l/ r/ t  P% x6 r4 d7 L    hex = toupper(hex);
0 M+ j+ H$ [# R    if (isdigit(hex)) , B6 C& M! G3 _8 k, L
        return (hex - '0'); ( d  i8 M7 ?' v, k/ ^
    if (isalpha(hex))
7 C/ Y4 t4 x1 X  k: Q4 w7 Q0 ~        return (hex - 'A' + 10); + ]! M8 n  x2 I4 _
    return 0; 5 H: L7 Y+ e8 `: U3 t
}
8 Z' W+ }, l9 p7 Z! l' @# j : [3 C& z+ D1 i( x- S
string bytesToHexString(const byte *in, size_t size) {
0 w3 v* b4 t! p9 O    string str;
1 i( J' |. c! {1 \8 N4 |8 T    for (size_t i = 0; i < size; ++i) { # _. V) \# i4 q3 @" v: P6 C' o" I3 G( N' m
        int t = in[i]; # U# ?! _- R* I# H/ {5 C' i
        int a = t / 16; & p# v. w, j' z! {, p: S
        int b = t % 16; 5 P9 `5 r% A( m+ Q8 t! x  `
        str.append(1, intToHexChar(a));
, `' d$ C! i  {        str.append(1, intToHexChar(b)); $ ]" v) U; y1 a. d2 Q
        if (i != size - 1) 3 Z$ X8 u8 H  x
            str.append(1, ' ');
' u/ P* c  i7 b+ F7 f6 @    }
+ s2 p7 W& ^3 A, u& ~    return str; ' ~; y0 k. y  _
}
. g7 k. h) T0 e* }1 g9 f
( U2 j6 P3 w1 b! l+ osize_t hexStringToBytes(const string &str, byte *out) {
1 `6 d3 _; S* c5 z) d9 t . ~& Z/ j7 u9 f( Q% Q( u# ?8 g4 w3 m
    vector<string> vec;
* q$ q! Q  l; b8 L" L    string::size_type currPos = 0, prevPos = 0;
. \( r! b( ^! o0 |1 r    while ((currPos = str.find(' ', prevPos)) != string::npos) {
, @4 m5 v  k7 T, f* H3 N4 O% O& @& L7 ~        string b(str.substr(prevPos, currPos - prevPos)); - r' I" r8 u# H& f9 y
        vec.push_back(b);
* }" o) O$ k5 j1 h+ c' W        prevPos = currPos + 1;
" \: u) T$ G& _3 t. Q7 x2 ^, k1 d    }
7 p' @" A* @0 m0 b8 ~0 s) U) I    if (prevPos < str.size()) { $ c" y9 N/ ]2 w9 `6 Q( {3 y/ I
        string b(str.substr(prevPos));
& g3 E9 g, C9 {6 z% _" b5 X        vec.push_back(b); : M6 \/ _: I  v, t2 p( r3 a: C& t( d
    }
  D7 C) u( e( Y. Q    typedef vector<string>::size_type sz_type;
5 Y* a! j  G) `: }% L" w    sz_type size = vec.size(); ! U" f: B( ?! _
    for (sz_type i = 0; i < size; ++i) {
, k% C# i9 d( G/ ]        int a = hexCharToInt(vec[i][0]); ) I0 \7 Y* N( C. z/ V
        int b = hexCharToInt(vec[i][1]); 9 N/ N% S6 J+ V
        out[i] = a * 16 + b;
6 o& Z* [7 y' g/ _0 w& z    }
" c2 O) R' Y" Y* }2 q' k$ d    return size; - r  e4 q$ ]: v, c! v. a
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H - i& v! w; G& F6 Q: V& X& [
#define TEA_H
$ f1 T5 `* f. ^& F. L7 y: v; e% @ , c6 o% h$ p5 s6 e
/* + K3 ]# n7 M% U1 S2 ?" r' P
*for htonl,htonl
( G$ W% l( E# G, }' D8 T" q1 e*do remember link "ws2_32.lib" 6 P; g) D2 S# L. t
*/
, e) j, k4 ]+ n& C# t" K7 s#include <winsock2.h> + d2 X) o; s; t9 d, a( }
#include "util.h" / N4 s  a, ]& y- |# u3 P- C5 ^+ @

6 q5 f* ]' z7 N  q7 J9 dclass TEA { 3 {: O" V  N8 I3 n3 g
public: 2 ]0 e  A  \1 X4 b. D
    TEA(const byte *key, int round = 32, bool isNetByte = false);
. i+ T6 A5 B0 L* m" Z    TEA(const TEA &rhs);
% r- R) K% y" t2 Q% j  w& U    TEA& operator=(const TEA &rhs); 9 z/ |2 V+ a6 j" I  s* K
    void encrypt(const byte *in, byte *out); 5 O7 _9 ?" f! t7 U( k- C
    void decrypt(const byte *in, byte *out);
6 p$ h+ u4 p9 `+ i7 Xprivate:
3 X; L2 W/ [2 A# f8 S% y    void encrypt(const ulong *in, ulong *out);
. D9 Q: @7 y( m$ C( O    void decrypt(const ulong *in, ulong *out); 2 B/ K# E+ l# f; K
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } " d7 u5 ?% `: u' q( M. q
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 8 A; t. w0 H9 t! o% K: W% n7 A- I" B# q: l
private:
8 B' l  k2 a! a. y8 \    int _round; //iteration round to encrypt or decrypt
! o- I: Q( ?6 {5 _' k4 x8 J+ X2 m    bool _isNetByte; //whether input bytes come from network & u" g0 V% ]. A. A) I4 A/ U$ a
    byte _key[16]; //encrypt or decrypt key
/ z9 W# E! n6 f* ^0 r( u' G1 R7 Q};
- |) ]/ j4 T: z  A4 Z 6 A8 G, M3 @5 Z( ^. o8 x
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" # w1 C8 X/ l+ |
2 #include <cstring> //for memcpy,memset 7 Y( o9 Z# [8 y# O
3  , i" q9 U- j9 Z1 S
4 using namespace std; , a8 n4 ~! h4 I0 m: U
5  
+ P/ @+ m, o! O# B+ s( f 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
+ k6 d* P9 u1 s1 q 7 :_round(round) 3 X1 ]' M- l/ H9 [
8 ,_isNetByte(isNetByte) {
4 G7 }& a* K( Y# l0 o- q8 L 9     if (key != 0) 9 m/ w8 R( ^" U$ R& c7 M6 }
10         memcpy(_key, key, 16);
; j# o6 F: ]: b8 L7 O8 N- B11     else % ?( X1 W' ~. e' U
12         memset(_key, 0, 16); 9 _2 E3 b) }0 {, h) o5 S7 `
13 }
/ w% n3 I7 Z6 _14  
9 h9 Z  t0 E( c3 v; _15 TEA::TEA(const TEA &rhs)
6 b% |# ~$ X. f  W& b$ J16 :_round(rhs._round) ) p2 C% [0 y$ ^2 ~$ ]
17 ,_isNetByte(rhs._isNetByte) {
4 X% {% T& M$ E5 J% F18     memcpy(_key, rhs._key, 16); ! y% O! z2 s+ ?0 v1 D
19 }
# V' U' d& G3 `20  $ G% e& V) T' S1 Y, p
21 TEA& TEA::operator=(const TEA &rhs) { / @, a$ I, v5 [
22     if (&rhs != this) { # X3 r3 k8 R; o! m: k5 R+ ?
23         _round = rhs._round; . ]  d/ g& t3 C5 b; B
24         _isNetByte = rhs._isNetByte;
7 F5 ?' J4 u6 [9 ?. F* q7 P8 p25         memcpy(_key, rhs._key, 16); 1 T- O1 K0 T3 {% p! Q) J
26     }
3 O  z$ c7 ]9 }- d% R. z27     return *this; 4 c& _+ Q& y1 s" }) G2 e
28 }
% Z0 R- E5 N& B5 x  z6 S# o29  
, B' V  N! K- P5 U. u: K4 Z30 void TEA::encrypt(const byte *in, byte *out) {
% L, {( u3 [5 U  [( i. o0 @31     encrypt((const ulong*)in, (ulong*)out);
8 w  b0 \0 J6 F; ]8 c32 } : N* V. i' y/ j
33  
! x' U+ y1 m2 |0 e0 [+ w, ~34 void TEA::decrypt(const byte *in, byte *out) { $ F$ R7 g/ j, c7 K8 b% N/ }
35     decrypt((const ulong*)in, (ulong*)out); 3 l( ?' t% ]* W- C" Y' o) V) y
36 } * a& n& [& t9 S2 n3 @+ F) T$ r
37  1 Y! u& E; p2 Y# O4 X  T
38 void TEA::encrypt(const ulong *in, ulong *out) { 1 \' t4 d* Y7 c3 s& r
39  6 M- k) @6 y  S. K+ B/ @
40     ulong *k = (ulong*)_key; ; ?: ~1 a' j+ s6 i' H5 d
41     register ulong y = ntoh(in[0]); 6 E- ~$ `8 u7 O: G
42     register ulong z = ntoh(in[1]); ! t6 @: m, u& l/ h' O1 ]/ `
43     register ulong a = ntoh(k[0]);
9 M' B% S0 S. P% V  J5 Y4 r3 k) p7 E44     register ulong b = ntoh(k[1]); - J) ]2 p( [; Z; Q5 X7 K4 H% d4 M
45     register ulong c = ntoh(k[2]);
. Q1 b+ A1 x, b" y! E+ h8 N& `46     register ulong d = ntoh(k[3]);
* D* Q$ v# L% G& f. S47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 4 m1 q& U+ c7 A( i. d
48     register int round = _round;
! k1 X: ^8 j5 g; n1 h# O7 v* `49     register ulong sum = 0;
& _$ [" B$ E, ]9 V50  
6 y3 ~7 E( ]( o( t; [51     while (round--) {    /* basic cycle start */
; T  S! W+ d* h6 k- h% X) P52         sum += delta;
7 U4 y0 V3 {4 q0 N53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); , E5 q/ W3 n& ^% C8 t) L# N
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
: ?$ c6 j% L4 }3 L55     }    /* end cycle */ , H( s8 O. u: v) S
56     out[0] = ntoh(y);
9 Z6 T4 }) [5 L7 G57     out[1] = ntoh(z);
) W/ ~% `! Z( P/ T; X58 }
. a4 g- x& L6 t' A3 i59  5 \* \; k+ h+ U5 l3 N- G
60 void TEA::decrypt(const ulong *in, ulong *out) { & e3 ?, ]' E! a; ^5 }5 O
61  ) m" P' w; t( L7 o8 U
62     ulong *k = (ulong*)_key; 4 A) c( f3 A1 `2 p1 x
63     register ulong y = ntoh(in[0]);
- z3 R1 G2 {9 M64     register ulong z = ntoh(in[1]); 8 t2 R$ M( d8 e! a
65     register ulong a = ntoh(k[0]); 7 x" \2 K+ e3 E$ g& ]! ^
66     register ulong b = ntoh(k[1]);
. B' z7 _. F$ e67     register ulong c = ntoh(k[2]); + Z: z$ K+ x7 A$ s  L! Q$ h% H
68     register ulong d = ntoh(k[3]);
# ~/ Z# J# D8 a$ }8 _69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
6 R1 U3 \5 {8 n1 Q2 A7 @. Z7 i70     register int round = _round;
) E. M) o4 R. O% }, O' k& [) j71     register ulong sum = 0; ; `. P7 p4 N/ F
72  % g- B/ ~# p+ S0 L0 J( a2 ?& P
73     if (round == 32)
3 l# s! x4 [# I6 F74         sum = 0xC6EF3720; /* delta << 5*/ ; C% m- [" V! X& z+ ?5 O5 j0 G  w' a
75     else if (round == 16) : Q3 I: I9 k& x
76         sum = 0xE3779B90; /* delta << 4*/ ! U$ `, s- T5 z5 t
77     else
2 u4 n$ w  F' f; I+ F78         sum = delta << static_cast<int>(logbase(2, round));
. V2 D9 \" g7 j+ F# Y79  2 v; Z7 O- \# X' ^3 F/ O! b' E, }
80     while (round--) {    /* basic cycle start */
0 k5 O1 v. o$ g9 w7 K3 k81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 5 z+ t( Y4 e/ ^6 j' W
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 5 S4 a; a  s6 _* _0 }+ z' V
83         sum -= delta;
( o9 l- A  h3 M" ~; ~# j* }84     }    /* end cycle */
4 y* j* Q$ Q$ ?! M# c8 m5 g& j85     out[0] = ntoh(y); , |3 c0 u! i7 \2 C$ L2 y5 N
86     out[1] = ntoh(z); " U1 S" B+ W; G/ M) }. @$ h3 j8 c
87 }
8 [* d* Q$ Y* r: b+ `
2 z8 E1 ^: P& c7 a9 R需要说明的是TEA的构造函数: # Z6 m5 Y* |+ j& k$ o. b
TEA(const byte *key, int round = 32, bool isNetByte = false);
0 ?5 \, o+ o/ l- `/ R1.key - 加密或解密用的128-bit(16byte)密钥。
, S4 `, N' t4 [( j5 O0 p* |2.round - 加密或解密的轮数,常用的有64,32,16。
) S3 {  l/ T+ H! |3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
; \5 `1 _3 v4 o: Y* L
* e6 L) J! x  `2 g3 P$ I最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" * G/ D* h) U) k# y5 n* t
2 #include "util.h"
. o. v# S. w. u0 P: [3 L) e 3 #include <iostream>
# u/ U$ M1 O/ b5 O4 L 4  
  F# u3 z9 }' d9 }4 C/ T 5 using namespace std;
% y, e/ q# G: i9 w, T 6  ( \* I$ `3 b6 H& x% b
7 int main() { 4 u  L' Q4 ^/ k
8  . U, T4 ?- s% {
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
# S# q. e0 Y! N10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 6 b; q4 D( X- `, x5 v- u
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; % b. o/ T: i* ^: K$ x: C, D
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
0 e) {( O- i/ S13  : x$ E  Y# _: c5 l9 w
14     size_t size_in = hexStringToBytes(plainStr, plain); ) P& f3 u& Y" s& M. p
15     size_t size_key = hexStringToBytes(keyStr, key);
2 P0 `6 c* ?; \0 U& ^7 @2 O- Q  {. L16  
" ?) H. X$ Y, ~' U/ V, j17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
  Y& T) V. }' w; a9 V18         return -1; . N: H# C1 b5 c; |
19  
8 b8 Q! b6 H, W6 c1 r20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;   t5 l  `4 R" {- A% `' Y
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; . P: m2 t+ S/ c8 Y6 |2 y8 t
22  
& _/ b& T2 g6 L  e; x8 |7 V3 t23     TEA tea(key, 16, true);
4 l# s7 D( [$ E2 D24     tea.encrypt(plain, crypt); # o6 m- S1 N) C, x. e! P4 Z
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 2 x$ z2 ?; M4 K' k
26  
; g2 f# q7 r+ E9 v0 y+ r27     tea.decrypt(crypt, plain);
, z4 N& N- B7 m' K, q, a* ?+ L* V. W28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
& f4 b0 D  b9 g29     return 0;
9 u9 s* S) S$ `9 `5 Y30 }
0 _' [7 K% d3 C! p3 J5 l1 E8 J5 J0 C2 m9 Y# d, F
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
8 t* R6 h. b" o运行结果: $ {; U; K, _6 n. Y1 n! m
Plain: AD DE E2 DB B3 E2 DB B3
! h+ O- x% m% t6 YKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 / W3 j, `. |2 L& r
Crypt: 3B 3B 4D 8C 24 3A FD F2 # r" V1 V% s9 D" b4 o& ~
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 06:45 , Processed in 0.020780 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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