找回密码
 注册
搜索
查看: 37736|回复: 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轮):
" F/ i& }; P: S. [微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
6 v, b4 R& q- ITEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
. E1 U* z0 I" n; ]7 N7 T之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 8 `1 f4 J! g  O0 s/ T
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 % i, D8 M; Y, [- w5 N: ^
在 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. 3 l  V" j5 q) n' P# `
  2. void encrypt(unsigned long *v, unsigned long *k) { : N# ^! E3 U' I1 f# N7 |" X4 Q
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ + X  ]4 b1 Y( |; ?8 ~9 z, \$ l
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ; r8 y. Q; w- y" x: C
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
      ~4 i. v9 k7 K3 `; r
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 3 B1 `( C/ w4 h( \" R) T
  7.          sum += delta;
    / P" O) K+ N9 r, f, u5 C# S: ~# j
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ) {/ X  l+ K9 T, o4 r7 {
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 7 c/ j$ H8 A7 Q9 }5 x
  10.      }
    % Q5 \+ }. C8 t5 [
  11.      v[0]=y; 2 a6 h* E: v0 d4 J% j: m
  12.      v[1]=z;
    . \; y+ N4 Y$ E, f& ^" Z( n- A6 @; `$ a
  13. }
    " {3 L; V9 b4 H0 u: e  G' w; ?( J
  14.   
    4 ~; e8 t# v& t7 g- ~
  15. void decrypt(unsigned long *v, unsigned long *k) {
    5 j7 U" Q1 R1 O  u
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    6 G3 m1 Z9 n! H0 D6 T- [
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 7 ?2 h$ Q! W; ]9 v8 S* c$ a
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    6 \: [  l8 F$ e3 l
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 7 a: C) e, X0 I9 q% }: a
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    * ?5 }0 H& P: ]! U
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    4 E. R5 A' x6 U& q( B
  22.          sum -= delta;                                /* end cycle */
    6 m) W% k) C' N$ c- D
  23.      } 0 c: H: `/ O- b2 E
  24.      v[0]=y;
    8 m) p7 O+ i( x! [4 g
  25.      v[1]=z;
    ) Y; b, c5 Y% B# e& {% |1 U- r
  26. }
    ; }- x# R3 a  w- Q! k
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H : H' j6 C4 H' L6 b) U' o# h7 _
#define UTIL_H 2 |! N* F1 N1 u2 n0 A' q; ~

$ J! y- A  S3 ]. T$ K; F#include <string> 6 Q- f8 n" ?0 r9 o! U- B
#include <cmath>   L3 l4 a6 B4 k2 U2 a9 v* }' v5 g
#include <cstdlib> & _+ N8 c' {' a4 O. C5 i

: z6 l( U' N% L9 p* e$ V7 k1 Htypedef unsigned char byte;   J. m' {8 P7 I6 g( a
typedef unsigned long ulong;
5 x) K! x- {% k; {
9 V" G7 a% H+ ]  v, n) [inline double logbase(double base, double x) { 7 s( ?: v' s& |
    return log(x)/log(base);
+ t* s# F: @% F* ]) W} 1 y% r8 Z! w  ]0 L

  k9 G) }) @7 K2 e& r- l+ Z0 w, g/* . R+ C5 K7 e! Z, x$ v- C
*convert int to hex char. + \+ B( U) F" V7 O
*example:10 -> 'A',15 -> 'F'
3 V$ W- D4 n6 H3 |*/
* H  L' c& c) ~3 q; H$ Cchar intToHexChar(int x);
( U( t5 K0 y0 P9 J" O ( m# J' W. E/ v" {6 ^
/*
8 Y( [% \. J4 _*convert hex char to int. 1 T6 n& C8 S7 Q, ^3 {- a
*example:'A' -> 10,'F' -> 15
& A# o* ]' g4 T/ X+ }" M' V4 m% V*/
7 m: x3 y0 X& m, y) oint hexCharToInt(char hex);
6 D) M) ^( e% b ; G/ S3 x! }/ Z# \; v
using std::string; 6 Y6 f. ]' @* L- L
/*
1 Q" u" D& V' C$ R2 y$ b*convert a byte array to hex string.
9 {/ a  p; m7 o& E- Z4 I*hex string format example:"AF B0 80 7D" ' m0 C7 ^! y- i$ {6 k6 i
*/
4 L$ D' _+ R5 c7 f& a! sstring bytesToHexString(const byte *in, size_t size); 8 X% j, b4 u/ d4 |! O, k3 u, }3 ?8 h
3 [6 _9 L% P5 L6 G$ {4 \  r& h
/*
2 _" f% V, R/ ?# f7 L* ^*convert a hex string to a byte array. 4 p% T1 ?- y: c1 {- H5 ]* G
*hex string format example:"AF B0 80 7D" % u' d# W0 F) d) D& b" y
*/ , X0 c( z" i, ?' x9 N7 h- I1 }
size_t hexStringToBytes(const string &str, byte *out); " y5 G: L9 R" V0 ^9 A
' {9 \) ?5 o! ]; z
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
8 q0 _2 |+ ]' y5 _#include <vector>
" O+ E  T, |: R/ F; R" E6 f% H
1 Z* H7 I+ b) vusing namespace std;
+ m3 U+ y! t# k/ Q$ R2 W3 a) E
% }" H5 d  S. Kchar intToHexChar(int x) {
" e  ?2 Q& ]" E' ~    static const char HEX[16] = { 7 C% U) h$ x7 R" i4 }1 G7 g
        '0', '1', '2', '3', + y0 V2 ?& U4 p1 w# [0 X" |+ H
        '4', '5', '6', '7', 7 F! }3 V! ~2 w" Y, f3 K, |
        '8', '9', 'A', 'B', & v, h& \3 f# a' B
        'C', 'D', 'E', 'F' # C( v* P( {: K7 b2 Y! {( z2 }
    }; / V; A: |+ ^5 F9 K7 t4 [
    return HEX[x]; 7 B- K9 M6 l. k+ |: J- k
} + O7 h& D5 o$ _  H+ S& Y

+ `+ n& i3 [& H6 p) v7 }int hexCharToInt(char hex) { # H, M; \- s  G, d# J
    hex = toupper(hex);
; B+ f0 v, R( S" z' ~9 i5 p! Y    if (isdigit(hex)) 0 m$ Q0 l) x3 u1 h) Y
        return (hex - '0'); : Z9 L5 Y: y( Y& ^! }; P
    if (isalpha(hex))
& ~! X, }, m2 R& v' X. t        return (hex - 'A' + 10); ' P6 B; U" |7 E/ Q6 f# E; n
    return 0;
- ]) `  ?" M5 ]. v7 d} / Z- b7 r& R9 t9 h7 A
5 O0 f  L. o: @) E
string bytesToHexString(const byte *in, size_t size) { 6 M& u" p- H# `  A* r, z+ C
    string str;
4 m4 s" n! @4 o& w: ?  J: b! U9 H    for (size_t i = 0; i < size; ++i) { ! O# g( p- W. m5 ]
        int t = in[i];   W5 h  s0 u- z0 R  V: g
        int a = t / 16; ' l3 L" U# ~& ~" E) [3 F( Z- K5 \4 `
        int b = t % 16;
6 }' U( G7 c5 T0 ?5 x, v3 `        str.append(1, intToHexChar(a)); # A5 j* g- s  Y8 F7 C' ~; `7 c, |7 ~) R
        str.append(1, intToHexChar(b));
1 L0 _0 D5 W7 f1 M$ p5 c        if (i != size - 1)
9 ~) M- S* a) B" w+ w            str.append(1, ' ');
: ^7 `1 i1 r. G  G7 I    } 0 n* g% g5 d+ A( S( ]" e# ]
    return str;
& o6 _5 @% E' k% I! N} , t1 n; _0 E% n8 W9 S
) {3 q# j6 o5 `. l3 r+ ?- t
size_t hexStringToBytes(const string &str, byte *out) { $ n1 M+ s4 `/ h

% Z0 q7 y- ^$ D2 W    vector<string> vec;
# I# a6 F; n  }8 U  I+ _) c  N    string::size_type currPos = 0, prevPos = 0; 9 Y9 }+ \+ D- q; `5 U/ k
    while ((currPos = str.find(' ', prevPos)) != string::npos) { - s5 B* w: J" p' V% D! p
        string b(str.substr(prevPos, currPos - prevPos));
1 J- e6 k* ?# ?- |5 a        vec.push_back(b);
+ S" q& X1 m/ z- Y        prevPos = currPos + 1;
3 O' p) Q8 R3 a  W) c7 `    } : T) A5 m2 Z, N0 x7 N
    if (prevPos < str.size()) { , J) c: C7 z2 E8 \& _9 y5 R6 \
        string b(str.substr(prevPos));
' M* F  v4 M4 A, c' _$ ~        vec.push_back(b);
' O) V6 h# ^/ Y. U' _    } . H. j, Z$ b) I" c
    typedef vector<string>::size_type sz_type; + Y: J: q5 T( w$ j
    sz_type size = vec.size();
$ g3 A3 R, r7 P$ [+ n9 l    for (sz_type i = 0; i < size; ++i) {
9 e% R( x! e) P        int a = hexCharToInt(vec[i][0]); 9 p/ S* B* N0 X- _$ d. N
        int b = hexCharToInt(vec[i][1]); ) n& L7 m6 I" i
        out[i] = a * 16 + b;
* @9 d+ ^* c2 P    } 6 O; |2 O! N- Y3 J
    return size; 7 T- g; w/ |9 W0 A) _
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
5 P: l4 G0 ?) L- e#define TEA_H
: J2 o& x' d8 h) f 3 T0 ]+ y! E/ R
/*
2 E/ u$ e+ m/ Y9 B- z7 ]. n*for htonl,htonl , L% i& N& R% A% w8 A
*do remember link "ws2_32.lib" 4 ]* D" j$ o3 M+ M  g0 J) K
*/ ' P0 G+ a6 M7 g# H2 C
#include <winsock2.h>
5 p9 w8 n  B5 z8 |, y#include "util.h" 1 ?% E7 v1 f$ c+ R: Y# w1 R( m0 B& ]

( y* u3 l1 H. @, H" ?, e0 jclass TEA { ' Q" `" b8 T5 F' ]2 i3 d: \4 M8 p
public: 9 y1 c7 o! b6 U- o' y# c# O
    TEA(const byte *key, int round = 32, bool isNetByte = false); 2 _3 F$ a! G" H9 n. J
    TEA(const TEA &rhs);
+ k! O# E4 K6 {7 @3 e6 \) D    TEA& operator=(const TEA &rhs); 1 X8 N1 b; T' N
    void encrypt(const byte *in, byte *out);
4 t; z9 x5 S3 ^2 ]1 {, ]6 s2 {' ]    void decrypt(const byte *in, byte *out);
, o5 y- M. M2 I& v* i8 T* Kprivate:
' ~; y5 F2 U- m9 n    void encrypt(const ulong *in, ulong *out); & }7 |: v7 w9 t; Q+ O
    void decrypt(const ulong *in, ulong *out);
; O- \1 I$ ~, L    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
$ R$ w! k$ ^+ O' d    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } * [8 z# \: r8 O% _3 {: n1 ?
private:
2 a7 s7 A* R7 B) z* ?+ c    int _round; //iteration round to encrypt or decrypt % t8 V; u8 r$ N( y$ B7 O+ r
    bool _isNetByte; //whether input bytes come from network 3 K* l# D5 E# q+ }7 Y" a
    byte _key[16]; //encrypt or decrypt key
" x1 g* V# Q5 }7 P( ^2 V}; 6 e4 W, C( P  D5 H3 u* O4 _7 _
# H: _8 A* w4 @- o$ j6 y
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
6 `. g' o( \; {# D. L! a 2 #include <cstring> //for memcpy,memset , k  R, }. f  J) U; e
3  
7 J5 }: z6 p( ? 4 using namespace std; 2 x' m3 G+ ?( w* N
5  2 c/ O" W9 h; |; ]' Q; A# W% l
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
0 d5 J& H4 W; q( a 7 :_round(round)
2 g9 A1 ?& v  F! S8 v 8 ,_isNetByte(isNetByte) {
. R: }! P' i* A+ ? 9     if (key != 0)
* Q$ |" j. I8 g10         memcpy(_key, key, 16); 7 ], n# ?3 `: x8 c# X$ y
11     else
. E4 L& o" L* ^! ~: T5 [; L: n' Y12         memset(_key, 0, 16); - P9 G' R( g7 w- o/ ]) R, H
13 }
+ u* d  y& u7 S+ _14  7 p9 _" L9 r5 b7 v- v6 E% [5 i
15 TEA::TEA(const TEA &rhs)
) b; t0 o* j! a. S3 e) z! {16 :_round(rhs._round) ' Q2 q! e% s- L5 l/ }2 r* _* L
17 ,_isNetByte(rhs._isNetByte) {
2 p2 L" r9 H, d- t7 L, U; {3 F18     memcpy(_key, rhs._key, 16);   g. D! ?7 _; P% M
19 } # j' k, N2 \6 M# _8 `
20  
% X# T2 p$ i+ V& k- o21 TEA& TEA::operator=(const TEA &rhs) { ; e% J% o8 q8 H1 P- r+ S  \9 ?
22     if (&rhs != this) { - J1 f2 K7 ?$ A
23         _round = rhs._round; ; O! a0 L1 Q7 ?/ r& a
24         _isNetByte = rhs._isNetByte; 4 t9 ~" K+ O2 w. I
25         memcpy(_key, rhs._key, 16);
" G; q( ~; S$ `) E: j- y26     } 9 [. |; g, ], y3 k5 R
27     return *this;
% ^! z/ _& ?! b  h( o28 } 1 q1 K" A% ?2 A2 d3 {/ T4 {, q
29  
: Q; s5 T* b& b# V* F, N30 void TEA::encrypt(const byte *in, byte *out) {
) w- {4 C. u" h0 t  H/ Z4 N% ?31     encrypt((const ulong*)in, (ulong*)out); $ I( ?/ T& v' Q3 R+ I
32 }
, g  M: ?$ Q: B33  
# J) t; ], @3 o  y9 ?% y7 }34 void TEA::decrypt(const byte *in, byte *out) { / S% {, {% t, E' S& Z0 }, s3 m
35     decrypt((const ulong*)in, (ulong*)out); , U6 c8 h5 e' q, W4 V/ g% F- E6 |
36 } 5 O7 ~4 N3 G8 S) n
37  / k) P" `; y; t( ~
38 void TEA::encrypt(const ulong *in, ulong *out) { " ~( {1 A) d2 G8 e( h% @7 R( T
39  
* y7 u6 ?5 [" n; B* ?$ t40     ulong *k = (ulong*)_key; 2 T. ~8 \9 h( N" k5 o
41     register ulong y = ntoh(in[0]); 6 d3 X& g  }' i# Y
42     register ulong z = ntoh(in[1]);
3 x5 u" f! K" o43     register ulong a = ntoh(k[0]);
: W# [: G: e# t+ Q44     register ulong b = ntoh(k[1]);
" T+ b3 ^7 V) u" G0 S1 p45     register ulong c = ntoh(k[2]); # U7 N3 n& {* X& x' a5 F
46     register ulong d = ntoh(k[3]); 1 M# H1 d, M9 `
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
/ [2 _" R7 h( ?2 N4 z48     register int round = _round;
( K# z3 r0 i7 G+ c5 l/ K( M9 n8 U49     register ulong sum = 0;
: b2 ~2 Y$ V7 U  ?3 l  W50  & a' b' R) S0 M* @3 N/ J+ |
51     while (round--) {    /* basic cycle start */
5 |% k1 R/ ~; |1 o, S& i( l52         sum += delta; # b, l7 {0 x$ b) c/ F* b4 c# I% f
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ) V. ~) W1 F, a1 p$ |& \/ N5 I- ]" v
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 1 o: [  c- N9 M( l0 d: k# X/ q5 M
55     }    /* end cycle */
! {& `7 O" C; A, ~56     out[0] = ntoh(y);
8 |! A& }8 m2 t57     out[1] = ntoh(z);
! a4 @1 j; P% _$ q) ?58 } , C/ D5 k! A$ N; x
59  
' I7 M8 C2 P# }, l; e% ^) k60 void TEA::decrypt(const ulong *in, ulong *out) {
) d/ E2 `0 o% O' Y5 W; `6 f+ K8 G61  ) ~% u7 ?; N! w* c
62     ulong *k = (ulong*)_key; / L  [1 P9 w% |( h
63     register ulong y = ntoh(in[0]);
$ l3 {4 `8 D. M  ]: O64     register ulong z = ntoh(in[1]);
( @; v" f: f: Z65     register ulong a = ntoh(k[0]);
3 ]* l: {2 Q) }& ?" P- i, l66     register ulong b = ntoh(k[1]); 0 V3 _+ c& g# i/ n- f4 _1 ~8 V
67     register ulong c = ntoh(k[2]); 1 L) z' `2 v2 F- w  K' F- {
68     register ulong d = ntoh(k[3]);
4 r/ B: n* T% r( k# |2 t) R69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */   S. w( A& x- w# `3 W
70     register int round = _round; " {7 t6 G* p. t+ j9 M
71     register ulong sum = 0;
; W+ S+ }/ B; E72  8 Z6 @! |3 ?! @8 K7 B2 O7 y) e
73     if (round == 32) 0 o7 w3 A! K' N8 c: F; Q
74         sum = 0xC6EF3720; /* delta << 5*/ 3 p  h2 b6 g5 L
75     else if (round == 16) 8 g4 m. x  s& G! U0 U
76         sum = 0xE3779B90; /* delta << 4*/ ( E. b9 [& J- X; V1 x. f! F" y9 R1 f
77     else
. a, q; e) n9 l* M$ N78         sum = delta << static_cast<int>(logbase(2, round));
" m% u4 e6 d5 O8 s+ }79  
- O* O4 j' z1 i3 f+ ]80     while (round--) {    /* basic cycle start */ ) X3 P$ H) P' @) W& ?# j1 K) c
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 0 M/ y7 ]0 b* f
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
. d5 m# }' A; S" f" T( ^83         sum -= delta;
$ t  F. f$ [' k3 q7 M! ~84     }    /* end cycle */ , D* f, ?6 G5 B8 F
85     out[0] = ntoh(y);
% B, }7 c; ?: K$ ?: P. d5 F. Z86     out[1] = ntoh(z); " e, R1 S3 M- u, H
87 }
) u$ `$ |4 D; Q8 x* P0 D) P( C/ T% e4 c3 w; c, [
需要说明的是TEA的构造函数:
. }. p8 m8 U0 N2 k% u: x+ qTEA(const byte *key, int round = 32, bool isNetByte = false); ) }0 o+ l1 ^2 T% ^/ b
1.key - 加密或解密用的128-bit(16byte)密钥。 ; i& u4 E. h3 ~# C/ w$ }
2.round - 加密或解密的轮数,常用的有64,32,16。 & V/ |6 N; @, q- A9 n6 J& Y0 P0 L
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! : w) H" |$ _5 o- T( Z
  Z. l. w" M" P0 q' M4 W
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"   s, A  t9 r+ O! T! i8 g0 Z. B! W. R
2 #include "util.h" # ~: Q! [6 {# {8 v+ f/ l; I
3 #include <iostream> 7 h5 s8 r4 H0 [4 i* G, m0 o
4  
5 Q/ ?8 @5 N7 G  \ 5 using namespace std;
- C4 S5 j7 A( j2 a  P8 V# k 6  . e( _# g. T2 [5 \4 Y
7 int main() {   r1 i5 b1 M3 g  `. j+ Y. J
8  
* D6 u4 G% @0 P3 j: `1 l- S) p 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
( Z' v+ j; P2 j# M% u5 o10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
3 a5 j) Y0 _0 F0 N11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
5 c5 S7 e# b" E12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; + c+ Q  J" }  ?
13  
6 w5 V; Q  h. F) W! z14     size_t size_in = hexStringToBytes(plainStr, plain); . u& u# {- a5 P, C8 Q: W0 n
15     size_t size_key = hexStringToBytes(keyStr, key);
! u' C) z! ?/ d16  
/ z7 j% |3 t8 D( m: ]8 q: }; `; p/ c17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 6 T2 i5 P  Q2 q* N( R# j  Y* Q
18         return -1; $ [5 Y3 F& ^( U, c2 H
19  + ]/ `; c+ H( c
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
" y; |+ c4 ]! j3 F9 m21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
$ z# x$ D: k( i  d8 ?) ]9 n" H22  ( @- i3 @, h/ M- K) B' H, u& @8 P
23     TEA tea(key, 16, true);
5 E+ t1 {+ x+ w: g& y24     tea.encrypt(plain, crypt);
# F0 H9 q; N8 S) x- m, g25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
& A; f( W0 x/ D% \26  + D: G$ r" a- U0 B0 R8 c
27     tea.decrypt(crypt, plain); : G# u; ]+ H0 K9 V
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; , m- ?4 u! L; I, G
29     return 0; / r; k) J9 D9 Y4 I1 v9 D
30 }
( O: U: L6 `3 {0 Y0 o; Q* z7 Z1 `. i/ w9 Z) r: u# b3 E
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
: X" `0 u: u, |# c1 p运行结果: * ]& L( X5 w  b  t  K  ?7 Y
Plain: AD DE E2 DB B3 E2 DB B3
1 t* r" Z2 y5 k; b* ~5 j0 Z  AKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 + d1 V- Q% S! u- q5 V0 _$ o8 X
Crypt: 3B 3B 4D 8C 24 3A FD F2
& @( P" c2 S1 `) n& P! F+ ^Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 07:01 , Processed in 0.020067 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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