找回密码
 注册
搜索
查看: 37417|回复: 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轮):
# N1 y5 `1 C) t) D, s! A$ N' K6 s  P微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。   u2 A  n# [6 `$ V( W" Y
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 4 i, |% L& v% |5 `8 T8 X% g
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
* p1 _* a$ R& G8 ^在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
  v' d) Q" c4 ^在 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. , I- c- G5 ~9 I2 U3 G; ^7 Q2 M
  2. void encrypt(unsigned long *v, unsigned long *k) {
    5 \% c' W. p5 ~' f& s$ y8 k- @, J* E0 r
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ # p. I5 M7 f" O0 G
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 9 k! H2 n+ Q# O+ j
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 0 w. |2 Q& a& T
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) @. S- \* t8 g1 n* B1 j! b- o
  7.          sum += delta; ; G- y3 q4 \4 u2 l$ M+ G
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); . N4 k0 J. f- s
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ % Y4 c* }, ^$ d7 ~4 n
  10.      } ' C4 `3 ?" N) H( \+ b
  11.      v[0]=y;
    4 N! z/ v4 V' I7 s+ M* p9 Z+ [
  12.      v[1]=z; 5 h. g) D8 ]/ D1 O) [: w  g1 H
  13. } 8 S/ |! V* ^0 z0 s/ g
  14.   
    % l' C; Y* \  ^/ j; j# f$ {
  15. void decrypt(unsigned long *v, unsigned long *k) {
    4 X* [$ a% J! u! \
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ $ F# x# j: y/ K( _8 ^) u- {' L
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
      _" A$ H2 B# R8 o
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ % `6 @, E+ Z- O! R& S# A
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 7 U. i5 y# w: x
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ! a* G) ]  R, ^7 B0 h) R
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); # N* ~; R; \& G
  22.          sum -= delta;                                /* end cycle */ ( Q3 g2 S8 F* U4 N, w
  23.      }
    2 N9 q: `! ~# _$ Z& z9 y
  24.      v[0]=y; ( _! P5 V0 b4 f, s- L* e; p/ u: z7 a6 q4 D" X
  25.      v[1]=z;
    - k: C" v* S' T- x! e
  26. }- ?" J: P1 U# K$ @( g& b7 M
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H " d  t# e; I& _3 ~0 Y% c
#define UTIL_H
8 W9 l( h$ \5 c/ Y9 f( h. S- ?7 Q8 W) M- j3 J, d3 q8 [
#include <string>
; X1 c* }: Z/ A5 J#include <cmath>
$ g1 B* o1 \+ K; O! @: v. B#include <cstdlib>
- b. k+ u4 Q$ L+ f * f# V- S% W( I1 i; D
typedef unsigned char byte; 2 C6 t, A2 |6 j/ b' ?$ |
typedef unsigned long ulong; - S: }% h1 L+ R0 u, L

9 J, N! [; ~& h3 ~8 Ninline double logbase(double base, double x) {
& D$ f0 ]* x) J" y2 V    return log(x)/log(base); 7 X4 _/ q* f; i# \! Z3 e
}
; z! O& T8 ^% V# G6 A! L* ~ / l8 `, B$ I- }
/*
5 |. Z4 n0 P/ m*convert int to hex char. . `& b2 w% }% h+ d1 E$ N/ [  x
*example:10 -> 'A',15 -> 'F' # E0 }2 H# |! @  ?7 @" @  @
*/
. X% V0 d7 W  |8 h* K  u6 mchar intToHexChar(int x); " V0 ^  h) Q- G0 |& V7 \# E

8 U! s: z. H; q  ?. X6 Q6 Z/*
, g# |" W5 s+ W2 l1 H5 q  ]. L5 Q*convert hex char to int.
. U" u) W: ^/ [8 L*example:'A' -> 10,'F' -> 15
, y1 t. D! a- z*/
4 u* x, H, F4 K- }% j. E, W; |int hexCharToInt(char hex); * H( A$ S- d% ]& ~1 ~- J7 Y

( P+ M: I7 R  d; C8 qusing std::string;
' _% W) ~- U/ I/*
. Z: R  @1 Y9 a; {, `" [*convert a byte array to hex string.
. B, ?1 t. {# X; T, ?3 O! b3 S*hex string format example:"AF B0 80 7D" 8 u% G. p3 R, ^1 t. p. v% x) i
*/ - Q6 q& W  f  m' x4 E6 B
string bytesToHexString(const byte *in, size_t size);
% S! W3 W9 V" s! ^6 _) B0 p, d" F
8 m3 r% _$ p& m7 v/* 8 @0 C: K: K& c2 E- ]# Z
*convert a hex string to a byte array.
3 w$ U( u0 d6 ?. w! j' X6 N*hex string format example:"AF B0 80 7D" - ]! P+ M1 D3 a# i3 V2 V
*/ 1 m& v+ ]1 o6 K: E
size_t hexStringToBytes(const string &str, byte *out);
% \! \( a2 j2 j& g2 ?& y( Y, H
/ u' c6 w: ]& m5 f( {7 k5 `#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
8 X- e7 L& R( W7 ?$ \, a. N#include <vector>
, ?8 P0 z, V2 z' d- \9 G. i% p3 } 6 V, H. ~) {0 [- e% I# g. x& @. g
using namespace std;   {5 w3 |$ @* E$ V9 i8 d

* R: o% S0 T6 schar intToHexChar(int x) {
9 Q, K/ k$ ?9 x  M, o    static const char HEX[16] = { ' ^5 _, B2 ~2 `# X* Y
        '0', '1', '2', '3',
$ p3 C7 g) Q+ {' G) |$ O        '4', '5', '6', '7', : S8 y% y$ J  q/ p( V: n( O
        '8', '9', 'A', 'B', , V' {. c* X) C$ S
        'C', 'D', 'E', 'F' ( i' N) {$ k- o+ m- K
    }; # P# ?; f0 \) ]: v% x9 c5 O
    return HEX[x]; % M: ?' O1 _  T2 T4 ~1 V. Z$ y
} - x( x7 r% X9 r# v1 B8 G

. ]7 R" N7 t  A- `2 M  a( \$ Tint hexCharToInt(char hex) {
  \1 u# Y! Z. r0 `% L* A    hex = toupper(hex);
% H8 f& o5 E% x& Y! M  {" w8 w    if (isdigit(hex)) 1 l, |1 v7 i" h
        return (hex - '0'); , u9 D7 Q; }( y3 d+ W( B4 L$ J
    if (isalpha(hex)) - L# w. T3 S+ A  E* {" M
        return (hex - 'A' + 10);
$ {$ j$ n: }4 f& [$ `% ]    return 0; + g3 j7 m# E* Y
} 1 e: o4 ~+ X6 S1 f/ l4 Q' j8 i

# ?3 O6 M" i# _6 L* fstring bytesToHexString(const byte *in, size_t size) { ! r7 a8 L% _  m* w
    string str;
9 A+ c( L# ^6 p- }4 z$ d- f    for (size_t i = 0; i < size; ++i) { 0 D+ n4 j) b8 Z! `& h) B1 l+ v
        int t = in[i];
1 O0 c3 D+ T9 D4 @( T        int a = t / 16; $ h/ ]: I6 z  }$ r4 `
        int b = t % 16;
& h% z% l& O  j% y7 S  L. y, v        str.append(1, intToHexChar(a)); / D( I. a7 U. j) }5 x: B
        str.append(1, intToHexChar(b));
- ~& P' v+ V& N        if (i != size - 1) ! T5 |2 r5 u/ g8 M
            str.append(1, ' '); ! ]4 }" k5 _' p9 w! m. G( J
    } & O) c/ d6 O+ D* D* R1 |0 u; m$ V" D
    return str;
- V# h" c( ?$ O/ B. x% n8 O' P} 5 W! E6 p4 \' u  l( u
5 u' P3 Y% x7 @7 ?' l
size_t hexStringToBytes(const string &str, byte *out) { 4 v$ ]* ~& g7 v

7 B4 b& B& w3 I6 a+ O2 S    vector<string> vec; ) t% o& Z+ R, ]5 N4 C: O
    string::size_type currPos = 0, prevPos = 0;
& z5 v7 ]  W2 P) C0 A! q$ a    while ((currPos = str.find(' ', prevPos)) != string::npos) { 8 h; o& Q0 r, I5 t
        string b(str.substr(prevPos, currPos - prevPos)); 1 y5 F  p' i+ Q! B* o: B
        vec.push_back(b);
. P- d- x3 d2 S' D5 t# R        prevPos = currPos + 1; 5 S9 A* P) m0 E1 Z! B# y
    }
) Y+ Y/ k7 T1 {* I    if (prevPos < str.size()) { , C$ G+ W4 o0 E$ w/ }
        string b(str.substr(prevPos));
% b' B* M  F6 D2 v7 c        vec.push_back(b);
( e: x7 A1 C  `8 l    } ' d) K4 p1 O+ I* g6 H* ?2 K5 R9 f
    typedef vector<string>::size_type sz_type;
0 e, k' n+ c2 D' G8 ^    sz_type size = vec.size(); 0 r0 }* n! f- b" i' O( F. e
    for (sz_type i = 0; i < size; ++i) {
) L1 {2 S& ^- X) p( Y7 F        int a = hexCharToInt(vec[i][0]);
3 a. O% F4 s/ w* O( M        int b = hexCharToInt(vec[i][1]);
. t3 ~- g! Y# j        out[i] = a * 16 + b; ! h2 a; P* ~& K! A$ q
    } % q) p3 `' x& s( G7 ~9 J, J% @
    return size; 9 [, x* h% r* l% U
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
# \1 s6 y  [# v/ ^5 D% H9 l( c#define TEA_H
+ L) j$ Y; X  u) f( d , a. _0 I+ q$ j# L9 o; s2 F4 c
/* # @4 [" t1 c# z  `1 H- ^1 _
*for htonl,htonl
& M: V0 T0 S; n: Q*do remember link "ws2_32.lib"
2 ^# e' d% C: L. ~0 M) X& \*/ 5 `0 ^) }: ^. i% O: _8 {% t& E  }
#include <winsock2.h> ! ]5 W2 s/ V# a& ]9 |
#include "util.h" : e8 ~. `3 S! N' [
: h* ^3 e6 d0 W+ ^1 n1 ?
class TEA {
) Q9 ?7 K7 a; y7 }9 r( Z9 F) E) Vpublic:
. C: D; P( D. T* J* X    TEA(const byte *key, int round = 32, bool isNetByte = false); + |  p7 O5 C, a7 i  ~
    TEA(const TEA &rhs);
. `' e* N5 v6 a  X; Q( _    TEA& operator=(const TEA &rhs); ! d9 _# t8 o- g! [
    void encrypt(const byte *in, byte *out);
# ~8 a5 t, b9 D/ j5 Y% S( r    void decrypt(const byte *in, byte *out);
' I  z0 F+ I! Nprivate: 0 x5 F7 R; X  b2 N' X- I. {
    void encrypt(const ulong *in, ulong *out); % \( w  Q4 D8 V. t. i5 X
    void decrypt(const ulong *in, ulong *out);
! S% Z/ u7 A2 a- B; N7 a    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } ) ~5 O4 j, n0 B  A0 q2 ?
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 0 w5 ^7 U" n3 d. Z
private: 5 ?0 g2 G- t5 E' E1 }: S
    int _round; //iteration round to encrypt or decrypt # J( X* v" G4 @8 b4 \
    bool _isNetByte; //whether input bytes come from network
- D6 i7 l. M. X1 U6 M1 E; l  g# z, ?    byte _key[16]; //encrypt or decrypt key ( s+ b2 C' y* [9 N4 k( U6 Y3 T
};
# Y. r, d  B2 ~  P
+ K! G3 w/ [' V; c! ^4 [#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
# f5 T$ i. u4 A! K8 p 2 #include <cstring> //for memcpy,memset
2 o7 a, {$ |: E3 [ 3  4 H* k* ?# r9 R7 g/ w& W
4 using namespace std; 6 B/ c; I! j3 C) }
5  
7 G: P" o. Y  }+ \% `4 T& W 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) / Z& J  V) H2 r( r$ K1 T3 Q
7 :_round(round)
, k  B. |( D! q. X  } 8 ,_isNetByte(isNetByte) { + }6 l; o- g/ S' W
9     if (key != 0) 5 a: V+ k! l6 K" u  i
10         memcpy(_key, key, 16); 6 b9 w( e0 y- u% Y
11     else
2 i5 F, `$ M4 K; u! C" B12         memset(_key, 0, 16);
' h, M% x+ K3 d13 }
6 Z1 Y1 v" l4 {) W- {+ t7 ^14  
+ W; }& h& f$ t( [: K  ^2 Q15 TEA::TEA(const TEA &rhs)
: {% Y  w  p! j4 K+ X& A' w16 :_round(rhs._round) ; o  }8 s/ y: w$ ?. i" _0 |
17 ,_isNetByte(rhs._isNetByte) { . |, z) x1 P$ X" Q( ^% c1 t5 e& Q
18     memcpy(_key, rhs._key, 16);
* ~$ u! r  F$ N2 w4 _) ?19 } % }9 c! {& q% `& z( r2 A
20  
) Y" d- r# T$ {7 c) ~. Z  C! x5 N21 TEA& TEA::operator=(const TEA &rhs) {
1 t4 B; i# C8 O1 y, l0 Z3 L! [+ r22     if (&rhs != this) { 7 N: Z; v. h7 E. G. G
23         _round = rhs._round; % O7 h1 [5 g; E3 Y* }- o& M
24         _isNetByte = rhs._isNetByte;   o, z- B% ^4 L8 U6 S
25         memcpy(_key, rhs._key, 16);
5 Z6 p6 ]! o1 F; x" a( E/ J26     } . ^, I- B4 t  N! t& p' C  |
27     return *this;
3 s; A# X  z0 k3 r4 B28 } * R( T! c8 M% C% Z+ P( v
29  
, M* q: n& r5 A7 s# {) B% B30 void TEA::encrypt(const byte *in, byte *out) { 8 W* {/ u, B9 F
31     encrypt((const ulong*)in, (ulong*)out);
" J3 [# z  ^6 I, Z  S* m8 b6 H32 } 7 x  F+ Q0 q, [, [6 o  c
33  8 V* j3 L+ ^0 C3 |  `
34 void TEA::decrypt(const byte *in, byte *out) { 0 }0 p7 T' C5 N% y# [7 E
35     decrypt((const ulong*)in, (ulong*)out);
9 H& w( k  W# O5 l36 } * B: c4 _) {& [2 W1 L; S, X2 G
37    Z7 D* r& Y0 j0 h1 d
38 void TEA::encrypt(const ulong *in, ulong *out) {
% r9 J% ~8 t% s! }39  
& B. ]1 I- r9 v' k40     ulong *k = (ulong*)_key; # V3 ^+ K. S7 ?: a3 D3 w. P1 \
41     register ulong y = ntoh(in[0]); # _: q( q( i0 u4 ]* W
42     register ulong z = ntoh(in[1]);
! ?' i: m& Q. h3 U/ @7 {* J' {43     register ulong a = ntoh(k[0]);
( W/ S! D% R4 n5 P8 x44     register ulong b = ntoh(k[1]);
* {0 }2 g* J- R. i" z) \0 d45     register ulong c = ntoh(k[2]); ) R9 k! i. o% |# k* ^& G# ?
46     register ulong d = ntoh(k[3]);   f/ D9 J& H4 o1 _/ W  M) E8 g
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 5 k5 _  ?; l; x9 `7 G5 K
48     register int round = _round;
4 m- {2 h& ~6 R2 B- \1 n! t. ]49     register ulong sum = 0;
4 ?; f, M3 o0 v8 k8 {( a" i50  
2 d& p; l3 W( D( K& d, q51     while (round--) {    /* basic cycle start */ 9 J9 b' c0 n4 n* p( r' G
52         sum += delta;
- U- Y4 f6 T  M& I" ^53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 4 x2 L4 I7 j# C
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , b" z  D, q" S4 S  n, M
55     }    /* end cycle */ 9 w( j7 y- Y2 `/ b5 y0 ?) g/ d
56     out[0] = ntoh(y); " h& @' F+ F6 C- W3 ~! o) T
57     out[1] = ntoh(z);
# K4 [/ t3 K/ w4 D58 }
* @* e+ b% F! M) H8 A  d) h59  
! ~5 L2 _! f; V! }60 void TEA::decrypt(const ulong *in, ulong *out) { ' e. f$ a5 S, n( I5 s. H7 H
61  
9 Z$ B: T0 u1 R7 J62     ulong *k = (ulong*)_key; 7 {1 [2 N# u5 |* E
63     register ulong y = ntoh(in[0]); - S" b' N% Y8 r1 `9 |& `, W0 Y
64     register ulong z = ntoh(in[1]);
# i" |& ]& v8 m6 R1 ?0 O4 Q; q0 T65     register ulong a = ntoh(k[0]); 1 a! t- O, [  }
66     register ulong b = ntoh(k[1]); $ a& d: J- t( m9 y
67     register ulong c = ntoh(k[2]);
4 `; l9 C7 b6 R2 k0 g68     register ulong d = ntoh(k[3]); , {2 `) O, c0 o) ^
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
0 m& z9 h; O3 |- b6 u6 v70     register int round = _round;
/ l7 f  Q1 o+ f4 [71     register ulong sum = 0; ( j- w: m  _' ]  A# B
72  
- t9 M; `6 f$ e3 j$ Q73     if (round == 32) ( n- q$ I1 N! O3 Z
74         sum = 0xC6EF3720; /* delta << 5*/ / y( \. c* W7 F4 H: |- Z
75     else if (round == 16) ) ~3 K( d5 G1 n- E; F9 n. G
76         sum = 0xE3779B90; /* delta << 4*/ ' x! w% e$ V# \
77     else * {6 y! b6 S0 }
78         sum = delta << static_cast<int>(logbase(2, round));
7 R9 H! ?7 Z2 \& m79  . A7 @. Q& N  c. P
80     while (round--) {    /* basic cycle start */ 9 g. I% w" N; H9 k
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , x* `+ B" }! _  V+ b' C7 F2 [* ?
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
2 [1 L. h/ Q8 X83         sum -= delta;
. p4 ~" ^7 @4 q' t  ~1 a84     }    /* end cycle */ " s3 E/ ~/ B# E6 m7 e) u
85     out[0] = ntoh(y);
0 p9 o, M3 e$ r: Y  e3 }$ o86     out[1] = ntoh(z); % d+ L: n" r& s3 T( ?& |
87 }
- U& S0 O% [' S! k+ R
, @- h. a* e1 p7 b! ~" u需要说明的是TEA的构造函数:
8 Z) @" ~4 e+ J7 w7 W3 g- J$ k9 S, gTEA(const byte *key, int round = 32, bool isNetByte = false); - M+ e: p  D% y; t2 s% \, E
1.key - 加密或解密用的128-bit(16byte)密钥。
9 W  B" O4 k0 W$ O0 D9 r! n3 C2.round - 加密或解密的轮数,常用的有64,32,16。 7 O" i% R1 G5 j* l
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!   |9 J" u  S0 Y5 e7 N; {

" R- l/ D, \4 i最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" : p, ?  G7 g# F* S$ x; Q. T
2 #include "util.h" : p3 T9 K; `# g' a% ^
3 #include <iostream> , A3 j& U+ F' z/ G7 R$ N( C
4  $ d+ a! @; F/ {6 A* {7 L% B1 d/ t
5 using namespace std;
9 L* }# }% k+ D5 M$ m. N 6  # j, S7 y0 q5 ^; V3 V3 x
7 int main() { ; L& g; X5 T2 r2 E
8  
) v3 m' ?2 i  p: M4 t+ w 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); - N% n' Z' c& _5 H" _' _# X/ ~- K
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); % @0 G& W$ @; l# o
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
9 w& `/ Z+ c) y9 N4 t/ U12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 7 U! y" R$ }2 U
13  
7 u9 q# L9 j1 u0 U  \6 Q+ Y14     size_t size_in = hexStringToBytes(plainStr, plain); # S1 e: R8 o( w# ]% Y
15     size_t size_key = hexStringToBytes(keyStr, key);
! W4 @' l8 ?2 |+ P1 E2 O8 I16  
; r, O8 f9 r3 g) W* w+ q17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
6 p# A4 E2 A( O& m5 c& H" F18         return -1; % h; Q5 N8 h  Z, l" ^% `- K  N( ?3 A
19  
2 X8 m1 b9 n: m( \9 J1 w20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; , d6 z) r( E& E2 V" h4 e% R3 M: ~
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; # T5 b! o! N- l* Q& s
22  6 @4 i# M8 P) [1 \: B0 j
23     TEA tea(key, 16, true);
* T1 z3 ~, ?' ?+ o, F' n24     tea.encrypt(plain, crypt);
' x+ @$ Y% e& n+ L- J25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; * ]9 S) l- ~- U& {2 x: G
26  
4 S: Q2 Z0 _9 `" n( {0 ~27     tea.decrypt(crypt, plain);
6 M0 d# \3 g. o$ ]( V; A28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
. C9 B% n/ t) @3 c4 o29     return 0;
1 P6 d5 e! ?  W$ S/ a2 c, y% }4 e6 \30 }
9 T# f. F+ [4 w  O7 H, X% M; l" o# h
2 u% x2 `) s& r7 m/ Z; g本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx+ t( @% L# d; `$ \3 t
运行结果:
- Z+ k  x2 n8 K. o: MPlain: AD DE E2 DB B3 E2 DB B3
' u5 ^( k/ z. P5 ZKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
% P$ d0 W2 Z9 SCrypt: 3B 3B 4D 8C 24 3A FD F2 ( {, C: W7 x; h; A* a
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 13:09 , Processed in 0.023998 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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