找回密码
 注册
搜索
查看: 38334|回复: 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轮):; W% C% N1 ~  J0 G: E. U- l
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 9 H$ z" A. L# {7 a; g
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
$ [: X2 s, ]( {  U* Y, A/ ]之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
' {& y8 z; p4 o. H) E4 H% Z在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
3 e' w6 N$ U. ^& b在 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. 6 N3 Y6 p/ H# `! U; N
  2. void encrypt(unsigned long *v, unsigned long *k) { 8 J& f4 ]6 K9 @
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ( I2 ^# c1 t  y& Y8 U$ C+ W
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ / h8 ?# y+ [8 [' y! ^; f* W
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 7 [) K- O: u2 t2 Q
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ! i- C' O! X  \' Y# @3 A
  7.          sum += delta;
    7 V5 c' D3 ~" t! ^: f$ ^
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & `$ E4 A& j% r+ n
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ! t/ ]5 H9 j- z6 ]( w8 c) r
  10.      }   M, c0 A( E/ h8 t) v! S  g
  11.      v[0]=y; * q  ]9 T6 m9 ~$ c- w! U' O
  12.      v[1]=z;
    . Z. j3 c- \& G( z( @
  13. }
    8 z  W" _$ J* L+ a& s: L8 x
  14.   
    ' Q3 H7 Z. Y& w' e1 O
  15. void decrypt(unsigned long *v, unsigned long *k) { 7 N# F0 q8 z1 k# \- l. Y
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    8 q" Y  a! p5 ^6 F- E. V0 u
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 6 s/ g% \: @: B: _* [
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 1 O  [; v# ?6 w+ h7 U  Z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 8 D- a7 ~3 y6 H1 M$ w( H
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); $ d( Z) Q8 P- R" K! v+ q$ N  [4 e
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    # X4 o0 P. z, c$ e8 E* v. T& ]
  22.          sum -= delta;                                /* end cycle */ ( m/ O# c; M6 h) c* F4 Q0 b
  23.      } ! f6 S5 r% X5 U
  24.      v[0]=y; / c: k) @( a) a* e7 ^
  25.      v[1]=z; 4 }+ P2 f, N, P+ D) q6 x
  26. }3 R% @# P& Z& v3 c; a, z8 {) z
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 0 H" m+ T( D( I1 F0 y! ]0 f
#define UTIL_H
3 S; R7 h! {8 h9 P3 ]; B9 o8 G
0 w- D0 i; v. u$ @3 X3 {( J#include <string> + L+ l* Z* k$ s* \/ J9 L8 A/ x
#include <cmath> " X! E% b$ _% G
#include <cstdlib>
! w3 M& h# D. \, t2 F1 r + x! V" b" D4 h5 y* K
typedef unsigned char byte;
3 P* v4 ^2 l( ~( l# X0 ktypedef unsigned long ulong;
5 k, @2 G4 H7 m4 t   s8 C# C  _, B9 R8 o
inline double logbase(double base, double x) { 4 V/ v& I' p: h/ e% z! F' j
    return log(x)/log(base); . O; p* f6 l$ g
} 4 W1 o; M* r, w. d' ?

1 C' r+ S# c9 m/* 2 Q7 A& U( C: X( I3 z2 e- n1 l
*convert int to hex char.
2 u$ V/ [0 n9 y" }*example:10 -> 'A',15 -> 'F'
" j! T" c8 ^5 s/ Z& Y8 X2 T*/
# C: E; H- m. k; S$ S# ?char intToHexChar(int x); 0 k* W; ]' s9 r5 s8 E: A
2 b' ]2 j% O7 f6 @* \, b9 v5 k
/*
- M- {+ ]" C" V*convert hex char to int.
* W$ E" p! i& v( V*example:'A' -> 10,'F' -> 15
; d- ^0 F* R! h9 q5 U; E/ N*/
/ H/ e+ k/ i! T* _: |* Aint hexCharToInt(char hex);
; ?5 b! y( f- V3 f3 _% u5 e6 ^
9 C' i$ ~% M7 H7 X' M$ L! Busing std::string; ) J7 @2 Q- r4 n  t* ^& `
/*
% C$ C* X- V' Z, ~*convert a byte array to hex string. " f; V( V( {3 G8 K1 [
*hex string format example:"AF B0 80 7D" 0 r) `* o' f/ f8 s( q" v! u0 {! ~
*/
5 ?; _- S0 v9 w2 e; A& j9 Z) Vstring bytesToHexString(const byte *in, size_t size);
% F' f; f5 h2 E' v6 p. b% `
; L! Z- `1 e, E  [/*
$ B* e" |" f3 J: j1 D; c*convert a hex string to a byte array. ) z, t; v& D& w1 b1 V$ M) T' g) z
*hex string format example:"AF B0 80 7D" 0 ]' V, D( U* \3 n0 H( _5 Z4 y
*/ , u; _5 m& _* |) S. N4 Y
size_t hexStringToBytes(const string &str, byte *out); " b6 l4 x* D1 U% m( i
: T. N9 a# ~1 s& |; P
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 4 U( w7 ?; b$ `9 q. e
#include <vector>
. a& K8 e9 p8 S. |
5 p: j. ]8 @& l. [& A& q4 o+ Jusing namespace std;
3 ?; g. E7 k, n 1 P8 z+ C* H- o# A( U# k
char intToHexChar(int x) {
- i; x" M4 N8 |) F9 o" g    static const char HEX[16] = {
. @% ?  H5 J: V        '0', '1', '2', '3', 2 @6 O; _* v7 P, `
        '4', '5', '6', '7',
) M# g  b- K* T; P. z5 l3 H1 S0 k& q        '8', '9', 'A', 'B',
8 Z( R' L/ o6 N# H4 B* C        'C', 'D', 'E', 'F'
/ n7 m  U8 L4 b5 M. b    };
9 O2 e, }" R, m( V# Y" \    return HEX[x]; 7 r; y* Q! L) m: u& S
} . @1 N7 F1 M. [$ ^0 R! u
4 f" P7 f! ~' A& G) B2 }% u
int hexCharToInt(char hex) { & a3 M, h) x. \& n( X2 Q; e
    hex = toupper(hex); 9 S7 h9 U' E9 P( _( D/ s
    if (isdigit(hex)) * O$ p% Z; Z( a$ @7 r
        return (hex - '0');
2 f* u& ^2 d) v2 j; e+ @- U    if (isalpha(hex))
' {8 a' E1 m- Q* i9 w        return (hex - 'A' + 10);
7 W3 ^- o9 |. D$ U  q7 r& V3 _  Z8 |, C    return 0; : O  {& @5 o# x/ S
} / `1 M& T6 L- o$ v. j

+ }, w0 u1 Y" W: Ystring bytesToHexString(const byte *in, size_t size) { 9 F0 o; L6 B. m: P/ k$ e. A
    string str;
: t& \: E9 p8 g" ?- v3 T    for (size_t i = 0; i < size; ++i) { / N5 V5 ]  k5 z# a8 e
        int t = in[i]; 6 @* ]  a/ k6 Y" m9 w  G  @
        int a = t / 16; & B7 K" ?% R3 ^. `& y
        int b = t % 16;
; [# u; G5 G5 F  `6 f        str.append(1, intToHexChar(a)); * B5 H2 H; r3 C5 u  _
        str.append(1, intToHexChar(b));
3 u+ L. E6 N, m2 k: Y" Q& c* u        if (i != size - 1)
, R) G* r! X+ F2 d& g            str.append(1, ' ');
" C3 J2 ?9 ^2 W' i" T    }
9 I3 f) D$ U8 ~, K  q3 r7 A    return str; ) K8 {2 I( G$ w- {; s2 e% M6 ~
} " G$ @/ I: a6 u' s9 C
# ?" _4 f5 B3 Y/ F
size_t hexStringToBytes(const string &str, byte *out) {
" N  D* s/ n% ~' m" B( d
; t- h$ H+ ]# Q( v* K1 y    vector<string> vec;
' b5 e( S$ d* y( y, {1 i) ?# x    string::size_type currPos = 0, prevPos = 0;
/ V. M4 x' u: w6 D    while ((currPos = str.find(' ', prevPos)) != string::npos) { " H; E  C. r& E# R( V! j0 O2 T" x
        string b(str.substr(prevPos, currPos - prevPos));
9 j1 K8 ~* k1 n1 V; _! `# F! [) {        vec.push_back(b); . }8 Z* m1 D* H: n% o7 U9 K
        prevPos = currPos + 1; ; _! H& e3 F: W7 p
    } 6 O* d6 V( k3 f3 }, Q  A
    if (prevPos < str.size()) {
3 m4 O& L6 X* f# j- g. I! g1 P        string b(str.substr(prevPos)); 8 r) v7 X2 Q9 v8 o* J3 I4 C
        vec.push_back(b); 3 K, i0 Z3 J8 q+ j& E
    } ! R- s/ }* U8 X+ D+ P
    typedef vector<string>::size_type sz_type;
1 ~& |1 s! j! h' |6 W6 m    sz_type size = vec.size();
9 A* F* Z: o' c    for (sz_type i = 0; i < size; ++i) {
" P& w! T, E; R        int a = hexCharToInt(vec[i][0]);
" A" G, M& }+ f        int b = hexCharToInt(vec[i][1]);
- P) o# O  y! `        out[i] = a * 16 + b; + L4 O& a% V! ?5 ^0 R4 q, r
    }
, v1 R6 b; d2 j    return size; 7 F, v9 Y9 \& \5 \& w+ B# @7 N
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 7 L9 a; C3 u9 Z
#define TEA_H $ ?/ l+ d5 Q5 O0 g  o( }

/ i; |8 E3 i) b0 v/*
$ ^) ^0 u2 c  |& e+ d+ n; D*for htonl,htonl % g! z4 D& H0 M8 W5 N+ X) g& i
*do remember link "ws2_32.lib" ; w1 o! Z$ k# c% t
*/
9 s$ x. g0 r5 Q! W) Z5 K3 x#include <winsock2.h> ) {" \" x9 _9 T& ]( p' U9 G4 R
#include "util.h"
/ m9 ~1 j1 e; N1 Q% z
+ e. O" X, Z. U5 Wclass TEA {
( D7 k* V9 I7 |2 G2 a$ s$ k1 xpublic: 0 k. c( }' r6 ~7 K+ t
    TEA(const byte *key, int round = 32, bool isNetByte = false); ) U: }/ `9 V! Q+ n
    TEA(const TEA &rhs); / ^4 S% G$ w! D$ {$ P9 l
    TEA& operator=(const TEA &rhs);
$ C  F; r, d- G* N- ^2 }    void encrypt(const byte *in, byte *out);
; R8 u: L4 w4 _7 M    void decrypt(const byte *in, byte *out); 9 I% C( c0 Y6 B+ |8 ]7 c
private: ! b; u* o9 v7 G$ t+ E$ t
    void encrypt(const ulong *in, ulong *out); ( B4 e% O' b7 r0 O& u3 d
    void decrypt(const ulong *in, ulong *out); 5 X1 M+ y$ ^& M* E  A" \
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 7 k6 D1 s$ o& a, w! F  v! Q( k
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
7 P9 [# g4 t; Rprivate: 9 a! t( f7 ~6 `) e! ~4 O. H3 `
    int _round; //iteration round to encrypt or decrypt ) j; i& L2 u5 c+ ?6 X; m
    bool _isNetByte; //whether input bytes come from network 4 P4 b) q. o4 [4 t
    byte _key[16]; //encrypt or decrypt key
1 U6 r  h; S3 V& G# u}; 0 i. v0 S7 n( w7 B" M+ `4 H9 X
1 ?! s+ `8 h6 ~
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" # O- S- A4 o8 p  }, `1 G! f" w4 O
2 #include <cstring> //for memcpy,memset 5 R/ |9 U+ Z! ~3 b1 d
3  
/ T+ N0 I- W; J1 @3 H% U 4 using namespace std;
+ g, H' t- B3 ^* `/ o 5  . ~" @8 s$ ~# o6 F7 X! F+ ^
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 8 x: E6 \1 S5 G; j
7 :_round(round) ; g* m$ ?7 v* Q. G" u9 U$ H
8 ,_isNetByte(isNetByte) { 5 r/ d; v2 f# d0 n
9     if (key != 0) 1 O% ?* _2 v% `8 I2 n
10         memcpy(_key, key, 16);
3 }  y7 G/ r2 w( d0 c% a. r8 H11     else ; I! F7 Q; C- G5 ?5 Z7 Y* X
12         memset(_key, 0, 16); 3 Z3 ~4 O9 D- ~# J. D
13 } 8 V; b! y! Z+ a) O/ t( x
14  8 e- O0 m2 Q$ q2 q) J
15 TEA::TEA(const TEA &rhs) : U7 E9 Z) E5 v, a# n" q
16 :_round(rhs._round)
8 u: a) b% b* X2 f% o3 q0 l$ }2 v8 h17 ,_isNetByte(rhs._isNetByte) {
$ @" [, `7 J8 h. P9 y$ U18     memcpy(_key, rhs._key, 16); 8 A! B( |! _7 Z/ e' M6 V% t& y! s
19 }
4 E2 I+ ^6 I. z3 \6 ?) r20  % ?% L8 N4 w8 H8 [' U: v* _! u# V
21 TEA& TEA::operator=(const TEA &rhs) {
/ M- H% p2 ~+ a6 U+ |2 w: A22     if (&rhs != this) { ; V, \% j( J7 k
23         _round = rhs._round;
3 w- R' F4 q  O( D, G24         _isNetByte = rhs._isNetByte;
% R1 o0 ]& |# }& N25         memcpy(_key, rhs._key, 16);
* G4 s( J" h3 U/ m26     } & X+ t. u* w, ]
27     return *this;
5 {$ a3 _  R+ h) m. b/ D28 } * C7 S; U4 h2 |" Z8 L( I
29  - \$ s, i7 C& t9 w
30 void TEA::encrypt(const byte *in, byte *out) {
1 l+ N4 ^& g# u31     encrypt((const ulong*)in, (ulong*)out);
# G1 s( z: P4 F' O6 N- I* t32 }
: _* A9 ]- V9 e; C6 R% K33  
2 Y/ b4 f$ z8 @. a34 void TEA::decrypt(const byte *in, byte *out) {
- O+ z: r' @5 @1 J8 e: }35     decrypt((const ulong*)in, (ulong*)out); + D: `  f9 G% T8 W8 D
36 } % K7 b* h( b3 a3 z! g9 G! r
37  . {, |' _3 L, k$ ?
38 void TEA::encrypt(const ulong *in, ulong *out) { ! @; V' c3 S2 r8 r
39  
/ p( x& G4 J8 q( y. B. O+ A40     ulong *k = (ulong*)_key; - W7 _- o3 o$ ^9 ?5 b
41     register ulong y = ntoh(in[0]);
$ a7 P9 \2 h+ e8 {4 g  R42     register ulong z = ntoh(in[1]); ' p; j( [4 D# B- @1 d* W1 w  m, B
43     register ulong a = ntoh(k[0]); ) V, }+ m& v9 m# H: S' X' v# l; I
44     register ulong b = ntoh(k[1]);
( v( Z9 F: I6 d' r3 ^; V45     register ulong c = ntoh(k[2]);
2 J" ~" U6 A$ f- Q8 Z" A6 V46     register ulong d = ntoh(k[3]);
  G8 x9 Q" L' a  `! T' i; o47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ " I4 k" y, e. c! R7 ~! y8 K' H+ {
48     register int round = _round;   x3 z( y  h2 ^2 ?0 x$ \
49     register ulong sum = 0; 5 @" ]5 p/ E1 s# ]
50  " @, _$ t) y! B5 H: _& {  U
51     while (round--) {    /* basic cycle start */
4 s/ h! x% w3 r$ T52         sum += delta; 5 \) \, D! J/ l; X8 y; G9 D
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 7 [6 ^+ }$ a8 h% s. o  A. i+ R. z
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); # E& J) e; q# j; h
55     }    /* end cycle */ . ]0 M# @6 m) X
56     out[0] = ntoh(y);
! b3 R, ?  D5 _$ ?* I5 z& w5 D57     out[1] = ntoh(z);
+ O* ?' H/ `" X; Z" n58 } , ~* h+ W0 f+ V
59  
+ q5 t8 V3 r0 N" v- N, l- ~- `9 @60 void TEA::decrypt(const ulong *in, ulong *out) { " j5 ]- b" y2 u7 p
61  5 O9 d9 O& Q- ~6 Q
62     ulong *k = (ulong*)_key;
) l) g; i( s; q1 O/ S63     register ulong y = ntoh(in[0]); # ^/ x% y% |& f1 r2 }; F
64     register ulong z = ntoh(in[1]); , n+ u' }$ @2 w* S( {  I
65     register ulong a = ntoh(k[0]); " W' I1 Z& i: ^
66     register ulong b = ntoh(k[1]); $ y, B) t! [, g
67     register ulong c = ntoh(k[2]); , T5 W0 H' i+ u  X/ O
68     register ulong d = ntoh(k[3]); 4 s* h; @. |: l. V
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
- M7 r; V3 s- q4 b2 y. k. m70     register int round = _round;   J7 c* ^! s) u/ f5 Y
71     register ulong sum = 0;
, Q$ K' o) C1 e( _9 S1 p. J72  
* F$ N5 f, X1 ?+ p% P/ |73     if (round == 32)
9 _" {! y, y0 v9 s5 X7 V' j9 V6 N! Q74         sum = 0xC6EF3720; /* delta << 5*/ # v) [' h) x4 t; R% {
75     else if (round == 16)
8 ]/ b8 X+ l! {3 s! s2 ], C76         sum = 0xE3779B90; /* delta << 4*/
; ^: w# Y' z' p% x: g$ Z77     else
+ j& x- d: G# R7 k; F0 D  h+ @' u78         sum = delta << static_cast<int>(logbase(2, round));
+ N" Y4 Q. O" w% d( o79  , E( g3 r1 O1 w. j" J! e4 e
80     while (round--) {    /* basic cycle start */ ( o' u: {/ x+ R2 a  H/ P
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
1 E% S; U( ~: S, t$ E8 ?* w8 v7 E82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 9 }, b6 V) _! c" }) a3 k4 ^$ z
83         sum -= delta; ) S: U1 G) r- v7 P9 Z3 k
84     }    /* end cycle */
$ A8 y8 B& }8 D& i85     out[0] = ntoh(y); + b, f. Y0 k! }: @/ y6 m4 I
86     out[1] = ntoh(z);
! f; l7 Z+ V, z, u6 W87 }
& A- Q; ^7 Q! t6 k4 u: a( V% M8 y3 I5 B$ P7 v2 r* Y
需要说明的是TEA的构造函数: 7 L+ T3 {* }9 \$ K# M1 _, Z
TEA(const byte *key, int round = 32, bool isNetByte = false);
% q% }' T% C9 B9 w0 b1.key - 加密或解密用的128-bit(16byte)密钥。
; t/ ~, I8 r% o- G7 P9 E2.round - 加密或解密的轮数,常用的有64,32,16。
' W$ i. U$ g" y9 z* z  H3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
3 Q& s: W7 t2 G: t$ }* Q& _2 k. d* @  o" l3 g/ J" x
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ' P, M' t1 ]4 W* T( F# G6 P
2 #include "util.h" * P. n! Q+ z2 v* Y9 @" N# v8 u
3 #include <iostream>
, B! D) q6 h& u6 ? 4  ; t" j& H! N  ~) X
5 using namespace std; 5 m* b: ~! `  ~# d6 K9 C# n
6  
# @* W; `( V; \0 m 7 int main() {
# m, {; |+ _  P1 N 8  / |( H  u  b- b! c# x* z
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 9 p0 q+ A: R1 |3 |+ z
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
; \( d, t4 g0 ~8 u( t( a11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
' r: S' |' p8 Q7 F/ ?* ?9 w7 \1 V; D12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 4 p* [/ k; s  g/ `
13  
' D5 `4 |5 W# S0 E/ e14     size_t size_in = hexStringToBytes(plainStr, plain); 1 S: Z6 h! g9 @) i3 @) d
15     size_t size_key = hexStringToBytes(keyStr, key); 7 l9 r+ v; A. S/ s/ A, x( ]
16  
) s% m$ w9 x7 P9 y/ a, t17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 8 j5 t2 R4 t) x8 L& L, z
18         return -1;
; F- M( Y6 _5 S7 u$ N5 A19  
8 I1 P: S6 R3 B7 F& ]20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 1 |1 `4 v# C' Q# }( v- L1 m
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
* M: k# X! k3 [' t3 U3 e  m, O# p22  * w$ \0 y! @, i0 e, n
23     TEA tea(key, 16, true); ( \+ r2 C- I6 t8 z
24     tea.encrypt(plain, crypt);
" H* R& g% {4 `/ f! e3 h25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;   u' m$ x8 A- h8 [) I: P
26  
8 P& [' U5 g0 P, e9 X27     tea.decrypt(crypt, plain);
1 l  g0 ^3 M3 A" m28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 0 D) J' |- @! h. ]2 @5 f9 O; k7 E
29     return 0; & x7 b0 L$ |% |0 i/ t8 E" X9 Y
30 }
% O4 R; k1 ~( U5 y3 Y) [- t4 r0 S* s( C4 f+ i" R
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
- z5 j! Y/ l& Q, r! J运行结果: % K  h; E+ Z# ~2 x+ ^
Plain: AD DE E2 DB B3 E2 DB B3
& D& o) e. {' xKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
: v( n; f8 B2 }" R' ^5 q% v, PCrypt: 3B 3B 4D 8C 24 3A FD F2
. p! Y! X3 X- m1 \. W/ \! y) gPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-2 07:41 , Processed in 0.019716 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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