找回密码
 注册
搜索
查看: 37370|回复: 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轮):$ s# @5 t' i" G7 l0 @
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
$ J+ _; g$ p9 q, U8 J. iTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
9 H1 f  K. J! l( r7 n之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
2 ?# U7 s! }3 g在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
2 @# P% Z7 e6 x7 ~  h1 V* k在 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. ; ^0 M3 d3 [' h: S. H
  2. void encrypt(unsigned long *v, unsigned long *k) { 8 C  q8 z. U% x. ], G. a) I
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ + x6 G7 P+ h% L( \( |
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ + e) l( J* }9 ^/ n1 U) C9 r# o2 ?
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ + C" T0 P  f7 [/ P8 y# Y" F3 e( o& X. ]
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ) V6 s: y5 K* s( Z/ [
  7.          sum += delta;
    " Q: t$ f' z& _) X
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ! i4 m2 ~$ _$ Q& i( M
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ % j& j* J5 Z0 V5 t/ _) y
  10.      } : l9 [9 w& {1 P/ y; Y
  11.      v[0]=y;
    2 Z, D% U7 W; L& S0 E! J
  12.      v[1]=z; 9 R4 h" q6 h5 i
  13. }
    # H/ H% z" l7 g9 F
  14.   $ K9 p% Q# V5 ~0 l; G: E4 w
  15. void decrypt(unsigned long *v, unsigned long *k) {
    1 Q9 D$ k+ @- p2 k
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) k& \6 r: ~! D+ j; h
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 9 i$ ]) E* e1 H; K
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    7 h: w& I* N% \4 x1 p# f0 U
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    * J$ @. g: F- y& u# I$ K, i. e: f
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ( h% m: v4 C. [6 Q6 R$ X3 s
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    8 t! O* E. V/ N6 W, Q8 p/ p
  22.          sum -= delta;                                /* end cycle */
    ! I, K2 v9 L1 a2 K1 @3 B
  23.      } " g. Z6 \: A2 f! c6 z( D8 `
  24.      v[0]=y;
    ( e6 q# P, p) G" p# @
  25.      v[1]=z;
    8 e4 L* Q5 U* s, w% m
  26. }5 X0 m& X- t1 \3 i7 U3 J) `3 l
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H   w  E8 `' B3 ~# X9 |
#define UTIL_H
8 @. [" y; y0 u9 _9 o9 ?; V  t* h. N2 E- u& k! t# B8 }  I
#include <string>
& S% i, W! \* r, Z#include <cmath>
1 C' v6 m8 {6 D" ]4 {8 s6 p2 c& a" I#include <cstdlib>
: @: `/ ?0 O2 V# G( ?1 I+ Z1 i
; x9 Q( U" h$ {2 C. q0 {( p! Mtypedef unsigned char byte;
7 S: W# @8 v4 L, e3 J+ Utypedef unsigned long ulong;
; l( p$ B1 J; n" j. J+ ]7 |( q . m! i4 f- g: A6 [0 R' M1 ^$ W
inline double logbase(double base, double x) {
& D; `& h( w$ j. Y) `* a0 {  a    return log(x)/log(base);
% }; r& j! z$ E5 T" |2 n, G}
% X3 s& l$ ~5 G' y0 |+ w5 h4 } 4 S; Q. |: K4 N& c3 u
/* , b; t0 l$ A9 d
*convert int to hex char.
8 Y# G& O# o- Z: s0 F6 ^$ F: W( w*example:10 -> 'A',15 -> 'F'
( A9 |- ?! A9 i*/ ) T6 H6 m" E4 v  z/ O5 W
char intToHexChar(int x);
1 l8 n9 T7 v4 K- }+ T) A6 `" z
& j+ e; r7 w& W. G/*
' K, l+ e3 o* C*convert hex char to int.
% u8 ?) q' j7 ~$ A( f' l6 x*example:'A' -> 10,'F' -> 15 / j& b2 P! s4 @6 ^9 `
*/ 0 R) |9 h% P, s$ X6 `% a
int hexCharToInt(char hex);
. L" D9 ?5 {0 G4 J* R
. K# J5 \0 b- i6 D, Eusing std::string; * v5 c+ l/ W4 F  x/ W% c% y# P
/*
! {; m' u. S  l2 X*convert a byte array to hex string. # U+ g" ^) @' k7 U8 B4 X
*hex string format example:"AF B0 80 7D" $ O% R. w! w7 g7 g& r
*/ $ k" m, H; O: P, c* n$ V; J9 u
string bytesToHexString(const byte *in, size_t size); + |$ ]+ [) |' F: p  {
; U3 L4 D  |) C4 A5 z3 q1 B2 d
/* 4 @$ p$ A6 ?* `( I6 O; M
*convert a hex string to a byte array.
# U' i; e% Z8 Z' f/ l% e$ y*hex string format example:"AF B0 80 7D"
% V1 @9 F0 [. ~: [5 j+ t*/
: j9 x; U8 t, `* Z0 N: o0 k& A- qsize_t hexStringToBytes(const string &str, byte *out); * r; t: |5 y" O; |5 Z! _# R5 Z

+ N* D4 B! H+ J- }8 c# Y7 T! W#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ! c* N0 ~$ Z2 J+ ], ^( M0 X
#include <vector>
& V( @; R5 j4 Y6 @/ r# z0 y3 Y& x
' u# U% `4 C& U% Husing namespace std;
! @$ d. A  r3 q8 X
$ w0 E/ `/ y2 K( J5 x" j9 ]char intToHexChar(int x) { % X! V6 N+ @1 R* e
    static const char HEX[16] = {
9 g, R# V# H- A5 [  Z1 k        '0', '1', '2', '3',
6 m" A+ t  K8 s. E5 U) Y7 q        '4', '5', '6', '7', 6 F4 g/ D! j, s+ x/ U+ y% D3 T
        '8', '9', 'A', 'B', - [1 j3 z0 i9 \8 x2 ~! {
        'C', 'D', 'E', 'F'
; {1 @% |& D  U, g6 N    };
' Q" r3 ^# {& ]% [    return HEX[x]; ' F! D8 S8 M, P1 L2 g
} 8 O0 t3 L. q0 G4 J' D  K
* y! p& s6 q" q, T/ \
int hexCharToInt(char hex) { $ Z. ?! D& G) r6 `/ y
    hex = toupper(hex); # I4 V! s# o/ T6 ~- z2 a
    if (isdigit(hex)) 4 E0 |) S) {) d& _) Q
        return (hex - '0');
6 o0 e6 f  {$ r: x' r) G    if (isalpha(hex)) 1 B: j- I, L. Z1 j
        return (hex - 'A' + 10);
0 p5 ?7 }4 Q/ N    return 0; 0 c' m# T3 U" n4 j9 {
} 9 d$ h/ Z+ }) \# o' M

# D4 p& |8 G5 q; t& v  xstring bytesToHexString(const byte *in, size_t size) { / N- Z* R' Z$ m8 Z
    string str;
: b0 A% C$ k, s8 G# h    for (size_t i = 0; i < size; ++i) { ' n4 I2 h; [, _* a
        int t = in[i]; 6 T6 `4 n/ c1 g5 r
        int a = t / 16; & j0 C7 y0 B# ^
        int b = t % 16; ; V0 D" L8 d7 i
        str.append(1, intToHexChar(a));
9 x8 v5 M1 _* s# A: l        str.append(1, intToHexChar(b));
: ?, m% X/ U5 _3 f1 f' k        if (i != size - 1)
: X: \4 Z  Q" Z3 _' h' F            str.append(1, ' ');
- F3 t+ ?: b+ g8 G& D    }
, z# N2 Q  V4 w0 v3 e  f& K: x5 O    return str; $ V( M8 B4 D# I8 m" u
} & a; G" k2 f; N5 Y) Y: M, ~5 @
; J9 B( j- C5 t
size_t hexStringToBytes(const string &str, byte *out) { 3 ]1 h* H, j  ^- j$ s/ @/ |

& O; ~$ S( p  W' C/ J. c    vector<string> vec;
1 X& y/ x/ q6 Q* B  J4 Y    string::size_type currPos = 0, prevPos = 0; " x, t3 D' \, S  S
    while ((currPos = str.find(' ', prevPos)) != string::npos) { # g9 M( b6 v8 o" ]+ s
        string b(str.substr(prevPos, currPos - prevPos));
) C7 |7 L  m  ]) H0 Q, Y        vec.push_back(b); 9 d  i3 @- {9 c8 V6 }1 }) G
        prevPos = currPos + 1;
4 X6 z! n: G' a; ^6 L- r9 \    }
# e* R1 c4 S. F- Y2 d" r. y3 W1 J    if (prevPos < str.size()) { 5 m7 {5 T; N9 r3 f* R
        string b(str.substr(prevPos));
/ y2 D  K6 |- h8 ?        vec.push_back(b);
" n, k" H8 B/ E$ G4 }( t    }
2 ?! c6 J0 v' B$ u: l! [    typedef vector<string>::size_type sz_type;
0 _+ Q/ }3 s. s5 l1 }9 O    sz_type size = vec.size(); ( b+ Q# }- c+ \, b
    for (sz_type i = 0; i < size; ++i) { ) S1 ^: A- E1 c: H" F
        int a = hexCharToInt(vec[i][0]); 8 C2 {# M; D. C
        int b = hexCharToInt(vec[i][1]); $ Z% _0 o! a- W6 u  d' x! t
        out[i] = a * 16 + b; 2 ]9 N& S' e2 c0 |4 }& `  n3 q
    } 5 ^7 i. E; {, @4 }# o
    return size; 6 j9 t2 q6 K* y
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
- m8 Z$ p; `' }, b% e7 q#define TEA_H
  j) G1 o& c* O* ?( X
: |. p! \9 ^3 n- f/* ; I5 g9 C# I$ w5 h; {; Q
*for htonl,htonl + k! o" s1 L; Q% Z. H: o( _3 ]
*do remember link "ws2_32.lib" " T  p9 `8 S5 ^8 {% ?6 O
*/
( @) E/ H0 t  k#include <winsock2.h>
/ P  m# e5 d1 [0 a1 K; I#include "util.h" % i7 y- O$ r' E" |& b6 ]* w# O4 c

6 a; t3 u1 f, K7 ?$ a6 ]) @' aclass TEA { % G# a+ n* z6 o  k+ z9 {& S6 w3 _
public: . R$ s8 X: K+ ^1 j
    TEA(const byte *key, int round = 32, bool isNetByte = false);
6 m" c, k8 y$ [; `' d4 C) q    TEA(const TEA &rhs);
( \7 M3 z' Q3 r3 E    TEA& operator=(const TEA &rhs);
2 P6 ?8 j2 l6 D    void encrypt(const byte *in, byte *out); , v8 `2 u: j" J% n
    void decrypt(const byte *in, byte *out);
0 U' P) L& D& O& q% d& i; W* I1 Jprivate:
. V% ]" S( ]# [$ r1 D2 X    void encrypt(const ulong *in, ulong *out);
, W" S9 s6 z" n* m$ d    void decrypt(const ulong *in, ulong *out); ! ?! t7 |; X  m, ?" r4 W
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
. z# a2 B6 {4 M! q/ c    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } , [) o0 ~# b! X
private: 9 N# y0 ?6 R1 w( f# I" ]
    int _round; //iteration round to encrypt or decrypt " E+ h- d+ O  L/ b" o) H8 |7 `: `
    bool _isNetByte; //whether input bytes come from network 7 Z8 y+ A6 T! \; x, I( _
    byte _key[16]; //encrypt or decrypt key
- c. C0 {* x0 E6 c4 ~. O' Z& p}; 2 f  T) y. V$ z
4 z/ N1 m0 Z6 A% f4 B
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
5 e  t" V9 ]# C+ _6 t3 C  t 2 #include <cstring> //for memcpy,memset
; j0 _2 }( J8 u4 D 3  
  y  W8 B: B; a" d5 C 4 using namespace std;
6 O0 d$ C8 Z" C6 g: o 5  7 B' E3 E# T6 H& t" }0 t" m! |
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) % B* ~' i, t' w
7 :_round(round)
  D. d: d! C+ a. Z 8 ,_isNetByte(isNetByte) {
$ `( @+ i: S. j1 S3 H! }  _; l 9     if (key != 0)
1 U# u& X2 }. q  P4 r/ I10         memcpy(_key, key, 16); ) j7 f8 c" ^3 g
11     else
. a! w& g- F0 k! x# P% I12         memset(_key, 0, 16);
1 {- n; u0 l5 _  U, T  t9 h13 } 7 K$ X4 q: ?6 r# g0 G) Q9 O% c
14  4 f; |* ]  q( }% ?2 L
15 TEA::TEA(const TEA &rhs) ( _* x/ e1 j( R% b% i/ \( S) V
16 :_round(rhs._round) # N, |' u2 a. w! E
17 ,_isNetByte(rhs._isNetByte) { 6 c4 M% q6 @2 l1 O- m" F3 N* {4 e
18     memcpy(_key, rhs._key, 16);
* \: ~2 o2 \. x5 W# m) N19 }
3 \# S* y6 `. ~; L; @20  ' h  l6 U/ ~4 s% U: w4 Z3 T
21 TEA& TEA::operator=(const TEA &rhs) { 0 |& ]/ x( A1 W7 E, l
22     if (&rhs != this) {
- b" `9 M+ P, D23         _round = rhs._round;
- w8 _/ \/ U: l/ z24         _isNetByte = rhs._isNetByte;
! ]1 A" l$ n2 r0 {: z% q25         memcpy(_key, rhs._key, 16);
0 d0 {2 k9 v$ i+ S+ b. h7 [, l6 T1 K9 e26     }
, S1 A' k3 J8 O& W8 ~; @27     return *this;
5 ~6 {" T# Z$ B0 |3 [9 [  E28 }
7 n  I: S7 _  s0 c6 n29  
3 `% b' o) D8 l  |30 void TEA::encrypt(const byte *in, byte *out) {
$ T4 ?1 {/ u+ N31     encrypt((const ulong*)in, (ulong*)out); . z6 s2 X( w/ W& C, k" d- @9 ]8 c
32 } * m, g; b, y1 v6 s) l9 B  f
33  % w) Y+ @5 g* T
34 void TEA::decrypt(const byte *in, byte *out) {
+ i7 Z! X4 D8 k35     decrypt((const ulong*)in, (ulong*)out); 0 Y; U& |5 x* E9 ^) Z# ], r, l2 v
36 }
9 ?" M, p, Q. }  l0 g# [/ S37  
( \; x4 g8 H' q' O8 U7 x' N4 x38 void TEA::encrypt(const ulong *in, ulong *out) { $ }6 G& R! z& y' ]% j
39  ) @3 x5 E% M$ u" K6 s
40     ulong *k = (ulong*)_key;
9 X* v! n7 l3 s+ y# s41     register ulong y = ntoh(in[0]); 5 i4 g0 B$ f# B# Y
42     register ulong z = ntoh(in[1]); . H% f% M; A  \8 V7 q* l
43     register ulong a = ntoh(k[0]);
3 q8 X1 i. o+ k' _% t44     register ulong b = ntoh(k[1]);
& f7 {" M7 X8 {1 U45     register ulong c = ntoh(k[2]);
: I+ |  N7 D* h$ c3 o; g" Q8 y) s46     register ulong d = ntoh(k[3]);
2 ~: \4 B% T8 J/ X4 [47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . I/ \5 J2 n5 u  d) [  j
48     register int round = _round;
. O! P) v$ f% m$ M( b49     register ulong sum = 0; 4 w3 y% `1 k3 S5 s8 c2 q
50  
  ]* C0 i$ j6 {0 v- |  U51     while (round--) {    /* basic cycle start */ * l3 K9 Q! }# B7 r
52         sum += delta; 4 ?% m; @4 |3 w' H5 z
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ' ~1 A* B  l( G+ |5 S# Z/ q; M
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 0 Y5 Y) F: a/ ]) k) E1 z* c# r" ?  m
55     }    /* end cycle */ ) r# l+ ]+ |) `0 X# |
56     out[0] = ntoh(y); & K, t: u: Q2 [4 N: H& u) y
57     out[1] = ntoh(z); 9 k) e/ b2 _/ W* X; f& Y
58 }
6 P3 v: _) y) p# ]: T' e. ]% }" T3 t59  
3 w9 T+ F5 T0 p( r$ m" J60 void TEA::decrypt(const ulong *in, ulong *out) { 1 ~  f; |+ f% z. I0 ^" M
61  : _/ B4 i' U) [3 h0 [3 Y
62     ulong *k = (ulong*)_key;
% o: l- q6 L3 \# a! Q+ n7 E/ v. R63     register ulong y = ntoh(in[0]);
  H2 \  f9 Y+ ?. _- [8 o) i1 w64     register ulong z = ntoh(in[1]);
# A* r  G- y/ P6 C: _! E- N65     register ulong a = ntoh(k[0]); 9 e, _) [- o! z, Q- H" l8 M( @! j
66     register ulong b = ntoh(k[1]); ) E# W  [8 v# C- \& k8 c  y4 B: w
67     register ulong c = ntoh(k[2]);
, A; i$ i( u+ b! {% h# P* l' v. o68     register ulong d = ntoh(k[3]);
& J7 k7 q. R& W' F) p69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
* _, n( d- G: U7 |70     register int round = _round; + i6 d: t5 e  _6 b2 o3 B/ b% |. Y
71     register ulong sum = 0;
1 W1 u2 \1 t. `. X72  9 z  M2 B1 k9 g2 L; t
73     if (round == 32)
- a, l6 R$ h5 R1 z" W4 P: A74         sum = 0xC6EF3720; /* delta << 5*/
8 O  i, ?7 ^& {0 W, D) X$ z75     else if (round == 16) 1 O* X2 W8 \3 `% v
76         sum = 0xE3779B90; /* delta << 4*/
9 T" _& t9 H6 x+ _) B# C- }2 k77     else & {  k6 y2 R9 H6 O3 w
78         sum = delta << static_cast<int>(logbase(2, round));
6 i3 G; z1 X: @+ g79  ) ]0 [+ ^( W: k+ C5 K& q
80     while (round--) {    /* basic cycle start */ 7 {7 S8 K5 w! E7 V$ S
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
1 p0 m1 `8 o) }82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 3 b( Q3 u* M- g- i: C& `
83         sum -= delta; 2 Y7 P; {1 p4 C! `
84     }    /* end cycle */ ; \: C5 B, T6 x* D9 M( }/ S
85     out[0] = ntoh(y); / ~" C0 R  K! x9 s/ e, v
86     out[1] = ntoh(z); 7 J, L2 K" N9 B, G, Y8 @: N
87 }
- I3 {1 u, J; I+ n, g( I9 t
% L1 V) q4 M  Y0 N, F需要说明的是TEA的构造函数: . v5 g* f9 {6 L9 r- @' ^
TEA(const byte *key, int round = 32, bool isNetByte = false); ! Z: J7 O) X2 i/ t
1.key - 加密或解密用的128-bit(16byte)密钥。
' g, O3 ^( @- {$ e2.round - 加密或解密的轮数,常用的有64,32,16。
' P; N/ P4 {9 |( I/ D3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
* k5 q, U. N2 p$ }. |8 }$ a  k& ?; R# L) x! V; D
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 5 d$ h: u2 R  `% _
2 #include "util.h" ) D: l7 u1 \0 @5 o/ p! N
3 #include <iostream>
3 w* n7 Q. a( j, W) s" x2 a 4  8 ]9 o9 z6 a8 Q* P
5 using namespace std;
3 w; Z6 V; G* s 6  
; D4 V# [& [1 |! H/ z) e, q 7 int main() { : D- I- _* p" U1 e: T
8  " g8 ~' [. _: `- l
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
: c. h3 P7 v# |! f: J( a5 R4 _10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); : s5 u. A" ?% m) ^$ O3 L
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
4 A' T3 A6 `  }( u2 v12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
9 ^! h: y- L) {5 f; E9 z/ ^1 J6 G  a2 l9 w13  
# I0 c2 i3 `8 n+ H4 d  y+ J14     size_t size_in = hexStringToBytes(plainStr, plain);
6 A! A9 K  O2 G: l5 L6 w5 m' r+ _15     size_t size_key = hexStringToBytes(keyStr, key);
+ s8 G8 L! k- B; v: F0 f16  / ?+ O( f; m# y0 o# V/ T% ~7 c. m
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
: a9 M  j# s3 ]; F18         return -1;
/ i- I( A8 Q5 L# p: o5 _19  6 O$ _1 @; O' G& H- K$ g( o
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
  \8 @# r! p0 u1 C2 W9 p. P9 v21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
4 U, F* U4 g: G, s22  
- X$ f" z* Y9 J, m. n. R! N9 r; _- c23     TEA tea(key, 16, true); % F5 J3 V. p1 L: V# N, E
24     tea.encrypt(plain, crypt); $ y- D% e. }8 n5 V- F
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
! I4 a7 W  D# z7 f0 c# r26  # N+ M" y/ ]: c
27     tea.decrypt(crypt, plain); ; _4 B7 t! d$ g6 J: T* |: Q; n
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
2 k) c2 l8 p) x) z4 u29     return 0; , w3 `$ u* f. q6 n
30 }
/ ?& S0 X0 z5 t! B
  u+ F, v: s3 J5 P! e4 Z  m本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
) j! [0 z7 a; Y7 y* N' F! |运行结果:
& e! G: k( T/ @" r- VPlain: AD DE E2 DB B3 E2 DB B3 - O7 V9 k9 K* r$ c( F+ K
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
- ?# D% S+ z: u9 Q9 ZCrypt: 3B 3B 4D 8C 24 3A FD F2
: W4 ]: V  t- t: `: o1 j# |3 E- NPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 18:49 , Processed in 0.021342 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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