找回密码
 注册
搜索
查看: 37296|回复: 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轮):
5 F* V8 g8 h$ \6 f4 k) m$ g3 C微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
. o2 q$ P, v9 A5 t' N/ W( ~TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。   c. u  a; F- b2 o
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 , m, L% I; r+ k9 C; {  W
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
- e( G- a! v( W8 o6 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. ! e2 R8 @+ x( y8 v" w) g7 q
  2. void encrypt(unsigned long *v, unsigned long *k) { - c' A8 ?* S* c3 y4 [
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
      B- [- P+ v% `& {# v2 i; E1 c
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    # d# ?: z# I" X; `
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ ) J0 P% a' k+ a* X1 N
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    / N: y% ~0 E! j, |
  7.          sum += delta;
      e& w+ \" h) E! Q
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    " F- x9 ]3 z: y" k2 M6 @- d3 M
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    . F9 a% L; z% Q! `3 ]1 l
  10.      } 7 g1 o' u6 F! |# w6 A. ^
  11.      v[0]=y; & x; ?. ~/ U9 R( Z: X
  12.      v[1]=z; % j+ P! e7 l4 {+ c& T
  13. }
    . g0 S! X$ F5 f$ z) x
  14.   
    * n: W" }3 P  q( P
  15. void decrypt(unsigned long *v, unsigned long *k) {
    5 y* a. v: G/ o$ k
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    1 Q# b9 S* X1 g* c1 v# A
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 2 K/ C  z0 l) k; r
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    / j( K' m  U5 i
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 7 D8 ~; U1 m3 q& n, R  V
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ( g. s. _1 E3 e
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    " U; P4 i2 ^# I" T
  22.          sum -= delta;                                /* end cycle */ 6 ]& X+ k) p$ ~4 i7 F
  23.      }
    0 c4 A9 b- P/ s. K
  24.      v[0]=y; 4 b# J- A; m1 [
  25.      v[1]=z; # G. k9 Y; q4 V2 m
  26. }
    1 V) b* I5 _3 s: y5 h
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
6 ^* ]; d3 H& p7 \5 y#define UTIL_H 3 I1 K7 |' i3 F# I4 }5 I8 m, ?
$ j( F' U8 M. [- t4 r
#include <string> - ^$ ?5 N  y4 A) O* Q# b3 S% `4 `
#include <cmath>
1 q( R2 }) P) C* R; M#include <cstdlib>
0 ~6 H* o6 V' v5 w  h 6 g8 x! T6 ?; `8 g9 |4 a
typedef unsigned char byte; / I( a* ]2 ]% o& O5 ^
typedef unsigned long ulong; 2 V- \" _0 e/ F! Q" s9 u' K/ b
1 C' Q5 T9 M2 G: k" z) z( V' y
inline double logbase(double base, double x) {
* D+ ?1 T8 l$ z+ Z/ g5 l/ J) N    return log(x)/log(base);
( w/ T& J$ Y0 W( X. I}
; U7 z/ z7 y3 W; e$ F
( a( S( @0 i* Z, X& h: j7 w/*
8 p% o2 f9 y: k# W- D2 k*convert int to hex char. ' g- ^6 n; S5 \, m4 k1 W
*example:10 -> 'A',15 -> 'F' / L% l2 p* t1 Y
*/
& i; j4 O+ i7 t9 O. u  }( J' K/ [char intToHexChar(int x);
: d+ r3 T4 P  Q% @
- ]6 e- O8 b4 G, U/*
4 c  ]# E, J: F) h# g  [' k*convert hex char to int.
$ M5 o0 z/ E5 @1 Y*example:'A' -> 10,'F' -> 15
) Z0 P* T1 u6 _. q7 m$ W+ h" ?*/
3 ^7 h0 T1 S& L" E( Dint hexCharToInt(char hex); ; n3 E2 I; ~6 C, q& Y5 i& y: M

% a1 i4 o: ?. v  ?( eusing std::string;
; u' t3 M9 A' j/*
" k( l* j6 Q% c) F2 z$ I. N*convert a byte array to hex string.
5 {1 h! v2 A* I$ ?$ E6 X*hex string format example:"AF B0 80 7D" : m) u6 s  P' O" l4 `/ U* {  Z
*/
3 ?# U8 z: b' F, d- @string bytesToHexString(const byte *in, size_t size);
/ @; R; I. Z- E% J% ~4 b
) U  c: \7 t7 W0 C% w% \! Q7 W/* 8 H8 C# Y- ~4 p% F
*convert a hex string to a byte array.
9 `- T1 s7 f) ?$ {8 y*hex string format example:"AF B0 80 7D"
( d. q$ Z7 ?' E6 t0 A& \*/
5 N) Q% }& o0 b% A- a0 d& L2 I1 Msize_t hexStringToBytes(const string &str, byte *out);
1 D0 X: n* N+ `* h3 o  t; |
7 c' ?- G/ T8 j#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
  e% {! r8 F, v  ]; G% b$ `#include <vector> & W+ u! O* I4 L& ]6 }; g

* R' V7 l* d- z, z( Jusing namespace std; 3 s- k: r# m( C* `# h$ ~

; O( u0 V5 g$ |char intToHexChar(int x) {
% h& W) m; q8 e    static const char HEX[16] = {
, \$ |$ D5 K6 t. I3 R$ d3 W        '0', '1', '2', '3', + ?4 L  k: g4 ^+ Q# }9 @
        '4', '5', '6', '7', 9 W7 F1 m% H- ~/ W4 e
        '8', '9', 'A', 'B', 9 x- a4 s' _, ^* H$ d+ N
        'C', 'D', 'E', 'F'
& F7 x7 }; a8 A. A6 @9 g    }; - |$ y6 }4 N4 [  w
    return HEX[x];
7 q9 }0 i+ Y$ P6 K, {2 J}
5 n, {! ?1 C& o 5 r& |1 U- G2 L
int hexCharToInt(char hex) {
) |$ j6 L$ q  H4 V7 i: A    hex = toupper(hex);
0 Z5 Y4 }% e% ?- t% k! C+ _    if (isdigit(hex)) 1 c- y; |) P: ]( l2 R4 [: O$ g
        return (hex - '0'); . Y* Z# a. m) l- t4 |) v
    if (isalpha(hex)) 1 ~0 ?: w" D- Q; N8 V  H4 z0 L- d
        return (hex - 'A' + 10); 6 ~! L; q/ j( j
    return 0;
, j6 T6 R$ C+ v, L) O+ T' k& I}
2 P9 t% J4 J4 p( n
- c) r! h3 Q0 Vstring bytesToHexString(const byte *in, size_t size) {
( _  F4 ]7 P2 |5 n    string str; + Y% c; O- u0 o" x
    for (size_t i = 0; i < size; ++i) { 0 |. ?0 h* p+ M" c9 l, H3 O
        int t = in[i]; 3 @. u$ X0 u" @* ~2 a: e* a& V
        int a = t / 16;
) t& r: q2 b! K        int b = t % 16;
! b4 A9 k( W! o        str.append(1, intToHexChar(a)); ! S! c* u* a9 b) {  i
        str.append(1, intToHexChar(b));
3 C/ P2 L7 F$ X, A* _7 e1 c% t: h        if (i != size - 1)
4 ^$ q' J( i8 [. w3 j            str.append(1, ' ');
' ]8 b! a8 D! [; H4 d    }   j) q2 {1 n) m% }  d4 {
    return str; & h9 i/ X+ K$ R/ r( q, D- h% E. C
} $ W, v3 d5 w: X/ {% P& B. D5 g
0 G5 _: Q% c+ q
size_t hexStringToBytes(const string &str, byte *out) {
2 y- Y7 Z" T2 n ; I- n* ]* d' p2 Y% c' G
    vector<string> vec;
( @. M0 v) }5 `) B* |    string::size_type currPos = 0, prevPos = 0; ' V* H+ J8 i2 F7 a& W/ L# m
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
; S9 ~& }1 p1 \        string b(str.substr(prevPos, currPos - prevPos)); ! A' j- C% G( C/ P
        vec.push_back(b);
0 ?! F0 z8 e; D4 I9 H8 V& n        prevPos = currPos + 1;
, S* ^' c" p" F  a& E' ^. ?    } % h& [; b, A3 y" z, B: u0 O
    if (prevPos < str.size()) { ; m7 t3 J- W# B
        string b(str.substr(prevPos));
; Y: n9 E: f" T2 K8 [. D) S4 L0 t        vec.push_back(b);
& o3 h# ]% E) x6 ?8 R6 I' q' d    } ) w5 J. {  o% i! ~. a4 d# E4 A
    typedef vector<string>::size_type sz_type; ' x9 C1 u* j- l/ O- p
    sz_type size = vec.size(); ; @" R8 f( @+ m
    for (sz_type i = 0; i < size; ++i) {
; f' z6 _6 g: t& M2 B; e        int a = hexCharToInt(vec[i][0]); 2 X/ U6 b0 V2 i2 w/ G! t! @
        int b = hexCharToInt(vec[i][1]); - B7 a& f1 v" }. P
        out[i] = a * 16 + b;
$ g) L# n+ ~7 u2 A- ^3 s) {+ a    }
9 [+ w0 Y, X# M" c, o- p* h. J    return size;   b5 W' J) W: T6 P& p
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H # ^8 U+ {4 X$ l# k* H1 ~8 M, ^$ v6 m
#define TEA_H ! l! m4 y6 q& b
) J! X$ k9 c: w8 N: p
/*
. x4 [, i4 V( p9 T*for htonl,htonl
6 b3 c" v( ]4 Z- b*do remember link "ws2_32.lib"
9 L/ J: j- k* B: m*/ 4 Z+ _' d2 R& E: O: Y
#include <winsock2.h>
7 f9 h/ e6 `4 Z) ~' N6 t4 A#include "util.h" . k, h7 [( i' w1 K. {$ V# ~1 T
3 p0 w. [  l' u* f) U
class TEA { - B  k) o2 ^4 C* l9 g* d7 H: e
public:
5 y; T0 g3 l7 [" L1 G. u" B- |. G    TEA(const byte *key, int round = 32, bool isNetByte = false);
, ~( C2 h( o5 S; b    TEA(const TEA &rhs);
6 i0 ?( R8 j; z& V+ y! e# a: Z    TEA& operator=(const TEA &rhs); ) W& F' m) U" k" s; m/ p
    void encrypt(const byte *in, byte *out); ( P. @, g) ~+ g. d5 ^
    void decrypt(const byte *in, byte *out); % T" _3 Q" V. P) F' n- C: }) J
private:
9 ~3 A9 ?2 O: A3 l' v    void encrypt(const ulong *in, ulong *out); % v% ]; U# u& c& s6 m% g5 _$ |# `
    void decrypt(const ulong *in, ulong *out);
8 @1 L6 z! U# s+ a& ~$ ~+ l    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 7 }0 v* C5 e& n. \5 w9 T- D( \; h
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
) M6 k! }' L1 n* v( E. O1 @private:
: `! R1 k. n- Y! E$ \, T; c    int _round; //iteration round to encrypt or decrypt
! ?( x- l4 k2 p9 \1 A    bool _isNetByte; //whether input bytes come from network $ a6 t. i2 u* I0 S7 Q
    byte _key[16]; //encrypt or decrypt key
' f, K0 i' R/ k3 X};
) h% L% l$ s2 D" K 0 e% b6 {' q" Q0 Y7 o% G
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
: N: b' a. I$ C* P# s 2 #include <cstring> //for memcpy,memset
1 B+ o- v2 T2 K( ] 3  7 A" r7 t8 K& O7 g5 k* o1 }$ ^/ H
4 using namespace std;
2 a$ ~8 Q( s9 |. ?5 y& C/ x9 U 5  ) F: G/ J- L) E, E2 K
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
4 a/ M- b2 r) S- k, Q5 e 7 :_round(round) : N, D, M( X' n9 E
8 ,_isNetByte(isNetByte) { . H8 Q' w0 N8 I
9     if (key != 0) - m3 h' d6 {8 @) N  u$ m* ~" @' S
10         memcpy(_key, key, 16); 7 M* b0 O  p: k3 O5 C7 ?
11     else " j4 N- n: r( |2 i- M
12         memset(_key, 0, 16);
( x" d- I$ d" y6 ?/ e1 }/ B13 } 8 M7 v8 x' T$ J7 W+ B' `, s
14  
3 g5 s( R/ X: i! n( }4 U15 TEA::TEA(const TEA &rhs)
8 {  B* `; h7 W$ z" O6 R+ ~$ I$ \16 :_round(rhs._round)
4 n8 v0 b/ t7 t2 G% G4 V17 ,_isNetByte(rhs._isNetByte) { ) T+ w; X) y7 m
18     memcpy(_key, rhs._key, 16); 0 y5 S7 N( O4 J) O" ^1 c
19 }
7 A: H. N) R) `  u6 o20  
  k8 [" o8 d9 y% O9 d21 TEA& TEA::operator=(const TEA &rhs) { # A6 o' @9 |1 F  H0 J; d$ R% m
22     if (&rhs != this) { . |. \! k. }  ], R* u2 _
23         _round = rhs._round;
1 N/ I1 f/ n8 t4 Y8 ?5 `24         _isNetByte = rhs._isNetByte; 2 J) i+ [6 k9 {1 s. @+ q. Y2 d7 ~; l" ]4 D
25         memcpy(_key, rhs._key, 16);
& j9 w" o7 Z/ |1 g4 e, Y26     } 7 o6 R/ \! m8 E/ b
27     return *this; - q. v3 i$ _. |8 t
28 }
5 G6 m8 e4 I) U29  - b- q3 U/ o" ^+ n) s
30 void TEA::encrypt(const byte *in, byte *out) { 8 b) M& z9 [- `9 ]
31     encrypt((const ulong*)in, (ulong*)out); # W" l7 @' z) H2 O4 v0 m" c
32 }
& r/ i( j! q2 t; d; f: B/ V, J3 _1 W33  
6 V' O- m1 m6 V- t8 A6 i7 \34 void TEA::decrypt(const byte *in, byte *out) {
+ D  Z; k4 i) Q' H1 O  N. E) G35     decrypt((const ulong*)in, (ulong*)out);
# F8 Z1 S& g& k, T2 W* k( r$ C) Y36 } % h2 c3 O+ M) `1 }1 ~5 }1 Z- K
37  
' L  ]1 g; r7 [5 l' m38 void TEA::encrypt(const ulong *in, ulong *out) {
1 B' |- g% q" `* D0 Y6 I39  
4 q2 Y! X2 O- w4 Y3 z2 z0 A; v40     ulong *k = (ulong*)_key; ( d+ P  J7 g. ^% |
41     register ulong y = ntoh(in[0]); 3 ?" B; P' J6 g9 J) b. u1 h
42     register ulong z = ntoh(in[1]);
! a: I* x3 s: @, g* c5 t0 q43     register ulong a = ntoh(k[0]); ! m! w3 {# J1 D) q+ i
44     register ulong b = ntoh(k[1]); 4 c- o3 U, @$ x6 }3 ?
45     register ulong c = ntoh(k[2]);
& ^" j5 ^( H- [' @  W6 A& H46     register ulong d = ntoh(k[3]); 5 m1 e. ]& z0 r4 M( e' D
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . o$ `' X6 f  g( h
48     register int round = _round; * p& I3 c& ?/ w2 U% d& G
49     register ulong sum = 0; ; D- w' V7 \' K: M3 n. L
50  2 X; M- H' o' P: O" y" F! I8 e
51     while (round--) {    /* basic cycle start */
5 \, A: o0 G9 Y1 m! k7 p52         sum += delta;   X; `3 x, m% ~. n0 e# V- S
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 1 x% ~' J3 U6 x. @$ X( v- l
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); & ?& L) _5 |5 W* t9 P9 E
55     }    /* end cycle */ , z" I" H! ]& v" D
56     out[0] = ntoh(y); ' a$ {+ i! J) s% V
57     out[1] = ntoh(z);
* B$ x6 H" X$ S6 Y58 } 3 `) B$ C. ]2 O
59    I% @5 g) x5 L$ Q# v" \
60 void TEA::decrypt(const ulong *in, ulong *out) {
& Q% h9 A! r# J, O+ y61  - Z% S4 m- u% q5 S$ B0 [
62     ulong *k = (ulong*)_key;
4 }: a+ n6 F6 p/ B  W63     register ulong y = ntoh(in[0]); * c9 P) C+ w! z- D; D
64     register ulong z = ntoh(in[1]); / _/ T8 b1 |& G* F, H1 }6 O
65     register ulong a = ntoh(k[0]); 9 r$ Z# o" O+ b! A1 }, L  j! i
66     register ulong b = ntoh(k[1]); - ^  y  e: X0 m' d- y
67     register ulong c = ntoh(k[2]); 1 U" h4 q* A1 w2 C5 ]
68     register ulong d = ntoh(k[3]); - D' R! |' @9 ]) x7 I! I. M; G7 X/ R
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
/ h& ~/ R9 R" `4 k, w70     register int round = _round;
: K. M: K. `' j0 f# R9 Q' w( k71     register ulong sum = 0; 5 m* G- x' U5 d5 E7 l
72  $ g4 n/ D* u5 {$ V+ I& |4 C
73     if (round == 32) % q) E) @# u$ s) m
74         sum = 0xC6EF3720; /* delta << 5*/
8 p) F$ j: f3 T" W" j5 {( F6 ^75     else if (round == 16) 1 Q5 J3 b% R0 o  n
76         sum = 0xE3779B90; /* delta << 4*/
6 A) G4 p9 z* B77     else + a$ g$ \& R' L
78         sum = delta << static_cast<int>(logbase(2, round)); + H7 o1 n  `1 l4 c9 n' W& Q
79  2 ?1 j, j0 V4 ^* ?2 b# [
80     while (round--) {    /* basic cycle start */ ' N2 x5 z' ~3 M) E/ b, Y/ g% D3 I7 j
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! @& V" a) C9 u2 [' ^! \8 v4 r$ _82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
, r( j# P' D( A. Z. I/ f83         sum -= delta;
! \2 O5 K5 L# i+ ?2 u, o84     }    /* end cycle */ 3 Q) k' b1 i- H5 k- E* c  r
85     out[0] = ntoh(y);
2 K: [) c8 ~& k. c( e. O4 `# k86     out[1] = ntoh(z);
6 w# Z/ z0 s! j2 a; H87 }" k" n1 M" A+ h
6 L' v7 ]1 d+ X) Y2 x/ N
需要说明的是TEA的构造函数:
- f- k' d' s( ?" bTEA(const byte *key, int round = 32, bool isNetByte = false);
' F/ E3 D8 H# G9 K& ^4 S1.key - 加密或解密用的128-bit(16byte)密钥。 * c6 `& d9 W4 y* v% n) [4 [- s
2.round - 加密或解密的轮数,常用的有64,32,16。 , b! B  T7 J) Y* v
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
' u! M, d) W# a* H6 u. k7 H4 J7 m2 K3 l: U
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
' n. `0 }  ~0 B2 t 2 #include "util.h"
$ n9 k* D) t- U$ b1 r; J 3 #include <iostream> - |/ J+ U/ D* A) f
4  $ V. S  V. i6 t8 [/ i$ m4 d9 Y: t
5 using namespace std;
) \+ p( P/ k1 @$ L1 u0 U" j8 T0 g 6  2 G3 m- v0 X! k9 K* c) z" v
7 int main() {
9 `: c& h0 f. w+ `, a; W, A4 A; [ 8  
7 @  x3 V3 i  t$ U6 b! x9 w 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ; ~& J1 {: K/ |& s
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
1 V: A, Y- Z9 ?& g& K. F$ U1 }2 p11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; - g( F. M( [8 n- j, Y* p. s
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 3 u& ]* c+ y* e+ R( X, E! B' d
13  
. A; Q/ d% r& O14     size_t size_in = hexStringToBytes(plainStr, plain);
; O4 A; A# x2 \$ M15     size_t size_key = hexStringToBytes(keyStr, key); 9 `' i" E3 v' ]' _0 z# R
16    q0 J' _+ D: ~" }8 t1 ~
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) % Q1 g; L. X# F/ R- t5 y
18         return -1;
; s2 k: t7 |2 ^19  
4 P, y6 E% {1 e' L5 a$ g/ A" ?20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; , i  g" B* A5 z+ w
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; . U% M0 o9 r0 U4 Y4 S
22  
2 e% F6 \2 `' ^( {8 c23     TEA tea(key, 16, true); 7 x) y$ p+ x4 p. A9 S1 r# c! a4 F
24     tea.encrypt(plain, crypt); - e' h* i) G6 V+ M
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ! \8 y9 j/ ]& P" m% C: l) m! |
26  
) e4 I3 |  X; |% k2 u27     tea.decrypt(crypt, plain);
' M8 t: ~3 y- o! w' Z! O28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
4 q! D: Q5 Y) i7 d9 ~8 b1 g29     return 0;
" j6 O7 Z& ^1 n: t1 g. G, E30 }' D: `# R7 K2 S" C  M6 ^' ~& R
  g5 x3 O9 e9 N; W# r
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx/ n4 x! a9 I% ~3 G: E
运行结果:
  [% p+ |8 @% Q% y5 b( q; a8 k# p: hPlain: AD DE E2 DB B3 E2 DB B3 + \) R8 ~3 ~' L/ x' G
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
# o* C" O# N+ n8 s9 `$ ]4 H' D$ mCrypt: 3B 3B 4D 8C 24 3A FD F2 . f+ n- y0 t0 E! `2 O
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-25 01:09 , Processed in 0.020173 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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