找回密码
 注册
搜索
查看: 37315|回复: 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轮):
% r7 |5 i3 R4 a& e9 _) m* R% j  \微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 # M, q% M) g! o1 Z& Z( e
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
3 n; F8 Q. j1 s( w- V之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
% O. B, s8 Z: R  R在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
2 k* b5 W1 s! w( n. z  `在 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. % q4 l$ B( `% u1 S8 Q/ x. X
  2. void encrypt(unsigned long *v, unsigned long *k) { 2 F4 K7 Y1 j: l( l+ j# [
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    3 O. [# I4 @  |* U
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */   r# p  n  y! ^. Y. K, q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    " C0 w+ q' v. X* b3 D
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ( s) ?/ n* ?2 w) ^* W) C; w
  7.          sum += delta;
    7 {: R9 W9 a- Z" d/ I- L, b
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ! B, {: X+ O+ a" M
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ' V4 s- r; p; ]& y
  10.      } / x3 t# c6 {, c0 E' W
  11.      v[0]=y; ( o/ o9 m& F" e
  12.      v[1]=z; - F6 @! K' Z) P; k
  13. } * ?6 n* N5 T2 u1 v9 h! w+ f
  14.   
    7 b1 u4 g9 b" ~7 F5 k
  15. void decrypt(unsigned long *v, unsigned long *k) {
    % P, e0 V" d! m+ X# u
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    $ A! d3 S3 w5 e' b, {
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ( h/ b6 N7 y& C! f
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    / s- d8 m% e- w  }+ c+ j0 w/ z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    & u8 G+ d& {  H' u8 i
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    6 p  ^  @! M# s* a. L
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & T& B. X, C3 c3 x
  22.          sum -= delta;                                /* end cycle */
    ' `; g7 `- }. {+ G' C
  23.      }
    3 m3 J( A* _2 b
  24.      v[0]=y; : N: e- i) E; f3 W3 [
  25.      v[1]=z;
    0 }' |4 t5 \3 R* ~  p, a
  26. }0 h, a2 f) \" G  J( C6 W* L( Q8 Y
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
  r7 l& I+ ~" z/ D, d' e. n#define UTIL_H
3 N/ L( o+ t) k1 L) y3 [/ F- j7 s& M, c# K+ _6 \
#include <string> ( Q, i( D' X+ z1 D
#include <cmath> 1 n0 T: s# Y& Y6 R* g
#include <cstdlib> . l) s- u9 q/ h' L/ j

! M3 d) u9 U; }  X& Y( v8 wtypedef unsigned char byte; ) e! G) l8 ^% z* H6 {+ s- u
typedef unsigned long ulong;
7 J- E9 Z, ]4 D' k4 k8 I0 M7 m$ Y
1 U4 b1 Y3 _8 a4 ~' b; Vinline double logbase(double base, double x) {
1 D& H  s. \6 H! ^; v. M    return log(x)/log(base); : x4 Y$ K- j4 q3 J
} 9 ]% m0 \* L/ D

% _, y) d* J4 C# F/*
8 o! b1 _3 y. b*convert int to hex char. ' K- G$ j! Q9 l) W) H
*example:10 -> 'A',15 -> 'F' 6 `" N$ [0 y( |' r
*/ 8 c! b6 y0 K7 ^6 l) ~+ U
char intToHexChar(int x);
* `. M: A0 x" c% {4 w1 N5 Z+ P7 R 5 O5 N& V7 ~, \) t% I- M  G$ r
/* ! \, m; h7 \. c: }; _
*convert hex char to int. 3 x0 `! {4 P1 s% k  y" d# V
*example:'A' -> 10,'F' -> 15 ' Q8 p1 e# f1 m+ @
*/ 2 P/ l% B& \9 x- W
int hexCharToInt(char hex); 1 P* }9 R9 G( x% ?# q# I+ c
, b1 v+ t1 |! K! f+ G1 [
using std::string; 5 Y+ O  `; Q; Z3 s" z' [
/*
5 j! q0 H% q$ ]- ~*convert a byte array to hex string.
# X/ Q. ?+ m  n; w: Q* G*hex string format example:"AF B0 80 7D"
$ c: N$ l. C1 G2 R4 A2 X* L*/ $ g6 ?/ @/ Y& ?2 o; U! t5 T& N
string bytesToHexString(const byte *in, size_t size); 1 P% e7 C: G+ B3 p1 p! W& [& `
! |5 A5 z+ N: U& ^% @$ {6 R
/*
9 X. Z1 o9 _6 Z, Q5 D0 B: }# G*convert a hex string to a byte array.
5 F+ T6 }. P# D( V8 k*hex string format example:"AF B0 80 7D" 8 n4 J' x) C5 o5 j/ ?5 f; T6 q* g
*/
) b' y- i/ Y! T2 v& t8 y+ v3 Rsize_t hexStringToBytes(const string &str, byte *out); 6 f: X* z& n" C, Q- s, |% m! f
1 J! N( B; X, X: B+ d) w: H* [" G
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
+ G- ~/ L1 u# p! J5 v7 h#include <vector> . |) O9 G% S; ?* `! L% N" L+ ~
3 R" \* g0 }) G1 D% P$ b1 N7 g
using namespace std; 6 m; A; Q% P8 M5 M8 c
8 ^2 Z; R0 Y8 Z7 k* I3 k: ?' N
char intToHexChar(int x) {   @$ P: K5 r" Y) R/ A; {
    static const char HEX[16] = { 3 D7 s+ v1 X/ J& c1 B: z% _- ~
        '0', '1', '2', '3', + R' v: e- n% i3 t* G. O
        '4', '5', '6', '7',
% d  m* q4 U$ Y5 Z% x' ^  H        '8', '9', 'A', 'B', / J! z2 o, [# h! u
        'C', 'D', 'E', 'F' % n( T' A4 c, P. F( ]5 [* g
    };
9 o( w% B; {; t' s; f, f8 z) I6 p/ E0 r    return HEX[x];
- C0 J2 C( k/ T/ ~! M. [} - O% }' h7 i9 s3 y& b' A0 F/ b5 H
$ C! H$ v9 ]6 e7 _: Q
int hexCharToInt(char hex) {
/ L9 m2 P& Y' S! N0 c% o& }3 ]    hex = toupper(hex);
1 p2 Z! K1 u4 ?; S* N" G    if (isdigit(hex)) * y% k+ L( T" d. ]4 J# S
        return (hex - '0');
6 s, ~  g: s- j6 G+ |2 b- D3 z    if (isalpha(hex)) 0 h% Q* {0 N6 N3 G& @3 Z$ ~
        return (hex - 'A' + 10);
" v7 @0 Q1 _$ _7 s5 W6 ~6 ], C    return 0; # _' e  Z1 r5 K. F# P. F4 c; \" X
} + A; f% m1 d# K1 a8 t5 }5 ^

4 J5 K  c+ \% \! \+ fstring bytesToHexString(const byte *in, size_t size) {
: M: W! l+ c; A/ M; s% f, x$ T3 ?5 g    string str;
: X+ @% s3 s+ K* p    for (size_t i = 0; i < size; ++i) { . B# r: _0 S3 }
        int t = in[i];
, _) A* N- B9 D4 k) a2 l# e) n: g        int a = t / 16; 1 E, Q$ h! R  Y- v
        int b = t % 16;
) z6 g5 F8 j* q! @; c4 M+ ~        str.append(1, intToHexChar(a));
) ~3 S( w! C& D$ H9 U- k( K9 t        str.append(1, intToHexChar(b)); ' L; R; {2 h3 F$ Y2 \1 [
        if (i != size - 1) 0 N5 L  e) Y' L6 E
            str.append(1, ' ');
! O6 O/ Y9 \* ?; O& v    }
6 v1 u4 V3 }( t) V5 @8 S    return str;
; v7 @$ {' ~1 u0 l- ^# X}
2 b& z$ O8 I2 O$ h6 J# _1 W6 L
$ Z% b* n7 ]2 e2 Esize_t hexStringToBytes(const string &str, byte *out) {   y) _, ^/ K7 A. I2 |' L5 g

' w9 U- C1 G/ d& B# L: \- |% a$ ~' `: R    vector<string> vec;
8 f' W2 B' c# I0 e8 z5 E9 ?0 V    string::size_type currPos = 0, prevPos = 0; 3 T4 `: d$ z) A
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
9 q& o$ N9 W2 I4 a& }5 G        string b(str.substr(prevPos, currPos - prevPos));
* ]- L2 T* q; S        vec.push_back(b); & ^! T- V: j& y0 g
        prevPos = currPos + 1; 3 X8 f( X: L$ B6 c. {! I* A
    } $ W0 ~: N9 Y2 S- k, J" G  i8 A
    if (prevPos < str.size()) {
' C! w* S5 f$ M* @4 `. |8 ]3 x/ ^3 u        string b(str.substr(prevPos)); # P  U$ V8 ^, ^$ n; ?' W, l
        vec.push_back(b);
2 {! @6 K# L# \' i+ m    }
8 e4 ]8 L+ V1 W( J5 A0 L1 M! A    typedef vector<string>::size_type sz_type;
% F" B- e) U) V$ Z    sz_type size = vec.size();   f* `6 c. f" h1 }( Y
    for (sz_type i = 0; i < size; ++i) {
& e& ^! F4 F& Y) A7 q! }2 n        int a = hexCharToInt(vec[i][0]);
* ^1 `5 V/ e7 ~5 _5 e( o        int b = hexCharToInt(vec[i][1]);
- R. B3 A: e$ |4 l; ^        out[i] = a * 16 + b; 2 H; J2 f, g: \8 [
    }
/ _0 V& Q& h8 W- l& O1 ]    return size;
  v0 i& i0 k" q}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
* B# t1 l+ b7 |3 }3 n- M9 z#define TEA_H ' ?) ]% C1 p, }& t  P# d
0 u; e! l4 b; L, u, t
/*
: y5 B, t9 X+ W+ Z# ?6 a/ w& c*for htonl,htonl
, i. Z1 a6 u9 W% A*do remember link "ws2_32.lib"
+ d) c8 U. ^' ^3 ]*/   f5 y: ^7 O/ c8 e  c
#include <winsock2.h>
2 i9 V: j6 z* J. D. N. F% W# |4 D#include "util.h"
3 W7 }- V9 R; h0 z0 e
# J" }1 s' Z- v" t( i6 `4 eclass TEA { & U4 D% \8 Z! r8 J4 E# s8 S7 {
public:
8 A  I1 E& N5 K! k: I' l: t    TEA(const byte *key, int round = 32, bool isNetByte = false);
/ k- ^" M2 H+ [7 f+ y7 b$ l5 A4 X    TEA(const TEA &rhs);
7 M! w; u% f5 f' p/ e    TEA& operator=(const TEA &rhs);
: a5 z" D! ], [+ g- o3 W    void encrypt(const byte *in, byte *out);
7 }% {" ~) Z4 G; }4 K" p    void decrypt(const byte *in, byte *out);
8 ?, _, O6 G2 N! v$ l& H7 kprivate:
5 q" I5 p4 k/ N: e3 T$ T    void encrypt(const ulong *in, ulong *out);
5 F& N) G# R8 r8 Z% R% c6 {    void decrypt(const ulong *in, ulong *out); + g+ l4 z6 Q5 o, c% f) _6 n7 g
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 6 q6 @, m0 G7 V) F$ F
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ! P5 f+ I& y0 m, b8 c
private:
% s+ g6 }2 [! C9 _- W- n    int _round; //iteration round to encrypt or decrypt
( p2 \3 v; M8 t# I: u# V: B" s    bool _isNetByte; //whether input bytes come from network
) k1 y% O& Y* j# `    byte _key[16]; //encrypt or decrypt key
) _/ }4 [; l# m, w};
, T0 o+ C/ l, ]2 }' c) U
: G' C0 [4 X0 U) s#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ! U: E; U2 F2 y. {
2 #include <cstring> //for memcpy,memset
; s5 R) L2 M: l8 z* F% { 3  
. p% U0 W' v  ?; @) b1 L' U 4 using namespace std; ! Y' G( H9 K% S8 R$ t% A
5  2 L: q6 J, ]6 H; ~
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
5 X" H# f- M0 R 7 :_round(round)
. G" d2 V+ W" Q7 a3 r 8 ,_isNetByte(isNetByte) { 6 [! S% I! ~+ B3 k
9     if (key != 0)
9 E5 C, u8 M0 S5 Y+ ~9 f7 I# X10         memcpy(_key, key, 16); 8 a# B% w7 G  w/ e, h
11     else
) j) ]/ s2 \$ u4 @12         memset(_key, 0, 16); * x' B" S9 r3 O' S( W& k
13 }
! D; C% `! ?5 P- o14  
$ `# {& a3 @, P2 j4 ]$ I+ e15 TEA::TEA(const TEA &rhs) 8 K# Z. D! n3 S1 h7 H. }
16 :_round(rhs._round)
9 v3 j0 P8 D  \" q9 h0 k6 ^17 ,_isNetByte(rhs._isNetByte) {
: R6 o! A, s/ W! M18     memcpy(_key, rhs._key, 16);
% `+ k' k2 G. |  w9 O19 }
+ T! d) r4 k7 q9 z* J* V: ^20  
& P8 B% ?: N2 ~! Y21 TEA& TEA::operator=(const TEA &rhs) { ( E  F# I7 |8 z2 g% s& }$ ?2 k% n* D
22     if (&rhs != this) { 7 n  Y9 h8 x/ S
23         _round = rhs._round;
# m1 x- J0 {& E2 w* u; a  l24         _isNetByte = rhs._isNetByte;
( D5 f2 u2 i0 K$ R' R+ O, j% ^25         memcpy(_key, rhs._key, 16); # {( W9 S5 M2 f3 ~) b
26     }
! `, A: J( f$ r. i/ p6 u% }27     return *this;
" o% r6 |+ ~4 G- {/ q* T- \28 } ! D* s2 ~! z0 A: Q5 s
29  
: u! K8 Y4 C5 b: {0 @30 void TEA::encrypt(const byte *in, byte *out) { ! s1 I8 {, Y! d; K4 X. ?/ N( F
31     encrypt((const ulong*)in, (ulong*)out);
1 w6 j# v3 C, \( g4 u* A, o2 \7 {32 }
) P8 a5 }' j; q% |- Y7 Q$ K+ G33  ) g3 t6 {" l3 k: g/ g! q2 }
34 void TEA::decrypt(const byte *in, byte *out) {
$ \7 ^% }, C. N' i' ~& F$ Q5 Q35     decrypt((const ulong*)in, (ulong*)out);
1 Y; ]6 F( s* }1 y5 e& g+ t( u2 q36 }
) X8 n, g% O  y+ u) U6 P37    @! }# x2 O3 G9 l0 Y* N: [$ ]
38 void TEA::encrypt(const ulong *in, ulong *out) { , j: t5 p9 Q7 }8 D. O' q
39  : x$ z! a  Q. X2 j& e
40     ulong *k = (ulong*)_key;
$ S9 {/ Y4 s: l9 p/ w) c/ v. A3 {41     register ulong y = ntoh(in[0]); ( {1 Q+ y- j! h7 ^* x/ X) C
42     register ulong z = ntoh(in[1]);
2 a* M  n' F2 ^/ x43     register ulong a = ntoh(k[0]); 7 V. C; Z/ U! M. e
44     register ulong b = ntoh(k[1]); " l" ]. v) g9 B& [: ~4 b
45     register ulong c = ntoh(k[2]); , m; U" }# ]" R2 G& _! H
46     register ulong d = ntoh(k[3]); + Q. u6 p3 d& n9 C* u
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ! O6 ]7 G4 R" j4 W! @4 c7 L0 G: }
48     register int round = _round;
- u" j1 \; q; [  L# G49     register ulong sum = 0; ' P( _# ?/ R) a3 c1 f
50  
$ a# W5 s8 Q7 n5 ?6 E" G/ K3 \51     while (round--) {    /* basic cycle start */
9 n- r- J/ c& H- t- A52         sum += delta;
; L8 d  W# b# S! D) H53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
0 E- p3 N8 R3 ?* B9 g54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
0 @; ]8 D8 _! M, [) V55     }    /* end cycle */ 7 [; r  V+ B& `
56     out[0] = ntoh(y);
5 F& c' Q# ~$ j9 q2 R& r57     out[1] = ntoh(z); , O  L* N2 t  l) B$ X( j; @! T/ d
58 }
% L& U5 |2 ~( |7 U, P2 k59  
- W  J$ t0 v- c0 @3 U60 void TEA::decrypt(const ulong *in, ulong *out) {
% c7 u; t; |; |/ }. E' ]61  
" E6 ]* y5 B6 T2 x62     ulong *k = (ulong*)_key; & h/ y5 V" Q# _
63     register ulong y = ntoh(in[0]);
9 z- `$ s" ]) o' ^4 g6 ?64     register ulong z = ntoh(in[1]);
4 @7 K/ ^' X1 ^* U: Y65     register ulong a = ntoh(k[0]); 6 {4 R2 @% p/ j# ]; j3 F6 l
66     register ulong b = ntoh(k[1]);
0 n" o" F; B0 k4 z8 l67     register ulong c = ntoh(k[2]); 2 `/ z, w( L/ L: M
68     register ulong d = ntoh(k[3]);
% O" C9 @; s8 W3 i69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . n( }" y0 @. U, D
70     register int round = _round;
. R+ k, S. b7 P* ~1 h71     register ulong sum = 0;
6 z# D+ N2 L7 w% J2 q4 [72  
1 b/ A3 z( |- F4 P$ D4 A  d73     if (round == 32) - s: K4 k9 E% j: n% V5 k% Q
74         sum = 0xC6EF3720; /* delta << 5*/ # _7 d: w; U% ]# a
75     else if (round == 16)
% d; w/ X1 Z: G7 T76         sum = 0xE3779B90; /* delta << 4*/
/ x- ?6 u1 ?! E- x8 d& D77     else
- Y8 S3 `. Q8 f* w$ f$ m6 l  f. s( |  a5 z78         sum = delta << static_cast<int>(logbase(2, round)); * w3 z2 y! K( V& D- [
79  $ `) n* }( E8 H& G
80     while (round--) {    /* basic cycle start */
0 N- P5 a5 |* z0 n81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
; Q/ Q: F. _+ V& s/ |$ u7 G+ E' V82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
3 A+ Z' C8 m0 }: b! K+ B+ M; H83         sum -= delta; 3 x  Y2 ^7 p- I$ U! m, L6 P: K' T- W% K
84     }    /* end cycle */
5 {: h: v$ p# g* T5 v& |85     out[0] = ntoh(y); 3 i( I: v; H; O$ B2 ^: ^! ?
86     out[1] = ntoh(z);
2 q% x( V  s- I2 X4 p87 }' B  k9 m3 ?# n- e5 e% o: |

! i9 t1 H, ?; m4 I需要说明的是TEA的构造函数: $ B4 n# Y) P& o7 }
TEA(const byte *key, int round = 32, bool isNetByte = false); 3 Y# k8 x, W& D9 }. Q7 H5 r
1.key - 加密或解密用的128-bit(16byte)密钥。 * g6 |1 J- O0 A$ s+ @( P
2.round - 加密或解密的轮数,常用的有64,32,16。 # t4 O' J1 F  y# @
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
: ?8 e& B! B) n% j3 }/ D  e! p1 s* @
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
/ Q. \! t" u  }. x- Z 2 #include "util.h" 0 d% D- q! S! G# K! z+ T3 `
3 #include <iostream> 2 c  v7 b9 M' g( r& @
4  
- f# W  ~) }6 B3 T 5 using namespace std; ( ]' F& x+ s0 \: j2 g- b8 u
6  
0 r5 a. V; S0 ?, Y 7 int main() {
1 h7 _1 E9 H9 H) O% R 8  
; d9 c& ~! e* ^" A& N3 c! ? 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); : B8 l- W2 b! V/ O( q
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); " G) |+ t8 L; Q1 _; W
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
  |' t9 D6 ~3 I- p  e! q" C8 |0 X12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 1 B3 N* r. b3 Q
13  
6 F4 C( A* ~! ]14     size_t size_in = hexStringToBytes(plainStr, plain); : @  f; B' @1 G" j- R
15     size_t size_key = hexStringToBytes(keyStr, key); $ `% B1 i! ]3 G3 f& u7 h4 c
16  4 {3 k, x3 F3 S' X3 k
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
! ~3 X+ c7 V* f7 m  p9 F18         return -1;
/ \4 I/ b( F1 `; |2 X, c! O* s19  ' t" W% \% R0 g& a
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; % h1 T6 p1 o/ O! E- M6 w. H
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
5 K8 [& |6 z; D! D22  % q0 {9 l! u; c/ \
23     TEA tea(key, 16, true); 7 f0 c/ H0 w9 H, R' `
24     tea.encrypt(plain, crypt); 0 j6 n7 {2 C- e8 b
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 2 z, x, T7 s$ G& j$ [. `* r
26  
0 f2 W  I- n4 U0 P  Y% g! z27     tea.decrypt(crypt, plain);
4 r. M$ ]- j; Y: i28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 5 ~6 v. h% ^! K7 x2 r
29     return 0;
2 t. l2 m' H$ {+ g- g& @5 y' l30 }
- i; u! U0 \2 K  v. ^% o. s. z$ p8 q- A2 D% S! i5 A4 U7 W& N7 p
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx2 B2 @" \  F: K" S4 q/ D% K
运行结果: ( @; c; l0 l( p3 d/ V) B: c
Plain: AD DE E2 DB B3 E2 DB B3 / s! ~9 a" Z. f# f  [) _
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
0 [* L" w: ^3 J; P( u) K8 o8 m: UCrypt: 3B 3B 4D 8C 24 3A FD F2
# k( ?1 J! s% @& \" MPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-27 17:46 , Processed in 0.026271 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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