找回密码
 注册
搜索
查看: 36621|回复: 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轮):
% `8 q$ f2 c2 n) w  L3 w微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ! ^. h0 A8 [  \1 g7 \. R1 g/ e# R! u% L
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 1 _$ _2 |) e! a$ o$ ]0 ]1 r
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 # |8 r3 C6 i( E8 U0 O
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ; a5 N# f! Q# R  j3 U' z2 p
在 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. ) y6 x2 u9 N% g  s: H
  2. void encrypt(unsigned long *v, unsigned long *k) { # S/ Y7 `% z3 s- |
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    7 p3 n- c0 c- x4 p) r' s
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ + Q+ n6 o$ w& ]/ }) P% t
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ % b% C  ]  i/ C3 G/ [
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 8 o( U& m- p% l- s# ?# ~
  7.          sum += delta; - w. e# O# K6 Y( t2 E6 b$ z
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ! T( C$ Z9 N$ l3 ?- E% y) H$ T, I
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    # z' A5 X1 a, N, _
  10.      }
    , F! h( S3 |. s, W# E& y4 I/ n2 X
  11.      v[0]=y;
      ?( U6 s3 |* g7 N1 K
  12.      v[1]=z; 9 I- v1 t5 Q% A: g0 _
  13. }
    $ Y9 P5 B2 g  t: [( Y
  14.   
    1 J2 I0 _' ^& t
  15. void decrypt(unsigned long *v, unsigned long *k) {   u9 [, h) V3 _; j$ W! o
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    6 I1 V% n* q6 R+ A9 J9 ^
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    9 u/ ?( P- P9 s; w8 Q
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ) m8 U) m2 v. Z! R/ y/ }0 N
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ # _3 Z% ^7 r  ~, u
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    * D% P  s6 h: ~( V3 ]% Q
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 4 q% h4 h! Q$ y/ M, `+ m9 f7 ^
  22.          sum -= delta;                                /* end cycle */
    4 D5 t6 X% M: z- b- `4 ~: P
  23.      } - U; f3 S4 `" l) _8 k8 X/ F  L
  24.      v[0]=y; ; ~  L7 C' W# v7 j8 |
  25.      v[1]=z;
    : f8 _" N4 d# N' ^) C1 F& a* J4 f
  26. }& `2 P! m9 i/ P4 F
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
* A) }' e7 L  Z" x#define UTIL_H # ~2 h/ }+ g# r& c  u7 X) z

5 ^! P& x% W0 ?/ ?#include <string>
6 j& h! w" h0 A2 D, d* P4 P#include <cmath>
) O9 r' Z' k$ V# o#include <cstdlib> , q7 h5 N, b1 p: a% g, x3 B

5 S7 ?3 k2 G! ~  F1 qtypedef unsigned char byte;
. E5 T# h  W6 I8 Xtypedef unsigned long ulong; ( Y6 j2 D/ D* y  a/ F/ P# ~  ]- ]

/ }2 K8 H( I4 }0 d9 ~/ T! n  J3 \inline double logbase(double base, double x) {
" _8 S- X( }! i0 G/ {    return log(x)/log(base);
5 z8 L' M& O5 `2 l; |}
9 B6 i* W! B5 M
# Q8 D/ J  \! C/*
# D, y+ {. G1 Y1 |5 \( f0 ~*convert int to hex char.
( q6 h8 J! @6 b1 r, m" A*example:10 -> 'A',15 -> 'F' * [) S, o! y" B3 q
*/
/ ]4 a5 }" `5 n3 e0 Bchar intToHexChar(int x);
# I6 m; P( z) @* E. q% t * l0 i# K) {9 j( |" {3 i$ P+ r
/* % C! N3 {' u0 R3 K  s' l
*convert hex char to int.
7 \" m( v9 n) `0 w2 |! j5 J+ U*example:'A' -> 10,'F' -> 15 $ s8 N8 p+ a, }+ _6 c& O
*/ 8 C4 d2 A& _0 {- y& v* g! W
int hexCharToInt(char hex);
8 J: `3 r% `8 t # _4 Z8 f6 E) \0 Y
using std::string; , N2 M. {$ [4 N, n" i, p
/*
7 \* P5 l$ B2 t*convert a byte array to hex string.
9 t. T# ]# v2 I; b" ]. y2 o*hex string format example:"AF B0 80 7D"
  x5 \, R; y% @4 p1 \: ?*/ " G& q8 D. ^; \
string bytesToHexString(const byte *in, size_t size);
5 k6 g/ H. m" Q* T! U9 E
+ g9 m3 J! i4 b7 B6 q! J5 u5 Z3 |/* ( ^5 }' j, s2 M; x
*convert a hex string to a byte array. % K7 C4 K: D! a2 R1 L: l2 [, |
*hex string format example:"AF B0 80 7D"
/ O1 {$ W! o! P) O" e*/ " J  b% U' i8 _3 U# t2 I8 J
size_t hexStringToBytes(const string &str, byte *out);
$ P/ m' J& g2 F9 A6 \" J: V& q 8 y$ p' q& S$ h5 U% I) X
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" , r# `' a$ M* @8 {8 a( ]
#include <vector> ( O1 H: Z) A: F& r

- j- d+ T  G0 Z& k& `using namespace std;
- w* Y) D/ R( J0 ]% e8 p " z/ k" j  _7 f, p* F
char intToHexChar(int x) { ( |$ D# K; t7 j- b1 k# c/ a7 G$ ^
    static const char HEX[16] = {
& ^4 q8 J) B) M# q3 V        '0', '1', '2', '3', # {8 N  [" B! ^. s
        '4', '5', '6', '7',
5 n/ U  M0 @) G9 g: T4 c8 w        '8', '9', 'A', 'B',   Y. s- s! _$ I$ J8 q
        'C', 'D', 'E', 'F' + n& }4 O3 R. H, z( W. T( e: a, N
    };
9 Q% \; m& x6 |/ I! {1 _    return HEX[x]; 8 ^! O* o4 H$ Q' t& e
}
+ V7 F  L! {) D4 K & t" W+ T5 |5 [; \8 B
int hexCharToInt(char hex) { + Y' E+ E  Y8 |' W6 `
    hex = toupper(hex); : K( E' r! ^- c# u. I" {
    if (isdigit(hex)) & [  j- u8 O  s) m
        return (hex - '0');
7 m. e: y' W7 r. |    if (isalpha(hex))
. B4 g6 S/ m5 V6 U* F- t        return (hex - 'A' + 10);
6 }' \6 p% T% u# }    return 0;
5 e- Y- O! A) f2 ~" _} $ g( y1 e/ S+ i5 m6 n8 Y
, i( J5 }) r. t$ d' q
string bytesToHexString(const byte *in, size_t size) { ; N& u2 G' V; a
    string str;
& i/ L: M3 e% p* y    for (size_t i = 0; i < size; ++i) {
( x' I4 o" u9 X) l        int t = in[i]; , {! Y- k" R/ i" M- j: Q& R
        int a = t / 16;
! Q* x; R$ \) O" I1 |4 z        int b = t % 16; 7 }4 Q/ k/ y0 I4 N- D2 I0 h8 r( m
        str.append(1, intToHexChar(a)); 1 I+ d+ o; \5 m( q
        str.append(1, intToHexChar(b)); / `: A& i$ f& ?7 P6 w- j! ~
        if (i != size - 1)
6 K5 O+ n* |" ^' z9 ~& N8 P# M9 i: n            str.append(1, ' ');
: T. l( @- g9 i- i2 }    }
, w) P' G% ~/ L) a6 n    return str;
& V# b# @: O4 a( l} / @5 j& l9 O5 R# o) A

* f! [! z  A: m7 s4 _2 }/ a, Gsize_t hexStringToBytes(const string &str, byte *out) {
' E. E  f3 u7 E0 B- Y  U
2 J+ S: E; g8 m' Q" \7 l    vector<string> vec;
) @% |; C% a0 v5 j2 R, m    string::size_type currPos = 0, prevPos = 0;
# H- Z' j7 B0 f    while ((currPos = str.find(' ', prevPos)) != string::npos) {
# i: n; f' Y$ C+ l# D" M        string b(str.substr(prevPos, currPos - prevPos));
( v, O( V: b; A# K! `9 u2 V        vec.push_back(b);
0 Z' H+ t8 l5 B- z0 {6 i0 R        prevPos = currPos + 1; 7 K2 C. s( p, g& G, V
    } ; @. B4 R0 @3 X, F2 B3 Y& r
    if (prevPos < str.size()) {
- |( m) |# e' ?& i" \) ?& n/ J: ~: x        string b(str.substr(prevPos));
& w' d/ E- L, j1 Y+ N8 P        vec.push_back(b); ) `% a. O0 f+ |5 B$ w
    }
7 ~! D8 K" o# G3 H    typedef vector<string>::size_type sz_type; 2 w( b+ H* T$ e
    sz_type size = vec.size(); * u) T3 p2 Q7 Z3 J, R
    for (sz_type i = 0; i < size; ++i) { 2 S" I% [: [& S" S  u0 b
        int a = hexCharToInt(vec[i][0]); 7 I9 k) p: Y3 Y  f& @
        int b = hexCharToInt(vec[i][1]);
3 o* q8 y( R; v  Z) m( V        out[i] = a * 16 + b; % f7 G) D' v% D. l
    } 1 E7 c# v0 B7 y9 z; V
    return size;
9 k, z6 \6 J& X. N( _}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
$ v4 ?% P. s. v: n1 ^7 G#define TEA_H
+ V1 _, Q3 m, M" M# Z3 v% c ! B0 t9 _/ L/ h5 _) a  Q
/*
5 l$ |( H" u6 z0 A$ G* h7 `*for htonl,htonl 1 j/ D4 Z8 b* ?
*do remember link "ws2_32.lib" : S1 |2 s( w1 t4 @
*/
; W2 b3 ~, D# n. K" u, J4 z( o#include <winsock2.h> # D2 f$ }5 L0 G+ B, [% q: T
#include "util.h"
' ^6 w) }; s. w5 q3 D: `( b9 M ! m3 y0 G9 K& p( y0 r
class TEA {
8 ^, Y2 }* ~( x& M4 {3 k) Ypublic:
# o" F0 f: {9 o1 Z    TEA(const byte *key, int round = 32, bool isNetByte = false); $ w7 P% N. z# z1 D+ X4 T5 y7 k
    TEA(const TEA &rhs);
6 @% _. ~* \+ \1 W4 }; S1 q1 U    TEA& operator=(const TEA &rhs);
' `! ^* j. Q+ y" s5 O& I) X    void encrypt(const byte *in, byte *out);
* ]/ Q# H# c3 y- r" a: K    void decrypt(const byte *in, byte *out);
7 S( O. ]9 ~1 n( z) vprivate:
$ [, y9 W! W( p2 j    void encrypt(const ulong *in, ulong *out);
" c7 j' v" G9 {    void decrypt(const ulong *in, ulong *out);
% p" D/ W. u/ L0 Z1 L    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
" q4 u8 c% _' U. s2 ?' y0 z    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
# X- E: b  Q2 |4 |+ o6 j5 vprivate:
* v$ Q$ x  B7 L4 a" S9 k6 `    int _round; //iteration round to encrypt or decrypt
0 r7 Y' ]* k* ~# g    bool _isNetByte; //whether input bytes come from network
3 g8 a' B0 ~( g' e    byte _key[16]; //encrypt or decrypt key
( H/ ?5 `/ w7 w- `* B; l9 M};
: G/ I5 Y: [0 J0 q) n
; |5 R# ~( r5 h, R% H8 p( Z#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 6 w7 t( O0 j9 F( d: A0 q: x2 z- ~
2 #include <cstring> //for memcpy,memset
8 W1 B: T8 S) f 3  8 V8 [4 w( @& g4 P1 m' Y
4 using namespace std;
) h1 X1 g6 e, t/ v' m2 k  T- p; y 5  
8 Q! O* k) Q% G' c 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) $ ?! C) }* `& W' p6 M4 S6 j
7 :_round(round)
" k8 j; c7 X" {# k9 W! ]; L) Y/ j 8 ,_isNetByte(isNetByte) { ( V% @+ B5 X8 d3 b! Z
9     if (key != 0) 7 T. q4 y0 F  ?) v
10         memcpy(_key, key, 16);
8 w1 P3 t( p0 X11     else , q+ Z$ C0 V' J4 X! |
12         memset(_key, 0, 16);
0 n$ y/ h; P/ @13 } # U9 h8 A& k/ s* h9 F& ]4 h2 A
14  
* `2 ?) z# V2 L# R# E* K15 TEA::TEA(const TEA &rhs)
" ?. m8 z: W8 p6 n4 _+ i( v16 :_round(rhs._round) 4 k2 D. O: W7 K9 C" P6 ]9 @
17 ,_isNetByte(rhs._isNetByte) {
% i% ]3 F' J* R9 P18     memcpy(_key, rhs._key, 16); 0 D/ [5 I. N/ D6 |
19 }
0 B( w  N0 u. G* H* C, x+ I4 b* x20  : a( D, X9 {' C7 D0 n7 |
21 TEA& TEA::operator=(const TEA &rhs) {
9 i; s2 C/ C1 g22     if (&rhs != this) {
, ?) v% o$ O9 Y  U( b23         _round = rhs._round; 7 \7 k4 t) a$ l5 n2 N! }/ r- v
24         _isNetByte = rhs._isNetByte; # P& G) F% c9 ]9 _8 r8 l
25         memcpy(_key, rhs._key, 16);
4 c6 v, e$ A. T# ^' O& T26     }
. K: e8 M) K8 Z- @27     return *this; ) O, l6 w) b# E  b- B* Y4 }
28 }
, ?: D$ W6 h1 R) u  `8 s$ d8 c29  
% K6 p7 W! c/ R7 e/ F30 void TEA::encrypt(const byte *in, byte *out) {
) I) H8 p* [1 \9 N. V0 X/ x# G' N31     encrypt((const ulong*)in, (ulong*)out);
9 A3 J1 F# c7 H. s32 } " |* O) T: b2 V3 P7 X# ?; c
33  6 ?; R# c2 v2 A
34 void TEA::decrypt(const byte *in, byte *out) { 2 g! W0 J. {. Q% b5 N3 }4 }
35     decrypt((const ulong*)in, (ulong*)out); & H% _6 ^/ e2 P; o+ \1 s7 q* C% P
36 }
6 ^' S( m3 V: z' B' Y5 |37  5 b4 y% O3 D& m- Y5 {& {  ~
38 void TEA::encrypt(const ulong *in, ulong *out) { % C" P- h. |5 W: b1 ^
39  5 n% r+ t7 L6 J, y
40     ulong *k = (ulong*)_key;
" o: g( c8 ?( D* Z" k% I5 X# j. X# K41     register ulong y = ntoh(in[0]);
0 N8 h. z9 b  w5 b( M42     register ulong z = ntoh(in[1]);
. M* {$ I9 p) B6 w  f8 v43     register ulong a = ntoh(k[0]); . Q4 U9 p$ L8 M
44     register ulong b = ntoh(k[1]); $ ^5 V  }* X+ k& ~
45     register ulong c = ntoh(k[2]);
% i* e* e. f0 `! Q% N5 ~$ Q8 O) ]; z46     register ulong d = ntoh(k[3]);
! W7 N" n$ }6 I, @# w3 T47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
. `$ D. t7 M# N+ }1 Y9 s; h48     register int round = _round;
; u: d: Y6 f/ C) E( D0 y  G49     register ulong sum = 0;
; s4 R& I7 @+ q! k- t50  
) S. I! w! G/ P$ a51     while (round--) {    /* basic cycle start */
, G6 h! H$ i. m) x# c: s52         sum += delta; ' y7 M/ T' r. ^7 B7 M% T1 ]
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
3 m/ y3 [, C& G: Q/ S' s" p54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ! X* t  H- K. ^; ?8 l
55     }    /* end cycle */ ! j( ^% W* t) [5 F$ g" p4 c
56     out[0] = ntoh(y); . }. Y) N, j; Y$ c7 q/ N
57     out[1] = ntoh(z); ' _' K( l8 E7 k" M- T/ ]' l- w
58 } 4 m1 ^: d0 B/ S6 J
59  
9 V! N+ ~" M" o+ r% X  y& H60 void TEA::decrypt(const ulong *in, ulong *out) {
% G/ U) ^) J$ a! @/ {% V61  ) \+ R3 H' Q$ U; l% c* \  Q. U
62     ulong *k = (ulong*)_key; - |$ \; d+ a& V, d- X
63     register ulong y = ntoh(in[0]);
1 T7 d" C3 r9 U: [" [1 A64     register ulong z = ntoh(in[1]); 8 T, \5 f( j. _
65     register ulong a = ntoh(k[0]);
* p3 y8 G, ^4 I66     register ulong b = ntoh(k[1]); 2 Z  @- ]: h- i! T* Z+ U
67     register ulong c = ntoh(k[2]); 4 |& T% f) Q( V
68     register ulong d = ntoh(k[3]);
" F2 P1 o  i9 f4 ~# s4 r1 z7 B( n69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ - Q6 m  E- z4 T8 u5 e" T
70     register int round = _round; , T8 C5 s6 D8 ~5 E5 W
71     register ulong sum = 0;
# {& ?% f$ ^* y  m: B, Y. j9 C: E72  
: a& Y2 N6 \& c/ [: J# \! X0 k73     if (round == 32) ) k7 ]! x7 _+ K% f
74         sum = 0xC6EF3720; /* delta << 5*/
; [, @. Z7 p9 b) J$ S75     else if (round == 16) + }) z' I5 x; T3 D2 j- N
76         sum = 0xE3779B90; /* delta << 4*/ 8 ~" |# w$ x, k) m
77     else
2 t+ k' {5 r" l; N( L! D78         sum = delta << static_cast<int>(logbase(2, round)); ' U. w* p; Z1 l- w$ i. a
79  
5 n0 I( {2 K5 s8 S# I3 s" A" w80     while (round--) {    /* basic cycle start */
# g! s9 h5 V7 I, q- {81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
1 n4 b( s4 `! ?3 G, l" Y2 F. R82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); " H4 ?2 ^! ?. N& f2 Q. V8 N
83         sum -= delta; 7 F' r; Q9 w) h# N
84     }    /* end cycle */ , B5 W8 T3 A, l0 m
85     out[0] = ntoh(y);
6 C' y) n9 x+ |86     out[1] = ntoh(z);
/ E0 q, n7 Y/ v87 }
* M5 D1 n9 V& L( l3 a$ k9 C0 h5 D1 d1 K* i. f8 i, g
需要说明的是TEA的构造函数:
, ]" T- D2 D* \% u( X) p* h4 aTEA(const byte *key, int round = 32, bool isNetByte = false);
( O/ x0 N# b) h1.key - 加密或解密用的128-bit(16byte)密钥。
) X" n1 K8 `0 v5 G2.round - 加密或解密的轮数,常用的有64,32,16。 , D7 L6 c; c. s: O# f, a. T2 H
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
' D- S: M) U- v3 T' R2 F7 G0 K. @
  p! w  i7 m4 W' Z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
- n; k* v" b; ]  s( U  `5 ` 2 #include "util.h" # N/ e8 Z" m1 l( o3 g
3 #include <iostream> - T) {; w% p' n5 l0 ~- Q8 B
4  ! w* z& B4 J( r# A$ w, P  o' g- H: |
5 using namespace std;
$ m9 c5 t" D* Q- G8 p6 G' x 6  ! {0 ~$ [- |: J
7 int main() { : G6 M. K) D& I
8  
4 W' m+ Z( e4 _ 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
- Z6 s: T9 L, l; i2 I" [) k# C3 b10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
' J% v* j# y0 X- w' D0 \11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 2 K3 k$ M4 F3 W" e! j6 y' \& D3 r- i
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; $ }7 Q, i7 K. n' e
13  
  H$ j3 R% j- b+ _( V7 s# g14     size_t size_in = hexStringToBytes(plainStr, plain); 0 i- b! j' x! Y% \
15     size_t size_key = hexStringToBytes(keyStr, key);
8 T" F& L% z8 v) ~" y16  
8 `( H* o; x( o- d3 g17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
" G  B9 S# Q1 n3 w/ J" G18         return -1; 0 H& m" D% L' z
19    B: o' z6 t7 E. z
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 0 d' O1 q  U9 g, k/ c& l% t- e6 Y
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
# j4 s/ J+ u/ E1 ~" o22  
' e" i8 C/ A  i; P2 `0 g23     TEA tea(key, 16, true); 2 e4 A9 N' N1 i! i  h. _- V* j
24     tea.encrypt(plain, crypt);
2 i7 x  P+ \) y( g25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 7 r+ Y- w6 {+ a* A
26  
; j% C( z. e* e7 k. `27     tea.decrypt(crypt, plain); ' z1 \4 w+ G) b" I
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 1 y* Z- [& h2 c8 S) y3 y! f" B
29     return 0; * s( E; O6 [3 P* X& c
30 }- t8 E- G( P3 w: k- ^9 U" H

, l3 k( l- ?$ d2 ^本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx- @* x  W# e8 i, ^- D' P
运行结果: 2 _* W1 k# x$ M
Plain: AD DE E2 DB B3 E2 DB B3 0 q  _0 w( m( ^0 R: H! ~
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 / b. [/ O$ v& B5 [+ i" B$ C6 d
Crypt: 3B 3B 4D 8C 24 3A FD F2 ! T5 p5 e, L1 H( X' N6 S! I
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 03:50 , Processed in 0.017191 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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