找回密码
 注册
搜索
查看: 38827|回复: 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轮):+ r1 u* g1 b$ y
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ( c. O+ |* I! [; t% Y0 E7 ^
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
5 \. u) A, a( E* V/ W7 P8 O2 E9 O5 ]之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
2 Y7 M5 x/ p$ n, f  F在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
: W7 L' P6 @. l5 y% u$ [在 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. : W' z5 h7 j8 _# U8 ~
  2. void encrypt(unsigned long *v, unsigned long *k) {
    % ?7 m1 v2 D1 s8 B6 l1 z
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    7 T* X1 @8 K( ?, I* |, I4 A
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 6 w/ p# n7 C  W; k
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    # p" ~6 S) n; R5 H8 E, q, ?# x
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    # p3 U5 K! n: o# Y
  7.          sum += delta; . n4 Q7 `# Y4 w" l2 |
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ! x- n. j; N# o7 c
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    & g. s; M; ]2 P9 k
  10.      }
    7 F$ X( b% Q3 Q
  11.      v[0]=y; $ v8 l- x$ y. c4 Z. e" c$ U
  12.      v[1]=z; 6 o  C2 o' G. ?
  13. } 7 i" f7 t* ~  @4 o5 m5 q2 b. w
  14.   
    , Z6 ?# C% u+ J& X0 e( b) y
  15. void decrypt(unsigned long *v, unsigned long *k) {
    - i2 H, V4 ~: v- `& w; p
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ $ @4 [. d. [- x' S* e2 ~0 k
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    1 i& @: |4 T7 i2 F% N: j" ]
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
      F, [; E7 @8 s' U6 B+ x0 Z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ) a5 y1 q6 V  s: k
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ; s, f5 A8 Z+ |9 s8 G4 @; G
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); / `8 D- S# a; X
  22.          sum -= delta;                                /* end cycle */ 8 b8 U9 c  D, R* K8 ]9 i
  23.      } 1 t7 K8 ?- ^' O% V
  24.      v[0]=y;
    9 g3 Y$ S. O$ `% `2 C$ b  a) X& b: B
  25.      v[1]=z;
      B; e; I0 k. c! X
  26. }
    / R/ X' C9 M+ B/ U! L
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
" U  _8 P2 {" }! U8 S9 H$ T/ d#define UTIL_H 6 K% r7 S: i- D$ e8 u( L

* w/ s4 B- x6 `#include <string> 6 Z7 D$ O# ~* \8 o# u- J
#include <cmath> ' x1 g4 Z( c0 k  H
#include <cstdlib> & y6 S0 D. h: c. p. A* t
/ M" U  R4 W* x- @8 f9 H( R* A6 h4 D
typedef unsigned char byte; 5 h' |! ~( V$ X  y
typedef unsigned long ulong;
. X& t5 Z, }" b6 y7 r  @ ; u% O5 W1 ]* ?6 h
inline double logbase(double base, double x) {
* k, y. B' F5 H, o1 ]    return log(x)/log(base); 8 I3 z3 p0 q6 a) S) v4 C& Z# d7 |
} 1 @' p0 E5 k! [' v, l
" [! s3 W9 [! d  k( f; A1 Y
/* # g5 r) k. R" i2 d7 Q, U6 h  a3 |
*convert int to hex char. 0 E. H1 ]# ?4 a' [4 k; f
*example:10 -> 'A',15 -> 'F' + o& P  `, a* F* d. K: T# ]
*/
# I; n# H7 m. A- t7 }7 |; F$ S+ R* echar intToHexChar(int x);
9 W5 A2 l+ p' s 4 z# _0 G* b- H9 {* i- _/ o7 j
/*
+ G6 c  q9 H+ f4 \1 J+ J) B  H*convert hex char to int.
* j4 j4 c$ R2 y8 l*example:'A' -> 10,'F' -> 15
8 B, j: f+ _4 n! R1 a: A4 S5 R& F*/
9 C5 l" H8 _. R7 J+ Z9 Nint hexCharToInt(char hex); ' F% @' D: C  m' E% s
. V. L& n9 g, E, a8 }
using std::string;
* u1 }- ]' o% ]8 D/* 0 H# H  y* Z$ X" K$ Z
*convert a byte array to hex string.
; F1 ^1 p$ d) M, G6 u6 G*hex string format example:"AF B0 80 7D"
9 ]2 m0 X; k: f3 Y7 J( s*/ 7 C1 H! s7 Q* b% |6 y( d1 |) q9 r
string bytesToHexString(const byte *in, size_t size); " v. o' W( M! @

7 I9 k7 s; l! C& v6 ]/* 8 i1 ~+ t( a6 p2 W3 ?, z
*convert a hex string to a byte array.
$ h# h$ b! k' }8 ~*hex string format example:"AF B0 80 7D" 2 b  T0 G  U( k
*/
$ p' B  |) O$ u- V- b8 [$ Wsize_t hexStringToBytes(const string &str, byte *out);
/ W5 q- B0 ~! e, \# N1 a   ]5 l0 H3 Y) D2 d
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ' {1 V1 Z% S" i6 W  g/ N# t2 i9 Q
#include <vector>
  J6 w4 P2 k3 m2 G4 ?   `! ?9 j: o# p
using namespace std; 5 r  i3 v. q. G6 c2 w  C  O
6 k; Z5 w3 ?* v' l$ n. F1 R7 _
char intToHexChar(int x) { ) ~. ^1 g  }- C& {0 @4 V
    static const char HEX[16] = {
' e5 C& V& [4 C  Q        '0', '1', '2', '3',
1 v/ B, g) Q  e2 c1 \        '4', '5', '6', '7',
0 {* }' s" r7 P/ s        '8', '9', 'A', 'B', / {3 h9 q% P2 Y/ e5 E# i
        'C', 'D', 'E', 'F' / i7 G  a3 v  Z5 A# Q- R) s7 l
    }; / Z4 K" ]; e* J$ q$ T  ^
    return HEX[x];
* {% ?7 `4 H0 o$ x3 x0 r} # X9 e" ^3 `0 @1 R. V# ^5 h" i  X

* l1 q4 p! D% M' v+ O. q% [, dint hexCharToInt(char hex) { ! _5 E% K- C: a) C& H( V
    hex = toupper(hex); 5 i7 U; H6 v! @- F. r3 ?- a. v
    if (isdigit(hex))
( i) z% t) S+ k6 {2 v9 ~# W        return (hex - '0'); 3 \; i+ k& y1 F% r  ^$ U
    if (isalpha(hex))
' J0 C9 Z1 H: _5 F; j, L        return (hex - 'A' + 10); * L) U3 x/ d) N' z$ D, D. S0 d
    return 0; ' _* r, c2 p8 b" m3 t5 g
}
: A2 t% X* i1 M! G  O 7 ?% d$ J) U2 }/ P1 T9 M
string bytesToHexString(const byte *in, size_t size) { + y+ |& N+ ^4 |/ Q' T
    string str;
+ H5 C) i8 _- H2 ]. s+ w, Q    for (size_t i = 0; i < size; ++i) { ! V. ^2 v  U, a4 e
        int t = in[i]; 2 H% E: G' Q+ t; f9 u6 J
        int a = t / 16; ) ]8 z( ]1 L7 V5 g* ?/ p4 N8 L
        int b = t % 16; 5 E5 U5 c6 l$ k! _" v
        str.append(1, intToHexChar(a)); ! _9 `0 V6 B! }6 {; \! B
        str.append(1, intToHexChar(b)); ; n5 z: P  z7 x5 X' p6 S
        if (i != size - 1) . V3 z' e, V, L( G- y
            str.append(1, ' ');
/ M# f/ s9 e! V2 F: _  j1 U    }
6 M0 t5 d, p( z3 }6 F7 a    return str; # E! x+ Z9 m6 Y4 }$ r( ^, o$ N
} 3 ?# u4 [# E2 p

0 ?3 ], @# z7 ssize_t hexStringToBytes(const string &str, byte *out) {
! q9 f- }" E, G0 z2 `
- T/ u, B9 t' t4 r+ J    vector<string> vec;
) X5 S: k! a4 z2 ~( v/ G0 c    string::size_type currPos = 0, prevPos = 0;
6 f9 ~% z0 [0 M6 w& j9 y# {    while ((currPos = str.find(' ', prevPos)) != string::npos) {
" Z: S6 R2 F3 y+ k0 g* T( u        string b(str.substr(prevPos, currPos - prevPos));
& R; Z7 P9 O+ l! ?2 M- [. f  l        vec.push_back(b);
' M2 @& m2 g/ a+ g( `2 Y        prevPos = currPos + 1; " d1 r$ v& D0 T( I
    } - C* Q, ~5 P/ `6 G8 C1 [( B
    if (prevPos < str.size()) {
* p" H; o7 b+ ^4 F        string b(str.substr(prevPos)); 5 V# T( A) p1 m0 L
        vec.push_back(b);
# H5 a$ E/ o- u% a/ j    }
5 Q7 _; s1 D& h    typedef vector<string>::size_type sz_type; * t- ]& A! z; i: K" p0 l/ `) I
    sz_type size = vec.size();
8 H! H, Z& Y6 V( ~) b& l+ v    for (sz_type i = 0; i < size; ++i) {
/ L- ~. v: r& S& {7 W0 x2 W/ r        int a = hexCharToInt(vec[i][0]); + i6 L& ^4 S5 z
        int b = hexCharToInt(vec[i][1]); 2 H: g( b9 n/ B4 A
        out[i] = a * 16 + b;
3 ^8 U8 A$ `9 L1 N    } 2 ~% S7 y% t6 A# i( H2 ~( C
    return size; - H; ]; ?$ f! [/ ^$ P
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
& x3 e7 l: p3 k. J$ N2 J#define TEA_H 3 r3 s3 b' M2 e4 z% }+ P* _

2 G# q, R2 S7 n& L/*
$ o) V7 @* i7 R- Y6 W4 C*for htonl,htonl
8 M; M7 l; R1 ]; ]) V8 ]9 i7 m*do remember link "ws2_32.lib"
* w0 x, j% F/ N7 m5 ^*/
$ O+ [' h. K( L#include <winsock2.h> & u/ k- S( ]0 B# P2 f
#include "util.h" + |0 H8 \# G" K0 u! z% `0 `3 [) ^

( [5 o" A7 K7 c: h  zclass TEA { $ [$ M9 S# @1 v( \7 F4 w
public: * J0 K. m& f4 b  A; k: H
    TEA(const byte *key, int round = 32, bool isNetByte = false); $ N( c7 _( l( H0 T2 p: \4 T
    TEA(const TEA &rhs);   W# ^+ j) J8 @
    TEA& operator=(const TEA &rhs);
6 l. f" a+ ]/ n2 @! Z0 Z4 n    void encrypt(const byte *in, byte *out); : G6 \" w: R8 V& z6 w* o0 Q
    void decrypt(const byte *in, byte *out); 7 @" W8 e9 ]% }( R3 A: _) p) v
private: $ y& K! z& `  p; K9 R5 P
    void encrypt(const ulong *in, ulong *out); 7 L- H8 l% c7 `+ ~! o
    void decrypt(const ulong *in, ulong *out);   b" \( b3 s2 F. F1 k0 n$ s; J
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 0 {: b1 c" U5 L+ j
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
3 @( b6 F; z) A. hprivate:
2 c8 c6 ^1 P, H; K6 q    int _round; //iteration round to encrypt or decrypt & ^3 Z! H8 g# T+ R0 |2 z
    bool _isNetByte; //whether input bytes come from network
+ f# }7 `7 Y( A# o; z1 C    byte _key[16]; //encrypt or decrypt key + a. C+ N4 d+ ~0 S
}; 8 D/ }2 X) P; \. L" s( m4 u8 }0 I7 @

: w" X9 ^% [$ }& q#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
6 V6 P! g3 |4 c1 j; G 2 #include <cstring> //for memcpy,memset & u1 x) l1 ?- m/ g8 D1 ~
3  
( g' j: }' y. k) ] 4 using namespace std; 8 n8 U# I2 g% J. {3 x% N6 u6 f
5  * m% R7 \- O/ Y4 Y7 c
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 6 q" _( |6 ~! i9 \: _
7 :_round(round)
& s1 E3 L' ?  \$ ^ 8 ,_isNetByte(isNetByte) { 8 ~3 o) Y6 G( a7 N' |
9     if (key != 0) 6 {/ }6 d; @1 N; r9 |7 T3 L+ v
10         memcpy(_key, key, 16); 2 f6 R6 x' R' D4 V5 Z& ]
11     else
7 F% s6 t, \6 Y6 d* ~1 z12         memset(_key, 0, 16); , `/ m  F0 N  X- p
13 }
2 D8 i7 M. }: ?5 y& s14  
( ?8 L6 J2 L6 v; }# o+ s15 TEA::TEA(const TEA &rhs) " d2 @& T4 k2 m4 |6 V; h; }3 R
16 :_round(rhs._round)
- [, q1 K: b) R% l! b& E; w5 N( }17 ,_isNetByte(rhs._isNetByte) {
% u2 }. Q3 M6 ]18     memcpy(_key, rhs._key, 16); $ j- U" o0 m9 W! u* M$ L9 n
19 } . g0 i6 E8 z9 N+ v/ t
20  7 G5 N+ O1 X4 `4 _5 X0 S
21 TEA& TEA::operator=(const TEA &rhs) {
9 h- F' y9 I4 A2 K22     if (&rhs != this) {
5 p0 x. w# ^4 g5 a23         _round = rhs._round; & ]3 J# d% S7 l2 b# u
24         _isNetByte = rhs._isNetByte;
5 a% V+ u" [+ }2 k" T25         memcpy(_key, rhs._key, 16);
1 j% }* \' [3 l3 v5 s2 n& y26     }
  M9 X9 j- u5 Z. z27     return *this; / {% }) H9 Z: d. {& y
28 }
4 ?3 j) L0 n0 ~& ^5 V1 A/ x- S29  1 b5 }! J3 |8 B3 ]# s
30 void TEA::encrypt(const byte *in, byte *out) { 9 q2 V. M! f8 E$ p: n
31     encrypt((const ulong*)in, (ulong*)out);
# J: d9 d; B, O3 M5 L% e2 Q32 } 6 E/ u' J. O" I5 E5 U2 w
33  
, T- Q, O. [, O: c4 D+ S7 g34 void TEA::decrypt(const byte *in, byte *out) {
3 |/ L, o" K: k35     decrypt((const ulong*)in, (ulong*)out);
- A9 n& @' D' ]0 B+ u  T* \36 }
2 ?( O8 r6 r2 {. K" H37  & l- d' g+ U# w7 H. i
38 void TEA::encrypt(const ulong *in, ulong *out) { 2 C, y) H2 y. G! V/ h- P- C
39  
+ T4 g- o# s' j+ _40     ulong *k = (ulong*)_key;
5 d* |  |/ _$ _  u) ^6 F% C41     register ulong y = ntoh(in[0]); + a& a0 @# c4 J; n$ H2 s
42     register ulong z = ntoh(in[1]);
4 M& `" z0 u+ q5 y( a43     register ulong a = ntoh(k[0]);
6 O! ^: J3 W7 F! h1 m; e4 u: K1 J44     register ulong b = ntoh(k[1]);
, P% `& J* S3 y) o; V45     register ulong c = ntoh(k[2]); $ R0 c7 Y/ }! I% F! K& X4 {
46     register ulong d = ntoh(k[3]);
% m3 K% z, Q- [4 h47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ / V2 A" [/ V7 [+ x; C
48     register int round = _round;
& V/ E9 o1 q% r49     register ulong sum = 0;
* ^7 ^/ m" m+ X50  - a$ z8 L* U2 F
51     while (round--) {    /* basic cycle start */
& u$ J0 n2 B# w8 Q5 e6 `52         sum += delta; ! R' d6 h8 b/ t2 ]7 x4 j
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
3 @/ w7 ?9 I: [$ m* W* M54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); + \; M- `) ?; B2 {% t( [$ a
55     }    /* end cycle */
  i9 D) r# x$ n- r" ~( R56     out[0] = ntoh(y);
! L, W! n% `6 g1 }9 h4 |1 z: L57     out[1] = ntoh(z);
: N  n0 I4 a) }58 }
/ X9 M& [  o# e9 f59  
' r" y& J3 B3 k+ s0 b60 void TEA::decrypt(const ulong *in, ulong *out) {
! C$ [2 ]  M( j* [61  3 f& F2 y' }3 \* q. }1 {1 }
62     ulong *k = (ulong*)_key;
. J! ~1 x: q& ]* `63     register ulong y = ntoh(in[0]); & F% j  z+ E3 U/ j: m' g# U3 g* _
64     register ulong z = ntoh(in[1]);
; H2 P9 s: T$ T65     register ulong a = ntoh(k[0]); ; h: b/ |* c8 ^! d% k; v- o
66     register ulong b = ntoh(k[1]); 6 k( @) f4 E+ G9 [; d  r
67     register ulong c = ntoh(k[2]); 5 S1 z: Q4 A$ v  Z1 i0 b' h
68     register ulong d = ntoh(k[3]); 7 N1 A5 B1 p0 s) C  j' r- g
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 0 z# I6 g6 Y7 F- ]7 H5 t  d: S" Z
70     register int round = _round;
# |& P+ d+ s9 `' F) Q71     register ulong sum = 0; 4 M% Z2 n* x$ _0 S8 L
72  & W; L( _& S) [& S
73     if (round == 32)
3 K1 N! Y, Z; @0 J  L; Y& V74         sum = 0xC6EF3720; /* delta << 5*/
" l) j- u4 m) ?$ \' a75     else if (round == 16)
- H# L4 ~8 K, ?5 w; Q' O% H76         sum = 0xE3779B90; /* delta << 4*/
' t7 v) |: u, K, R$ u& R77     else
; A; \. P2 M7 l! @" p6 o4 _78         sum = delta << static_cast<int>(logbase(2, round)); 3 [1 n$ F- g* r( W" X' @
79  
+ j. w7 n( q  l& H" n9 Q% H80     while (round--) {    /* basic cycle start */
5 `9 \6 F; a3 f! m6 d2 N! z% c6 U4 A81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
5 d" V& {3 n: i. s& P% s3 O4 w82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
  m  y% j" ~, H3 k. R9 ?83         sum -= delta;
/ z) ~. X6 k0 I& ^! I) D1 \+ Z$ u9 A84     }    /* end cycle */ & K7 |4 a9 d2 X0 @; U% v
85     out[0] = ntoh(y); * R. Z" I( e& r, O8 y2 J+ A' @2 j
86     out[1] = ntoh(z);
  W/ x6 h0 Y" Z' [7 C  S; g87 }
% b6 ^+ I, c3 T/ Z+ r  v
- @4 f7 @* a# U$ e2 `" ~2 [) U需要说明的是TEA的构造函数:
) a! z# C/ R: n, d4 e  oTEA(const byte *key, int round = 32, bool isNetByte = false);
% T! `1 p0 Z5 w2 q1.key - 加密或解密用的128-bit(16byte)密钥。   N* {* ]/ j5 n) F* E7 t
2.round - 加密或解密的轮数,常用的有64,32,16。 7 x, r) ~2 m6 r* L+ q
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 8 C+ |6 \$ m0 ]! P; N

; T1 I, A6 Y5 z. t" A, @4 x# q最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
8 [$ D) ~! M$ s 2 #include "util.h"
- R, v; P+ l4 k; r8 ?: T 3 #include <iostream>
+ ~  C: G# i/ l& i. L4 s' c 4  ' m; H+ z& e$ p9 A9 ~6 G
5 using namespace std;
8 r4 K* X* ?6 H, L" Y 6  # ?/ i& n% f# G5 B$ O/ C  a
7 int main() {   b/ O/ l$ V# D& P- d
8  ! T3 X! n/ h2 M6 x% Y
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
- ]2 Q* ^" V- g  Z' }10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); . U# Q3 F# ~: m; {$ ]* H
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 3 E, I, A1 D3 l% k8 z
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ! P+ H; L( {. x7 M
13  7 y% @& o0 _9 U( a2 r7 v
14     size_t size_in = hexStringToBytes(plainStr, plain); , t2 v; W" {$ _
15     size_t size_key = hexStringToBytes(keyStr, key);
1 L0 m( n! a' n. A" L8 b0 r& q16  
- Z" Y( N& \/ v17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
& Q" y- x6 W2 ?( `* w. b18         return -1; ( }" ]7 r4 O7 w; p# {9 l
19  
0 ^# Y+ H+ i6 M1 K& ]20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; # s7 n+ |4 @4 m; j1 s
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
9 V# b' A( X0 g3 w22  . I7 H/ h9 F8 i0 ?! v: j9 h9 g3 x
23     TEA tea(key, 16, true);
% K: \/ y8 a' ^' D4 F) Y24     tea.encrypt(plain, crypt); 1 c2 b- R# w9 \) G
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 3 ~( V! ?8 J: P! R# x% X7 v
26  ! S2 {! n5 c2 A8 W: U. v# {& O4 V. Q
27     tea.decrypt(crypt, plain); - G% g: J* L$ K' [7 S4 `
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; - q4 y- J4 T4 x# M9 U& s
29     return 0; ! f1 D$ P  f: a9 w
30 }
/ U# {2 k% R' }7 R& Z* V: K
+ \  t) a" g% F  T本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
; W- Q2 H0 ]* O/ E! c' J. F运行结果: ! e1 u( K, P/ L% Q7 j8 V7 d7 D
Plain: AD DE E2 DB B3 E2 DB B3
' B1 x$ O) s5 F# K, hKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ; N' @2 ~" a/ T/ n
Crypt: 3B 3B 4D 8C 24 3A FD F2 6 k7 Y! h) k1 n4 J: V
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 22:31 , Processed in 0.019726 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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