找回密码
 注册
搜索
查看: 37662|回复: 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轮):% k8 v1 P3 i9 ]4 \4 p1 t
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
7 q  N: S( {( B  M' wTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 : u3 Q4 l% p" E0 m3 _1 Z/ D/ ?
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 * e* ]8 z+ D1 A& B+ g& c
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 2 V% t  J9 F+ v) w! n) i: Y8 j) E
在 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. " N; u5 K3 h5 P8 r8 S
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ' E1 ]7 U! `; \3 `
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    - b6 N3 l) N% z; \2 V9 e* x' B8 H/ T
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 5 T, h* T( V4 p& `6 q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    8 z2 l/ p9 Q* Q, k+ S; q% [
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ % f7 D- D; x7 \6 `# d. y7 Z
  7.          sum += delta; % R" f! A( {7 H; D- R. c
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    4 w" b# a+ T6 W" \/ d
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */   R$ y$ w' G9 r9 `
  10.      }
    3 ^- Q! m5 E7 `. O, o
  11.      v[0]=y;
    " p7 F, N! n+ p) |+ X: Z
  12.      v[1]=z;
    - Y1 y# r) ^. W3 J' M; _
  13. }
    / t- t' m6 u( g, B! H
  14.     G* X. Z8 f/ `2 L
  15. void decrypt(unsigned long *v, unsigned long *k) { ' f* U* P% O  E) O. o# A2 ^
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    $ D$ n, z8 m$ }5 f! z) y( f+ k
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ) t3 x7 y% H. k
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ * f. x) [" l" u- Y$ F6 o) O" \$ h
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    " }% L; H1 r6 A" H
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    + y1 }1 v4 M: f. K0 W) F8 ]
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 0 n8 k; o9 P; g. a6 V4 b
  22.          sum -= delta;                                /* end cycle */
    ) D) o0 `% ?2 e
  23.      }
    , g/ m) s. h  ]0 C
  24.      v[0]=y;
    ) W3 C  `& k* I. U% w% I
  25.      v[1]=z; + v" O. I4 w3 e
  26. }. P1 u" G. G, D2 e4 P1 E4 i
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
! y8 y5 n9 d2 a1 }" Q#define UTIL_H 0 y6 f' e% k( O3 g! t* }; H- I
$ f/ O4 @8 q( g* L# g) X: A
#include <string>
* F; M; B. h5 b0 n#include <cmath>
5 v  [" V5 E& i& u8 x#include <cstdlib>
3 z9 q2 ?* M' @# ]
5 C7 Y8 Z! @" b' y+ U/ r6 F/ atypedef unsigned char byte; 3 j4 X4 k! ?7 j* X
typedef unsigned long ulong;
9 S2 S( ?6 Y4 K, c1 Z4 a% l7 N) x+ w 2 z/ g; Q( X. E; X: y) P+ l
inline double logbase(double base, double x) {
0 Z' N$ F1 [, `, a& l    return log(x)/log(base);
% J) f+ c0 u6 J5 m: u6 z0 m& h}
! u- I2 z5 L) l8 A! p3 p
% j" I2 |& R. u7 _/* 2 }! D8 v3 p0 C1 _) N
*convert int to hex char.
- \+ \+ s& W; N*example:10 -> 'A',15 -> 'F' , n. s. R9 S9 O" j9 i
*/
5 u' F* c- d+ t" N$ G! o( Ichar intToHexChar(int x); - f* q$ g" @- f  }

/ J/ M' J) E. }7 \* o8 \/ I/* : ~2 I, B0 w, Q
*convert hex char to int.
" U" M( a6 ^% F0 a* ^# [! @*example:'A' -> 10,'F' -> 15   ^3 @& c( I2 a9 E
*/ ' V" K5 m* z# b" [8 ]8 c8 t: Z
int hexCharToInt(char hex); 2 ^; l. \4 X8 p

! B. t$ j9 A/ |0 C4 [using std::string;
1 o- m: K5 _# T. v6 {: Q, t/* 3 Y9 J; s% R2 W% c. U; R
*convert a byte array to hex string. ( H' Z6 M% L* l
*hex string format example:"AF B0 80 7D"
+ c4 \# F; P; }( {/ M7 l*/ 8 K* N: f/ o( Q& @# f
string bytesToHexString(const byte *in, size_t size); $ ^3 d- S* p5 H/ t3 D9 A8 ?9 d1 ^& h4 o

! t, H) Q' e0 q/*
$ X8 P& B  s3 d7 t3 }- i*convert a hex string to a byte array. , k% V- Z% |5 Q$ g: F# n0 ~
*hex string format example:"AF B0 80 7D"
9 l7 k* _, f5 e  r8 c8 n3 Z8 y4 r, C*/
" J' ], a: x& P! E  Bsize_t hexStringToBytes(const string &str, byte *out); & h: m3 f/ f- x. h  @! c5 Y

# n- K/ q5 S  c  b#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
: V( {$ J/ o3 X' ~: Q#include <vector>
* ~* |; Z$ o, e9 R$ B- H 2 }7 M, f- Z/ M/ D2 u. ^5 M5 H
using namespace std;
9 Z- s* ~/ e7 G( d  P% D & F% F4 M/ f1 z% Q5 G4 U
char intToHexChar(int x) {
6 Z2 B, i5 [$ D" c6 r    static const char HEX[16] = { 9 G% i7 G( Y5 J% k
        '0', '1', '2', '3',
- r& J! N7 B% @        '4', '5', '6', '7', : u( d, H* e* o) z* t- I
        '8', '9', 'A', 'B',
( k: p3 R: s+ Q        'C', 'D', 'E', 'F' ) y3 w% f/ u- }4 `! t
    };
! q! V& |4 X8 ~9 Z    return HEX[x];
& g4 W+ R  E) G4 h} $ f+ T, T+ a, L, Z. I
2 |5 {+ B1 A1 S0 P& t: A5 q. L" A7 U# Q
int hexCharToInt(char hex) {   f) j9 a' J1 t6 G! ~
    hex = toupper(hex); . Q" ]/ O* [. Y1 ~! w
    if (isdigit(hex))
; j% ~. r# w5 a3 e" a. D  G        return (hex - '0');
* @4 X8 T$ V9 a0 H+ {7 ^! l8 O    if (isalpha(hex))
- r7 T4 V5 \* Y8 L) w        return (hex - 'A' + 10); 3 Y+ g; `1 i( {* I
    return 0;
; n0 A7 ~$ C0 @}
4 b$ v; r' u" w 2 \1 [; d* Z- R& b9 x/ w
string bytesToHexString(const byte *in, size_t size) {
# w0 Y2 J" t0 A" ^    string str; ' m) P( M3 A# G6 J' p& i
    for (size_t i = 0; i < size; ++i) {
& L6 |& V* k9 u* |        int t = in[i]; 9 U# ^0 S- u4 ~* z
        int a = t / 16; 3 P' P4 a! H+ k# Y
        int b = t % 16; % J1 ~6 F  |2 Z# V
        str.append(1, intToHexChar(a)); & x; I/ \2 a6 y7 x+ k( R5 ]$ ~
        str.append(1, intToHexChar(b));
$ q  T' B1 b7 F        if (i != size - 1) 4 ]/ o1 i. ~- y6 ^2 Z, z
            str.append(1, ' ');
4 m2 Q# w5 O; [" m; T    } 4 h3 E) T3 x( D% p& e9 m  X
    return str; 5 T$ N* v/ h# b( e$ y: c
} ) h! @# M/ |/ r2 c8 w  |5 ?
1 v. N- }4 [: J
size_t hexStringToBytes(const string &str, byte *out) {
- n! i! o! F: n" j* F' X/ N
2 ]8 U0 I8 b& p/ N7 d    vector<string> vec; 2 F+ m- ^7 p& T. e* |5 l. w0 a) t
    string::size_type currPos = 0, prevPos = 0;
' L( l' U! Z$ k7 D& _4 Y# O4 o5 J    while ((currPos = str.find(' ', prevPos)) != string::npos) { & N; K" l, H9 ^5 G6 |0 @; q( d! [
        string b(str.substr(prevPos, currPos - prevPos)); . ~6 D' `5 k0 F# \4 D6 B8 f3 K4 o' ^
        vec.push_back(b);
; }7 H# @$ t1 G; l* I, ?* B6 K1 ^        prevPos = currPos + 1; 1 V) ^4 S" M6 a) ?( S
    }
3 n1 g% S$ F( h' D- C1 i. y+ h    if (prevPos < str.size()) { - N1 A) r7 O+ l" k
        string b(str.substr(prevPos));
: a9 B( F! N* V! p5 }        vec.push_back(b); * ]* h' y6 ~  c! Z, d6 y# H* L
    }
7 J% v# |/ g* p, K    typedef vector<string>::size_type sz_type;
3 Q; L4 ^: p! ?) o; m; Z    sz_type size = vec.size(); 4 H; C# V) K3 x# f( ^
    for (sz_type i = 0; i < size; ++i) { ( X) u9 J( N2 P
        int a = hexCharToInt(vec[i][0]);
, N, Z" Y# H* M        int b = hexCharToInt(vec[i][1]);
% L; U/ t4 D  b$ [) t2 l        out[i] = a * 16 + b; % J4 p% t. w- [, |/ t9 a
    }
% H# e8 a8 ]) ?4 d    return size;
, h! b: O$ P$ A* e+ s1 T}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 6 ~. S: k8 y7 b; h
#define TEA_H
; c6 u* e8 {6 W4 W5 m   ]& i4 h0 a9 Q  F3 R. I
/*
! y& Q/ x2 e0 N5 ^*for htonl,htonl
+ ^( D! V/ [! P0 h% i6 i/ z*do remember link "ws2_32.lib"
$ X% k7 I7 p3 f! ~" H  P2 j1 j1 q*/ ) n6 I$ K  x/ q) Z3 j5 n$ `
#include <winsock2.h> 6 z8 r7 H# e, u! `7 y  k! C$ J
#include "util.h" , @1 ?3 e% w# o) j' I

- c- N' @, Q9 L# d- g0 wclass TEA { ! N, J# ^4 J- H" o3 J  T, @) J: {
public: ! J6 [  J1 Y1 M/ M. c. ^
    TEA(const byte *key, int round = 32, bool isNetByte = false);
3 q) p4 _! e/ P# ?, D: I2 }    TEA(const TEA &rhs);
+ l3 u9 k3 a, }3 H9 F    TEA& operator=(const TEA &rhs); ! a; B2 v/ P% T' y4 G4 Q: Z+ D
    void encrypt(const byte *in, byte *out); " y4 k  v+ y( l$ d
    void decrypt(const byte *in, byte *out);
' O5 S* r* P- S3 i. q2 D. iprivate:
3 q. w' C# X  \, o. r; D    void encrypt(const ulong *in, ulong *out); 5 u9 z, T+ I% F7 Y6 ]
    void decrypt(const ulong *in, ulong *out); ( t1 E, p. _3 F. `; S
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
, }" q- T3 n  o' K/ s2 j    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
, X) U* I2 o4 p/ H/ `8 Xprivate: ) v, U- F* ?0 s- }& e/ |
    int _round; //iteration round to encrypt or decrypt 3 g; `' d6 [9 K. x) @9 y
    bool _isNetByte; //whether input bytes come from network
  S2 n4 b) g6 r& w    byte _key[16]; //encrypt or decrypt key
. t* R: N6 \* ]5 B! G: h! C};
# o: J2 u9 O7 n4 n# B1 { $ s" L7 H- O3 D# N+ d5 [( }/ X7 v
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
$ v) i: ^( @8 r4 h; q& @ 2 #include <cstring> //for memcpy,memset
/ q: G  {) p, R; l. M4 g 3  0 ?* t" A: }% y
4 using namespace std;
7 l- {: v; }% G# P) N. i. c7 k 5  
# ]* ^1 }( z" ?7 Y; ?9 q9 B$ H* G0 Q 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 2 k- O) F, _, t+ A0 x& I
7 :_round(round) - p* M9 M/ a- }, s- [+ Q7 m
8 ,_isNetByte(isNetByte) { ' o) R4 r0 m0 G
9     if (key != 0)
9 {, r- U( M  V- q) e7 R10         memcpy(_key, key, 16); 6 t# o) B) s1 r  ~! x4 |+ X
11     else ) o% u) I" k5 g; R2 x: k: t# _$ W" B( w
12         memset(_key, 0, 16); 4 V* W, C  d/ |+ i# X5 ]
13 }
( o5 [# Z" U. r8 m, F; q+ c14  
* M) r" P% p  I' z15 TEA::TEA(const TEA &rhs)
/ {" A3 b% D! P- p& n; M- D' y1 |16 :_round(rhs._round)
3 `! Q& R; [* m17 ,_isNetByte(rhs._isNetByte) { + y# u! [; |$ r& T+ s" F
18     memcpy(_key, rhs._key, 16); , S2 f2 ~/ V( R: e8 w# b
19 }   s: Z9 m, c2 |$ X1 Z+ U
20  8 m" g+ Q8 O* s; ^8 n
21 TEA& TEA::operator=(const TEA &rhs) {
# q& F/ h1 G9 G2 P22     if (&rhs != this) {
6 z' ~2 @  J' a9 ]23         _round = rhs._round;
: w* F) s+ p9 C% ^24         _isNetByte = rhs._isNetByte;
$ b+ y5 N& ?, p; e8 |2 t25         memcpy(_key, rhs._key, 16); 9 P7 E* P( V+ \3 O; i
26     } ) C; m( b  P& `! m: n
27     return *this; 3 ?7 v# X, b3 k
28 }
% [3 j6 I! M2 ]3 y1 I29  
. j) z+ m0 }  J! Q  a0 v4 g% s  k30 void TEA::encrypt(const byte *in, byte *out) {
# y* J, ^( [& W% f9 L$ y31     encrypt((const ulong*)in, (ulong*)out); $ P) w' Q9 E/ h, c
32 } 1 ?3 |( M1 x) \" f1 |9 v
33  
  G7 f# F5 v! C: }. Z; n34 void TEA::decrypt(const byte *in, byte *out) {   G& \6 r, E/ Q: ]8 s! @
35     decrypt((const ulong*)in, (ulong*)out);
- D# Y* b$ g7 T: B8 I1 G* N1 |0 q+ T36 } ; q( P! X2 O/ n+ c3 d: Q8 Z
37  
' r( h' G; X" F, r* `' E38 void TEA::encrypt(const ulong *in, ulong *out) {
: r: ^! K5 ^% N3 ^; G) l39  3 v+ y9 W3 S/ [
40     ulong *k = (ulong*)_key; 7 `' o- C1 ]8 [# c, |. `
41     register ulong y = ntoh(in[0]);
& D. K# e, M6 J42     register ulong z = ntoh(in[1]);
* j+ l) K- \1 B, W43     register ulong a = ntoh(k[0]);
3 K0 y9 w- u2 A0 ]6 \1 y2 a44     register ulong b = ntoh(k[1]); 6 h$ _, M: d0 t+ v; w
45     register ulong c = ntoh(k[2]);
$ ^4 [( q' G& Z" Q# K9 E$ M8 A+ K46     register ulong d = ntoh(k[3]); 5 r# N, ]* O' b: f5 p$ ^9 i1 i
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
/ C6 Z* S& c+ N  D48     register int round = _round;
; Z4 V) D/ J9 {" Z3 U49     register ulong sum = 0;
. f+ S( @" U1 o) k50  
5 v* f" P- ~' p0 q3 ~, C51     while (round--) {    /* basic cycle start */
3 y; t. S: ]& n, H" Z& T- t: o) @52         sum += delta;
: z6 p  h" W/ \8 ^- o/ m53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
! E% V4 c" I+ E# f! q6 ]1 B0 ^( q54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
, @; ~. S% J9 N: V55     }    /* end cycle */
) o0 L8 |1 s& f% l& `56     out[0] = ntoh(y);
6 O; \, V9 H: C' d& y# J2 F2 k2 ^% u57     out[1] = ntoh(z); ; |: {5 k( @* p, [5 A- W
58 } 5 X$ Q! g0 @8 h% ~" R+ W
59  
3 p# _" u. ]4 H2 O2 M5 N60 void TEA::decrypt(const ulong *in, ulong *out) {
2 O- I3 z* D: r  ^7 x0 h9 m61  
3 \8 k0 L5 o1 ?+ O62     ulong *k = (ulong*)_key;
- e8 C: J$ j, r63     register ulong y = ntoh(in[0]);
7 w9 O3 m9 Y' o. w64     register ulong z = ntoh(in[1]); & C( |' d- M0 y: R# T1 h
65     register ulong a = ntoh(k[0]); " O( ^: V% C3 H  O$ H; y$ N8 J5 L
66     register ulong b = ntoh(k[1]);
( F: I6 B3 N% Z* w67     register ulong c = ntoh(k[2]); - r* B$ A; ^" o# h
68     register ulong d = ntoh(k[3]);
/ t4 R6 f0 \0 Z, F9 y! @1 A69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ " U2 S9 \9 E" P' K) P
70     register int round = _round; ) f; P, X; D- }
71     register ulong sum = 0; 4 D1 h$ t8 V$ D7 X$ `6 f' ~
72  + Z" a* d1 k  Y
73     if (round == 32)
/ I  r* W. [- H7 Z" i' F8 `; G74         sum = 0xC6EF3720; /* delta << 5*/ ) [! |# H3 B2 Z: L& f& X$ r
75     else if (round == 16)
# f! }; m4 a! Q$ w5 [76         sum = 0xE3779B90; /* delta << 4*/ ) S3 ~8 f4 P% a- y
77     else
" T6 z1 a) h) c. s7 r& k78         sum = delta << static_cast<int>(logbase(2, round));
; P, l9 Y" G' g% B$ S' M) T79  / @# _% J. i# M2 {; I
80     while (round--) {    /* basic cycle start */ 4 K6 }' ?7 @) h8 {
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); : y& z  b2 F) z
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
, G* ~) E2 s6 }' ~8 @83         sum -= delta;
, S% g# P" T5 i" a4 s5 k6 _1 H2 ]84     }    /* end cycle */ 0 e7 E% }6 @: ]  l) q0 c
85     out[0] = ntoh(y);
% o6 q; i- R1 _/ f* Y7 h/ j/ {86     out[1] = ntoh(z);
* F, h7 l+ ?8 G% P; j' _87 }
& ]7 M  M( L, ?6 {* F
$ X6 `- ^, i) e# _9 Z# P需要说明的是TEA的构造函数: ( j7 v9 ~- N2 {; v2 c
TEA(const byte *key, int round = 32, bool isNetByte = false);
& P* U  C5 s  `1 T1.key - 加密或解密用的128-bit(16byte)密钥。
, x  i% V0 F/ n; O( a2.round - 加密或解密的轮数,常用的有64,32,16。
" y& q; t6 q1 u! L0 Z- j( D3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
; C9 u: h4 d* L$ m9 v1 t$ E$ P( t0 v& D. A4 g) o: j- M* U. ]% b
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
4 m2 m, A( K! V' f5 j 2 #include "util.h"   c  u( b% h% o6 J, J
3 #include <iostream>
* }; ]4 t" O" M7 k2 c 4  8 k. [1 C$ c: S* p4 }/ u" x
5 using namespace std;
9 O: L( M/ a1 v2 a7 Y: }. ` 6  
; J1 Q) x2 X+ D3 ^: L 7 int main() {
  j" z2 O6 V, g. b% X' | 8  7 _6 C: \. e0 P
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
, I2 m+ \1 i! {# }+ G10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ( P1 O% o8 P5 B4 O2 g' D4 Y2 L; J2 A& B
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; , v2 d! F4 G( ]
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
7 ~, J$ }" m" c13  
0 o, W  \! l4 N1 i14     size_t size_in = hexStringToBytes(plainStr, plain); 3 i/ M4 [1 T1 A6 e+ K
15     size_t size_key = hexStringToBytes(keyStr, key); ( I( r7 g; d4 l( i4 T
16  , L) X: b- m) _2 l/ V
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
( k! p( r8 f3 O  u, @+ q7 U18         return -1;
2 K! p1 _0 C* E19  
& l5 j: Z! y2 s6 p. d1 W* T20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
4 o2 d) a, ?% W7 s" U2 ]2 U21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
) A# s) Y0 I; @( X  S& o* |( z22  3 K" K; M, r2 ~& N
23     TEA tea(key, 16, true);
4 m" A- c6 p& f+ n9 R24     tea.encrypt(plain, crypt); 8 _# \; g5 u  |" \- o; k/ b
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ) N3 q8 N( M0 I1 s* t- G" ]" x+ ]  Y# P
26  
' L- u7 a1 |2 F9 h( p) h3 q27     tea.decrypt(crypt, plain); 6 J* d5 Y  z9 L" n7 J
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 1 |' Q& S7 y* z. q# l# k
29     return 0; # D$ v6 @' e. w* G: j" A0 m
30 }
$ N0 R% Y) W# ^5 F% ^
! w7 g+ T. W9 e; C7 A3 p! q本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
" S% q; n$ E: n8 V9 g" ?# d运行结果: ' J. h& z. [1 m
Plain: AD DE E2 DB B3 E2 DB B3
: |' Q$ X& J( j& P$ J8 W. BKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 3 f, m' T8 l( V1 I5 q* r3 t
Crypt: 3B 3B 4D 8C 24 3A FD F2
$ @% ?' F; J. [( _Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 01:25 , Processed in 0.018740 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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