找回密码
 注册
搜索
查看: 37690|回复: 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轮):9 z( y0 s/ v3 u/ m% i+ l) x& k
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 # m2 @9 I% B" B+ J- H- m0 ^; {( J" E
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
* T0 T: X* r( l2 G之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
6 N& t. @$ Q( }8 s2 ]在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 . f6 E, f5 D# f- W7 H& ^6 l
在 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 S& v1 [1 o: ~8 Q0 p5 ^2 l
  2. void encrypt(unsigned long *v, unsigned long *k) {
    7 M6 b! o4 b' v2 t* s
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    , R0 o9 s5 j% k& D  U
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ # x1 B/ Q+ w3 Y9 A
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 2 g+ X0 r( B. \. s% E! ]
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    & W  L6 K5 I: y  w9 h, M
  7.          sum += delta;
    - M5 y3 O% O; {9 a& i: R8 L8 x# _
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); / H; S# E; Z% U
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ $ [9 g9 [- F! Y9 ~
  10.      } ' V/ G2 g6 Z; Q3 g- _5 f
  11.      v[0]=y; ) }7 Z9 t0 d/ C8 {/ A  a7 W* Q" |
  12.      v[1]=z; " w6 y( w/ v  Q$ n7 y
  13. } # s& A3 f, X  z* p% k/ ~
  14.   + T# j5 N5 d# v% Q. p
  15. void decrypt(unsigned long *v, unsigned long *k) {
    4 j1 O1 b' _  N8 T" f( s& x
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    # [+ p, X' ^8 G. w+ l3 A
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    $ o* L. l' @. H8 g3 r' e
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ) ^1 _0 R0 e3 Q& e4 s7 N" Q
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ # S$ [" U+ K; f  ]! y/ l* }
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 5 Q- P# e" d. D" S$ z
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    / R6 [# Y. u* y" W' G
  22.          sum -= delta;                                /* end cycle */ & b# g( X& z# z! Z1 _: _8 U
  23.      } 8 V9 Y2 K' L( m! _1 n" h2 j
  24.      v[0]=y;
    . i' i! W. V- }) @7 B1 v
  25.      v[1]=z; 9 _) K7 h. i9 a9 L+ C9 P% e9 {
  26. }; I. o" x9 E% _) I! Z0 u$ O
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ! z" M0 N! n1 j6 n6 E) f+ `0 w. R
#define UTIL_H
( A$ y3 l# [" r# M$ o' R9 f
4 i: d* Q8 K, Y  P* q7 e8 f: n#include <string>
; I6 S( ?6 O3 m& L1 }#include <cmath>
1 O, S% z1 S& G# O/ K2 g6 `#include <cstdlib> + m+ _) ?, m0 V# y2 Y1 _

' ?: Z! t# P3 x* ?3 A+ _typedef unsigned char byte;
/ e% i* r1 j1 n( ytypedef unsigned long ulong;
. k! y/ t& J5 h2 f
' E& d3 H8 m& U0 s2 B0 einline double logbase(double base, double x) {
" z4 Q7 V+ d8 y' w2 G    return log(x)/log(base); 8 J5 T; F' R0 W% e
}
) s0 Y) \0 I6 h0 }. u
$ K1 C! E: b  V9 I4 C/* & ]5 f9 j& J- |% f5 y' U
*convert int to hex char. + B2 V7 S7 i* _: U7 ~
*example:10 -> 'A',15 -> 'F'
+ g( |9 V3 t( `. v+ ~" b% C8 n*/
* @' ~  r, a* i8 Bchar intToHexChar(int x);
& R4 W9 Y6 [2 }9 P$ q+ V
! w% }# G/ J, j  P6 Q4 t/*
' u' n, b; l0 C3 v8 F*convert hex char to int. " c! i" S! f" L% [  P. d
*example:'A' -> 10,'F' -> 15 $ F) P2 F. M- J" c& V# x
*/
% c1 t" A9 z# n' yint hexCharToInt(char hex);
. \/ p# l; }5 m0 I* s! n" X5 L8 w % X; M$ y3 J. l) a8 _; R: s, e
using std::string; # k  c7 D* r) l* ~5 a' H
/*
* g$ u- w5 J6 V$ L! Q! h* m, m*convert a byte array to hex string.
; _5 m: E2 k) v# M& X5 M*hex string format example:"AF B0 80 7D" 8 M' K! S2 E: p6 `3 V% E
*/
1 Q& a; @, c. ^! i; C9 h1 |  H3 hstring bytesToHexString(const byte *in, size_t size);
; H. `0 _6 H! ]4 p, Y& @- E2 Y6 O   W' z* U6 ^$ f3 Q
/* : O# ?$ i% O$ s$ l8 \, v% R  F
*convert a hex string to a byte array.
* K0 R, E. z, G% ?5 z1 B1 [' O*hex string format example:"AF B0 80 7D" # X% R+ h+ c4 g2 ~/ q
*/ % v7 ?' q1 W9 ]6 Y6 T  E( l9 _
size_t hexStringToBytes(const string &str, byte *out); 6 R. f' R+ W2 P& c5 x

1 Q# P% q: u3 J6 U" H9 m, n1 A#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
2 ?9 p3 i3 A. n0 m; ?! k' j#include <vector>
% R! v' N. U, K# \" e
5 G5 w0 J1 i" o4 c$ r3 vusing namespace std; 3 y- P, e: r/ b2 Y
5 Z0 p% A4 w2 W: r: c% W  P
char intToHexChar(int x) { 7 g/ v; k0 s: N( @0 g) N1 r
    static const char HEX[16] = { 8 i8 j; U; s. e' W" X* W' n$ ]; `  R
        '0', '1', '2', '3',
0 I, ?  F) m5 u        '4', '5', '6', '7', ' L5 j) N# R$ u9 N1 j2 `8 F2 H
        '8', '9', 'A', 'B',
% @% N5 H: v6 Z6 P) Z# S& ?( l' l        'C', 'D', 'E', 'F' ; ~+ R9 V9 z9 Q3 O6 y
    }; 0 U, h) d; ~  Y5 r+ d( i
    return HEX[x];
1 F  y( f! {1 k, K: Q4 O}
; o! @/ p; p1 y1 v5 E# S3 f
- V& d2 A8 u. C- wint hexCharToInt(char hex) { - V7 w+ s) G% l6 \7 @
    hex = toupper(hex);
& ?2 b# D" h" H& T$ ]    if (isdigit(hex))
. `) b  {& V. d- d& Z        return (hex - '0');   J' ^- G0 g3 p2 A
    if (isalpha(hex)) 8 a' L' Q  }" Z0 \, a( u% p
        return (hex - 'A' + 10);
' Q; R, r$ S7 b2 l( O$ t    return 0; ( ~/ u9 i4 m% [
} $ |3 l3 `# e7 n# u1 A/ c6 o, Z. b

5 G5 e/ G; X! }0 mstring bytesToHexString(const byte *in, size_t size) {
2 p5 S5 b: z- u& r: ~, p    string str;
, l+ n' N3 ~* L; d/ e    for (size_t i = 0; i < size; ++i) { : X( s4 J' H7 Z% L8 W& ^5 F
        int t = in[i];
8 |( K: V6 ]( B% F3 F        int a = t / 16; ! Y3 P" K$ t6 \& F0 t9 e% n% O3 I5 N
        int b = t % 16; $ c3 i2 ?+ \* n
        str.append(1, intToHexChar(a)); ' }  S. v7 s5 p2 T
        str.append(1, intToHexChar(b)); ; w8 ^) A% }9 C+ x1 a7 V: q
        if (i != size - 1)
8 J8 M) U7 M2 k- N( J" b            str.append(1, ' ');
2 @1 ^& j2 R9 ?    } $ E; |/ W7 X* `
    return str; 1 ?$ z3 G0 s$ A3 g+ @+ L& P
} ! i, N; q' a% `+ I+ p3 Z; g

! x$ r6 a- T1 asize_t hexStringToBytes(const string &str, byte *out) { $ v) H( P: _+ ]3 ~( s$ ^9 y! ]

- k/ p- y' L/ K& X8 y0 a' K0 A    vector<string> vec; 2 ~' i& W6 Q. B5 J  c+ q5 G: h
    string::size_type currPos = 0, prevPos = 0; $ y% h$ v, ~8 h0 j
    while ((currPos = str.find(' ', prevPos)) != string::npos) { . c) ~" E) c8 H
        string b(str.substr(prevPos, currPos - prevPos)); ! O9 X: ]6 i2 C- w3 a
        vec.push_back(b);
7 q* F( r% V9 b! F        prevPos = currPos + 1; " x9 S' w! R! k+ p- @
    } 4 v* D' ]$ i6 w! I$ t) U$ ?: D
    if (prevPos < str.size()) { 3 @* t5 Y7 [8 N7 j* j
        string b(str.substr(prevPos));
% i6 x* L; A  W" r        vec.push_back(b);
  L0 i6 T8 t1 x8 \    } 2 O3 A" _7 e  \7 a2 J, ^. K
    typedef vector<string>::size_type sz_type; & n( q6 }1 s7 A% l! a2 b
    sz_type size = vec.size();
7 \9 ^1 ~" T, j/ h- Y* k    for (sz_type i = 0; i < size; ++i) { ) t5 N- i# c  Y
        int a = hexCharToInt(vec[i][0]); - o- L) Y: a' V6 E5 g# r
        int b = hexCharToInt(vec[i][1]);
2 a5 J1 z2 R- t        out[i] = a * 16 + b;
8 R, z  {4 B5 M' N  X+ b    } ( D0 Y+ U) E9 C, d3 S" K3 C
    return size; / z9 \* V6 z: f) ^4 J, i8 k
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
5 o9 p, A1 R- p. C" b#define TEA_H
) D; Y7 B. ?* v) O0 p ( x, |6 {+ t8 A* d) X
/* 1 d4 A0 U6 R. N  w3 Z4 [4 @" B- O
*for htonl,htonl
" Y' b- y3 L( p- {, m*do remember link "ws2_32.lib" / m8 k4 @8 H  d! p1 w& Q+ g
*/
9 l7 w1 E- M  Y4 D5 ~! n% q7 b#include <winsock2.h>
0 V6 k) f5 \. N) A! L0 h#include "util.h" 9 M0 m# n8 n( B+ Q

' M5 c; J8 q& c0 Bclass TEA { 6 b& W9 e+ f+ O5 y" u3 k& A4 ?
public: % M9 V8 [4 I( r2 R" ?: A9 R5 k
    TEA(const byte *key, int round = 32, bool isNetByte = false); 5 g. K  i( G1 E, {8 @2 M- E- `6 v$ X
    TEA(const TEA &rhs);
7 K. }6 e4 n" p! N& U" f    TEA& operator=(const TEA &rhs);
( q- D3 _4 V! ?; U8 ~& f& q    void encrypt(const byte *in, byte *out); % a1 c( B: h& r
    void decrypt(const byte *in, byte *out); % U9 b9 i% m( Y2 D+ n. s( O
private:
2 `9 n5 w( y: [    void encrypt(const ulong *in, ulong *out); 5 [( B. c, g* r& F8 [
    void decrypt(const ulong *in, ulong *out); ! M& r: C6 _8 _4 Z5 r4 U! j- \
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
# n1 E: t. h* n8 @6 f/ K$ K  [    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } $ |* B; t" J+ b4 j+ _4 _
private:
& A  x5 r9 O/ f+ R) V( {    int _round; //iteration round to encrypt or decrypt
% ?1 u7 T9 X( Y& t4 w% [8 U    bool _isNetByte; //whether input bytes come from network 7 T3 ^; v% D! K+ V2 ^4 J' U3 u
    byte _key[16]; //encrypt or decrypt key
( K& e* i, w: O& X- q};
$ K# A9 c- ?- R/ S
) f" S' g/ w" k. G3 O- Z# v" v#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
! n8 u7 V6 T' g, C; U4 [ 2 #include <cstring> //for memcpy,memset # P! @& S2 |$ l7 X0 d( l- Y" t
3  
" P  f" `% h  X 4 using namespace std; $ ]: V% s/ ~% H, j1 ]. n
5  
; N  t  S5 v* R9 K- M- ? 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)   H$ z# T, I  N9 V
7 :_round(round)
6 A& R% w" v! L1 ^- W 8 ,_isNetByte(isNetByte) { / S6 z& Z6 c+ P3 ?# s! j2 W
9     if (key != 0) 3 J, M* f% k" S, X! h
10         memcpy(_key, key, 16);
8 b( W- B. S' s' a& S5 }) z- T: T11     else " h. O/ n2 `3 s; k- z
12         memset(_key, 0, 16);
9 \, W$ J/ k4 G" K5 @13 } ; F$ b8 H5 u6 Y) p2 X
14  5 B" e' B2 G, j+ m: r% H8 x7 G
15 TEA::TEA(const TEA &rhs) , j" Y8 e3 m2 d3 S: r% W! j
16 :_round(rhs._round)
1 X' p7 ]+ W- v0 v. s% H5 A% {17 ,_isNetByte(rhs._isNetByte) {
% @3 W4 }$ z; J& S0 F4 r( E, N18     memcpy(_key, rhs._key, 16); ; b1 B9 N( Q; P! g# ]
19 } + y; `! A/ T' [
20  1 N: b6 c: a3 B
21 TEA& TEA::operator=(const TEA &rhs) { 3 D  `  U* c; ^& c2 R! ^4 _
22     if (&rhs != this) {
; Q' P! y. {5 R* R23         _round = rhs._round;
6 n2 Y! D% ~7 i% @24         _isNetByte = rhs._isNetByte;
; r% B# p/ `/ Q, T, w25         memcpy(_key, rhs._key, 16); " @; X) Z  I2 K
26     }
" n. }4 X2 G: f! J/ K27     return *this; ; S/ w' [7 S& P" k
28 }
' ?& l6 w2 Z/ \- v- M: i- ?* Q29  
1 U3 @! [* U" }30 void TEA::encrypt(const byte *in, byte *out) {
8 m, e% P1 S1 o" g3 J* N. H( C31     encrypt((const ulong*)in, (ulong*)out); 7 ]3 y- l; L* \- V
32 } / H+ z" ?/ t  }$ x- N9 g
33  
  e- V% l$ R, Y) \. R) A34 void TEA::decrypt(const byte *in, byte *out) {
' l& c& H' e5 ~35     decrypt((const ulong*)in, (ulong*)out);
: `% v# l9 n: o. Q6 x. q0 z! p36 }
0 E" S& L) V- N  }/ x1 G4 y5 f7 G37  9 F' d# K. \( B6 U2 r  c! {* J8 T& d
38 void TEA::encrypt(const ulong *in, ulong *out) { % R$ L- Y" N, x& F2 Q$ f; \
39  ! f4 v/ H5 t1 c4 x$ T
40     ulong *k = (ulong*)_key;
6 `8 k& c: C: J41     register ulong y = ntoh(in[0]);
# [& F  l, t8 ]& g42     register ulong z = ntoh(in[1]); % ~" O/ \: v0 I8 @6 U1 \+ D, X
43     register ulong a = ntoh(k[0]); + b1 B  _2 U) j
44     register ulong b = ntoh(k[1]); 1 K9 k5 \1 N0 [) E1 j8 r! q
45     register ulong c = ntoh(k[2]); 5 R5 @- ~: K3 F( I) Y
46     register ulong d = ntoh(k[3]);
! g7 D. n6 [& h8 D$ V. B" ?# [# v47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & Y: _5 g3 {5 Z, b7 s
48     register int round = _round;
/ p6 O  {) O' Y  u) X$ x- H49     register ulong sum = 0;
: q$ v- c- ]6 }6 B7 `4 R/ J50  1 H' }7 W  I7 {: n1 H: ~
51     while (round--) {    /* basic cycle start */ 9 v1 u3 v: b. ~9 a4 v
52         sum += delta;
0 }: @3 B; x2 m% \" W6 [  U53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( \) R0 A. ^. f0 x. g. M. A& h54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); $ C& r! M& C; P. l
55     }    /* end cycle */
5 f1 {1 i1 o( r56     out[0] = ntoh(y); : Q6 H8 T( \3 k  B
57     out[1] = ntoh(z);
% y- `- [4 A' m7 ]& |- }& q58 } % ]! V9 Q- [0 E4 e$ \" _$ r/ E
59  % L0 o' |+ T  F5 y! b  T9 c8 K
60 void TEA::decrypt(const ulong *in, ulong *out) { $ L% N, ~7 }6 h5 S
61  
3 v  }$ n2 B3 J1 i" G: E62     ulong *k = (ulong*)_key;
% v5 j# ~! r7 S; Z63     register ulong y = ntoh(in[0]); ( w  p- d! }2 H2 z
64     register ulong z = ntoh(in[1]);
3 Y% J$ y+ b* B9 A65     register ulong a = ntoh(k[0]); 8 x* w5 r6 m' k% U% w' J
66     register ulong b = ntoh(k[1]);   k+ M- j8 Y: C
67     register ulong c = ntoh(k[2]); 3 v: v) C, q7 E" ~, s; Y+ L9 N
68     register ulong d = ntoh(k[3]); 0 v6 H+ t$ I  y; V
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
2 Y" k) k- z+ L) L# `4 ~3 a5 s- U70     register int round = _round;   P# M9 w% z) S7 `% {9 U* ~% r7 q# d
71     register ulong sum = 0;
6 s! ?8 m; M% ?" \6 O3 ^4 E72  
5 {1 q3 n6 d- L( ~5 y: Z1 B73     if (round == 32) + A$ ~% Q+ V  t4 p
74         sum = 0xC6EF3720; /* delta << 5*/ 9 n4 W# ]" d. b. U& M
75     else if (round == 16) ' F' }% x% E7 X$ E& ^7 ?
76         sum = 0xE3779B90; /* delta << 4*/
! r4 V8 z% x4 ~+ N" e5 M( t$ S7 `77     else + v& V8 A+ d- z# V  j; \4 F; r
78         sum = delta << static_cast<int>(logbase(2, round)); $ R% Z( i- \9 W5 e6 l
79  
% T/ L% j# F; u3 H80     while (round--) {    /* basic cycle start */ 6 d7 J& e4 E2 n2 N( T$ B) i
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
9 ^  f& ]* p9 a" Q82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
9 E# i' C9 ]- R: y+ q& i2 t+ r83         sum -= delta;
5 S8 D5 O* _: k3 d! t84     }    /* end cycle */
, l# k: `: z& F( g85     out[0] = ntoh(y); / P# G  G+ v" n0 x/ a3 v8 {
86     out[1] = ntoh(z); ) l+ i! c+ L! y8 _8 ^
87 }
7 f" D6 L2 C! F) V8 `4 Q2 f
: o; `7 b8 u5 C# E需要说明的是TEA的构造函数:
( a. B- h& F& J4 H/ _TEA(const byte *key, int round = 32, bool isNetByte = false);
; z* y, d3 ~/ {5 l3 F6 s* z/ ?' X9 P1.key - 加密或解密用的128-bit(16byte)密钥。
3 K1 F9 Q# ~( ]# ~2.round - 加密或解密的轮数,常用的有64,32,16。 . |/ d' C1 }' X: x/ z4 |
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
! x! Z' S+ C7 _" V  H0 t! h2 y7 `: g" Q) K! b- k3 s; ^
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ! p  ?7 V7 P  B0 G8 Q! J# v8 W
2 #include "util.h" 8 L5 @# E" R2 e7 Q2 o4 v3 p* M
3 #include <iostream> 6 [1 L* b- {. k) W) p/ b  E
4  
" j, z% N) `. T7 M: t+ q 5 using namespace std;
2 Z5 p5 q1 x' l3 F9 L; W& n3 c; b 6  $ D! Z- L9 m- F; s9 J
7 int main() { + o7 v# G8 }) t: O6 z
8  
# ~- ?8 K0 y: f 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); , s0 }" p, y8 p
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 1 Z3 u3 u- _1 S  z
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
" ^& B; j& N1 r12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 3 A/ c$ ]- y( v/ I
13  ! ?4 W3 L5 [- j, o- X& h
14     size_t size_in = hexStringToBytes(plainStr, plain);
, r0 |' ~6 L( w0 z15     size_t size_key = hexStringToBytes(keyStr, key); ; _3 }) A% V% L6 v0 \9 P4 S3 X; }
16  
; V: t& V- c9 G( B4 [+ v$ s0 o. B/ @1 _17     if (size_in != SIZE_IN || size_key != SIZE_KEY) + h8 b& V: J- |. n8 d. Z5 ~/ H$ j
18         return -1;
5 i) E2 N1 ]4 c$ I$ d& X- G19  $ v7 W, {! F5 W" X
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 7 f1 \7 r, r( F' y6 i
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
- j5 E( E6 l$ n0 |, B22  ( I2 }& @( H0 m: }" W) Y
23     TEA tea(key, 16, true);
$ |4 `$ \2 ]8 {. w24     tea.encrypt(plain, crypt); . y& ]. y% [9 E6 m$ f+ h2 B
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
5 L& F; U4 d6 m9 J0 `26  9 i- Y& P: l* n
27     tea.decrypt(crypt, plain); ' o7 ^; r% J- b& M9 H/ O
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
2 D; {0 I* G( c0 L29     return 0;
& M% g. D% o7 d3 I! C30 }
, B# b' n/ v& F! P# B- j( U& L
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx: U% d, h. p$ q/ }" X8 v9 P
运行结果: " j9 e0 K$ g- H
Plain: AD DE E2 DB B3 E2 DB B3
0 t4 P! m5 h, {- \, I: OKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4   A7 e0 o+ h& Z) c! H) W% Y
Crypt: 3B 3B 4D 8C 24 3A FD F2
1 e6 O; m3 c+ e2 _Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-15 04:37 , Processed in 0.021029 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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