找回密码
 注册
搜索
查看: 37810|回复: 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轮):: R2 ^9 c" b1 z: m2 r! i0 Y
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 : b: k* w7 \( t1 y% W  P- i4 D
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 " v- N" O3 L1 H; w+ F
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
! i6 o1 O! `; {9 o3 X8 x8 N, q在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
' K9 b! R+ g2 ^在 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. / O+ B+ p# q7 y5 E
  2. void encrypt(unsigned long *v, unsigned long *k) {
    0 q, N8 a! V( h; d
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ( u/ j4 R9 c" E6 L6 M6 }: H+ @
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ! w& h- u, z* \/ C/ V3 B- z
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    % T2 U1 o' w( I5 q" w3 @
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    # S/ n* n6 G2 @2 l* R1 b6 S- |
  7.          sum += delta;
    ( A! z. n9 N7 [
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ \. T6 R. m; u: b
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ : g# L2 F6 D( R2 D
  10.      }
    * q$ p; D; z# i0 c* w' s3 M
  11.      v[0]=y;
    ; k2 i& j" a/ I* D+ k" F
  12.      v[1]=z; ; O& Y: ^. z) p$ O8 h# ?/ ?+ K
  13. } 8 U* Z3 m) t0 H# G3 `8 O
  14.   1 o" Z: h9 o6 e# h* e% R
  15. void decrypt(unsigned long *v, unsigned long *k) {
    " ]% D. i1 M$ @. U& l' t  }
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ . x9 ?; `* `( P# ?, T  T3 Y5 W
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ; z0 V( j# D' K6 ]2 ]
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    9 {0 C7 d7 f; f8 P
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    1 z! w7 s( _$ V9 {+ l6 F
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    6 o8 m/ H% i& ]7 c* ?4 b
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);   S" Z4 I/ T7 t5 o+ j& Y
  22.          sum -= delta;                                /* end cycle */
    9 M" O* m8 Z; j/ I& l4 N0 I
  23.      } & a1 d9 Y/ t& z& Y3 O
  24.      v[0]=y;
    $ H& t1 `6 _* ~1 U$ O) y3 L0 e7 J
  25.      v[1]=z; $ c% b& u5 q2 b+ n3 T: [; }& W
  26. }; E; T5 a' f; X5 U0 @
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 2 R8 r+ x7 j6 t4 o5 g2 f
#define UTIL_H
" V; l4 ^4 B+ a7 k0 u5 |& t& o
' u* c9 |4 F+ ~7 K% X$ g) ]0 X% z7 u$ w#include <string>
7 z: g( l8 p0 X  j9 s+ S9 s  k, E5 P2 h#include <cmath> 9 n; f& }- Z% S. v( A
#include <cstdlib> ! M" e4 H5 ~: L& h8 G! F( J) Q4 s

6 U" `: u3 u3 ztypedef unsigned char byte;
1 r: a- Z1 r, L: @0 c; g6 ftypedef unsigned long ulong; ; o5 p/ J& Y0 p5 \6 J& y% c: r

! C( C% h, M0 M: U2 Minline double logbase(double base, double x) { * }7 {6 y( e  y+ P$ K
    return log(x)/log(base); % z  j- ^, L! y. E
}
3 a; L! H+ U5 o" u: Z
7 K. A) N8 M5 b* l' ?$ Q& ~/*
3 \% X+ `" u1 I2 z& r% X  T*convert int to hex char.
+ k9 Z, S1 D. ?  f$ l" W$ O' A*example:10 -> 'A',15 -> 'F'
6 H8 X4 E$ G& z$ T: [3 S*/
( x- o) e8 \; H* `char intToHexChar(int x); - u0 t$ U( V/ i0 i. _* A7 S; ?! y

& Q9 [$ C) B" ~6 g+ d/*
4 B( `# l- P- K0 ]' E*convert hex char to int.
/ b* u6 r( E0 Q- I, x9 t*example:'A' -> 10,'F' -> 15
* L; E" {3 c! u: n5 b$ n, [: ~*/ * Y% a) z8 p- s3 y! K$ P9 g  F, ~. V  ?; I$ M
int hexCharToInt(char hex); 4 k5 }( R7 \7 x' `+ T+ R

# X; m5 b- L# g' i" ousing std::string; 1 I: `" K& H1 ^4 H+ x0 R$ g. M
/*
7 S; L( w" M8 j$ O% s, C*convert a byte array to hex string.
: c  Q. E+ i/ _% B+ q6 K( Z*hex string format example:"AF B0 80 7D" 2 x* t) A/ A* q5 \# j% c& g) T9 H
*/
8 s" _( f0 T+ r! `( q4 Ustring bytesToHexString(const byte *in, size_t size);
3 t1 `: D* Y& c4 Z9 b * L, f+ \: t+ m/ ?/ d. V
/*
& K% A# F( z0 b+ U  Z*convert a hex string to a byte array. ' I) q# d3 s6 N, J$ [" Q
*hex string format example:"AF B0 80 7D" 0 O7 H1 N: ^- @- A6 y
*/ ! W% J9 \2 y+ T
size_t hexStringToBytes(const string &str, byte *out);
+ |- m1 ?# m$ W: u) q7 h
$ i) n, @0 C4 R8 `#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
1 t+ z8 ]( g- v2 p8 d5 n) a#include <vector>
+ Q; |1 v3 P9 _9 ?; K ; Z, a3 o3 ^% L2 \1 |
using namespace std; - u/ Z. @8 r* `6 U) [4 B, j; {* h
& Q6 \6 B5 s: K
char intToHexChar(int x) {
3 O/ \+ U/ P, j) T0 r+ @    static const char HEX[16] = {
( p6 E5 t- ]  v$ S' D1 e        '0', '1', '2', '3',
' W. i- i% l1 e- K. `        '4', '5', '6', '7', ! K; k3 S4 |7 W  {& C% c4 M3 Z
        '8', '9', 'A', 'B',
! k' U' e. j" \        'C', 'D', 'E', 'F' ( A7 B# x% _2 Y7 M* m) V8 a0 l$ b5 j
    }; ( j3 v* q& R  ]2 U
    return HEX[x]; 0 w7 x1 _7 M, p1 Y; Y# k5 ]
} + v9 ~1 r/ p1 N. M: Y

  K" T6 p4 }2 fint hexCharToInt(char hex) {
  ^' Q+ \- A: C    hex = toupper(hex);
2 R2 g2 M5 |$ ?6 T! w" [    if (isdigit(hex))
& ?& @+ y) V) c& a: M1 L3 u        return (hex - '0'); & ^" t9 R3 J. p& D! H* x- ^% F
    if (isalpha(hex)) - I7 V" @4 D, O( m$ j
        return (hex - 'A' + 10);
7 Z* i1 E$ V. z- H    return 0;
8 H4 M2 Y. j  a  _; f. L9 q}
/ L" W* t) D4 r* x1 b9 C* L% O / r. _' Z) c. j9 O8 r
string bytesToHexString(const byte *in, size_t size) { 4 V6 R9 `: X% k& B. S) }+ W! u
    string str;
) @% K; R3 a$ H3 h, L2 @1 K    for (size_t i = 0; i < size; ++i) {
, t  C* X. J  t        int t = in[i];
2 {) d8 r' [/ R! Z! {        int a = t / 16;
2 W; \6 i5 j: k9 d* u# C* l) g8 \        int b = t % 16; / l6 X7 d3 d% V+ q& V. X, P
        str.append(1, intToHexChar(a));
+ k. z. g  N( v# C! Q4 H7 G        str.append(1, intToHexChar(b));
) o% y. V3 q* \5 n8 O2 I+ I        if (i != size - 1)
& b7 y2 z* Z% l+ M8 n            str.append(1, ' ');
# J0 T4 m- V- N: W/ i! r2 h    } . T. V3 ~& y$ b
    return str; * f" Z+ m0 G1 z6 S
} 2 |4 U% a0 u$ E4 Y! n
% C3 T7 M" Z& O8 s- O" e' x
size_t hexStringToBytes(const string &str, byte *out) {
9 Q8 A; d# w) l4 \5 F5 W# X + E- k5 W8 X& d2 N/ E& h
    vector<string> vec;
# x/ F. r1 S; l; Q, e    string::size_type currPos = 0, prevPos = 0; 8 I; E! Z9 I' V2 |6 |
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 2 T% k8 p. G# G! N- c5 o: F$ [2 m
        string b(str.substr(prevPos, currPos - prevPos)); 0 h3 E/ t! m$ v1 T6 k
        vec.push_back(b); ; f' c& h7 v! C5 {2 ^
        prevPos = currPos + 1;
: M( m! d* d" L    } ( K1 n, m; I9 |: f% j2 M
    if (prevPos < str.size()) {
2 o  K; o- y6 ^7 Q9 V        string b(str.substr(prevPos));
& W$ J4 _# N" w  d% D( {! i2 Y# M        vec.push_back(b);
4 H/ ]1 h( m! J5 w: P    }
. _6 u8 f% M2 V6 {% F    typedef vector<string>::size_type sz_type; " I7 B, o3 P, ^6 ?7 h# E6 M
    sz_type size = vec.size(); 5 t! S0 K. i1 [+ L  D
    for (sz_type i = 0; i < size; ++i) {
! A! t" d! l4 {0 j, V        int a = hexCharToInt(vec[i][0]); . x6 q2 ~- Q1 d8 [6 g4 k
        int b = hexCharToInt(vec[i][1]);
* w$ O( f2 Q8 I. g        out[i] = a * 16 + b;
7 Q* \$ p* ~7 `9 I( b; w7 N    } # Y& R$ s/ y, U! U
    return size; ( |0 ?. J: C' q6 g4 N1 P3 x- ?
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
2 F* J  S& e9 K% H#define TEA_H 4 m" @( G) C% P- Q3 p

" H: `" a2 G& K" U/* / N& ^5 s5 B6 p- C% \$ z! d* O
*for htonl,htonl 4 w* ]/ X5 e" W$ K' L' F
*do remember link "ws2_32.lib"
" C  ~2 _2 d8 [* l+ W0 n' ~*/
( S9 o  ~# h1 e, ?#include <winsock2.h>
6 i  D4 d: S) d* ^" K' w" P#include "util.h"
% c8 K) S+ i; p0 ?) D8 ~: E# S
2 E9 J9 {. z! W/ rclass TEA {
0 D6 _3 Z& e; f3 Dpublic:
4 e* a1 a( N  e3 r    TEA(const byte *key, int round = 32, bool isNetByte = false); - O4 k# I& |7 c- ^/ q: e
    TEA(const TEA &rhs);
' x% U5 \# `) w+ }6 }    TEA& operator=(const TEA &rhs); % @; L( S9 l) K/ B
    void encrypt(const byte *in, byte *out); ( p4 q; Q( w- X
    void decrypt(const byte *in, byte *out); % `: t' [8 Y, q# ~7 f5 \
private:
: c) u' B$ I3 U1 k, U4 D' C    void encrypt(const ulong *in, ulong *out); 5 M; ]( p& c6 z- L+ [
    void decrypt(const ulong *in, ulong *out);
* @4 U# \, H, j% h  l    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 8 V% S! @. P* N1 q# ?
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 2 e& a5 {) C, Z9 N: q( |0 m
private: / w0 Y/ B% @9 `7 m
    int _round; //iteration round to encrypt or decrypt ' |$ Y* x4 H, J* f% \& ]! r
    bool _isNetByte; //whether input bytes come from network 3 n5 J1 s! b$ @% S. E  ^6 C
    byte _key[16]; //encrypt or decrypt key
2 k5 M. y3 y0 B0 Z}; " f- H2 C$ l) x9 |1 v
/ S  v2 X- k8 L7 ~  s0 _0 E
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
9 M# o/ n9 H6 w$ @6 U 2 #include <cstring> //for memcpy,memset
. Z* Y3 z8 w- T 3  
0 _' M6 N, l( G$ N- V 4 using namespace std; 1 i6 b: n* i; v9 I6 M
5  
3 z" M6 Z1 }* |" K 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 8 Z8 I5 y. J2 J2 h+ Q' u
7 :_round(round)   V8 n& y: G8 s& u: O5 y+ M8 M& w
8 ,_isNetByte(isNetByte) { , [& B' H7 D; X. L
9     if (key != 0)
: i9 p& d+ x3 x- K$ q10         memcpy(_key, key, 16); 4 i* `+ T3 {6 \3 f, s
11     else
% O4 i: {$ I; r& `3 X9 ]% e5 b12         memset(_key, 0, 16);
- E. P8 V- r+ T! y13 } 5 O/ N, f3 L1 H2 w1 o9 S* m
14  
# A. X% k0 E/ U9 J/ t( ~3 S15 TEA::TEA(const TEA &rhs) ; `9 ]: W4 m+ h8 S! J4 G1 F
16 :_round(rhs._round) - F" Z4 r4 G, b3 i/ b
17 ,_isNetByte(rhs._isNetByte) { + c4 e0 c5 N3 ^6 n0 v8 |  B, r/ c! R
18     memcpy(_key, rhs._key, 16);
& }1 ]7 m( U& y  \/ B7 x$ f* O19 } % b& E. [1 J  u
20  
4 S  l3 ?5 f1 |5 K! J, o21 TEA& TEA::operator=(const TEA &rhs) { 2 g2 P& Q& N1 B
22     if (&rhs != this) { & C! o  S$ Q+ u4 S4 M
23         _round = rhs._round;
6 a' |% i, o: \7 w! S: A- Q24         _isNetByte = rhs._isNetByte; ( x: ]$ K! T/ e1 i* u
25         memcpy(_key, rhs._key, 16);
( P3 m# U! C3 e$ P$ f+ g26     } " b! G4 I' H+ f% L
27     return *this;
, ~- v3 L7 O! f9 C9 M$ h+ h28 } " E7 y8 ~' V( j
29  
# X# }. H( Q' @2 T- B; o30 void TEA::encrypt(const byte *in, byte *out) {
: ]/ U. t. F5 n; g31     encrypt((const ulong*)in, (ulong*)out); 5 ^4 v: q) B. s; P8 X. _. g( w
32 }
! ^/ p4 y! O& C" I$ ]1 u33  / Z+ K+ U5 D; D; H
34 void TEA::decrypt(const byte *in, byte *out) { ' R9 f% @3 b+ i3 t8 e0 v7 A
35     decrypt((const ulong*)in, (ulong*)out);
4 [! O9 |' @. e36 } 3 \' @5 p  z, `6 b' N
37  
1 Z( h7 x5 m5 {! g& R) I0 ^2 a38 void TEA::encrypt(const ulong *in, ulong *out) {
9 V* }, A$ G& J- `/ Q( ^39  - `9 k' N" P! ^1 s4 }$ ]. k3 g
40     ulong *k = (ulong*)_key; 8 y5 k) K4 V( l/ P$ l0 }% }, l/ H
41     register ulong y = ntoh(in[0]); , ~( f" W/ Z6 I0 w9 `, n# r0 X3 W
42     register ulong z = ntoh(in[1]);
1 i4 M1 t& v4 _* P43     register ulong a = ntoh(k[0]); 3 M+ t! ~, A& i% V/ Y
44     register ulong b = ntoh(k[1]); / W! y" z) h- t2 w
45     register ulong c = ntoh(k[2]);
5 k5 a( e* I" y" z( f46     register ulong d = ntoh(k[3]); " G8 r# {( Z9 q- B) l$ t
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
) M! u+ F. `6 k48     register int round = _round; # P  M/ E  d- j4 p, S
49     register ulong sum = 0;
; i0 Q8 a  s, A50  
* ]3 N: \8 D& ]8 u% i! N51     while (round--) {    /* basic cycle start */ 7 n$ d9 j9 K( Z9 U; {
52         sum += delta; 1 G1 P% e5 b# Q$ ^5 P
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
. M6 V1 W2 ~8 L/ O( |- O' ]) |3 n54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 9 S/ J5 l5 c& L& E8 j
55     }    /* end cycle */ ! v8 g' @' e) @
56     out[0] = ntoh(y);
# T. Y* Y$ m0 {9 D! p57     out[1] = ntoh(z); 5 `" k+ j- B7 F
58 }
; x; V5 B4 `, x* x5 }' q59  
4 W( A$ V( o) m/ ?60 void TEA::decrypt(const ulong *in, ulong *out) { ! ^# E0 `7 J+ Z9 ]" p
61  
0 W+ C- D8 F$ C* O62     ulong *k = (ulong*)_key;
- z/ W$ o& \) `  s63     register ulong y = ntoh(in[0]);
/ H% T; c: r6 w, d! r- [64     register ulong z = ntoh(in[1]); 6 d# R" S( W3 v9 }/ K4 @; ?
65     register ulong a = ntoh(k[0]);   t* \" c. Z  R% v: o# h; K2 a
66     register ulong b = ntoh(k[1]);
) f' y9 c" x; N5 C6 e67     register ulong c = ntoh(k[2]);
7 U% C# U# ?( |1 a1 W: J68     register ulong d = ntoh(k[3]);
9 _, Z; ?% [# x* F  U& H69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
3 ]- h. `  U" D. n+ H" c/ m70     register int round = _round;
: I" h; |2 m1 W% S. K71     register ulong sum = 0; ; k1 y8 @) G& [7 I
72  
) x/ i+ M+ z% _+ _* L73     if (round == 32)
! I" g0 @0 N* D7 G/ g* ?- T4 v74         sum = 0xC6EF3720; /* delta << 5*/
1 d4 i8 ~" U1 ^9 _# D7 Q' q75     else if (round == 16) / S6 Y; n8 t% K. l3 z7 I
76         sum = 0xE3779B90; /* delta << 4*/
7 v" [6 E5 s+ W4 J/ u  Q! @77     else " ~1 H4 A& o9 Z' C& w
78         sum = delta << static_cast<int>(logbase(2, round)); . o1 |- ?" M4 P( s! u" F+ z5 O$ v
79  
3 X# B& d+ C5 O* V6 E" G2 b/ L80     while (round--) {    /* basic cycle start */
8 s7 \% p# b4 }  N5 g* [; [" z! T81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
1 L, D. D, Q5 E82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 7 e6 z2 v7 L4 a4 \
83         sum -= delta;
9 R% m. u/ p; _% k84     }    /* end cycle */ $ l8 z+ A! b. R& O; U4 C
85     out[0] = ntoh(y);
9 @) I. U& t& z1 o, u86     out[1] = ntoh(z);
1 V: H2 m# z" r. b87 }
* u' D" j2 R0 G7 G4 ^8 }% a% F
& q7 g* n+ w" E9 `) B需要说明的是TEA的构造函数:
7 B, h1 V: a2 f4 _6 B1 C& RTEA(const byte *key, int round = 32, bool isNetByte = false);
( [& \! y% j: q: Z3 G1.key - 加密或解密用的128-bit(16byte)密钥。
; v' `! {1 O  [; r0 G. T, ~$ z6 G, e2.round - 加密或解密的轮数,常用的有64,32,16。
7 z1 R: ], f  a: J6 a3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 9 o- m6 j4 T3 m; h$ ^8 h6 P1 G. m* Y

+ q0 \  b+ A. \8 m$ C" c最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"   [- q4 a  E# T, R; S
2 #include "util.h" - Z* T+ e% o2 K7 @& z  K
3 #include <iostream> 8 R! \, p2 ?' c# p! p0 s  G. w
4  9 H9 z, r" N4 l9 R2 B1 r5 b: B( u
5 using namespace std;
: L0 B% \- H3 R. A4 u" s$ T$ Z 6  
/ u# J2 Z( m+ J2 ^ 7 int main() {
3 \/ @. a9 ?" P/ b 8  4 y; j3 F/ ^9 d
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 2 H" u% j; s3 E% I% O) ^" U
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ! B! t9 k# h, o: a  D
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
4 T" h6 j( H% J( T12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
# @& _9 y  P$ T, P3 q4 j+ L13  : p9 b. C( @$ Q6 A
14     size_t size_in = hexStringToBytes(plainStr, plain); . s3 z  _/ `7 U6 |
15     size_t size_key = hexStringToBytes(keyStr, key); ( A) v* |( e6 @2 j9 ^; D. v
16  
) n& _. @. O3 ~/ X: M1 W$ ~6 r+ ]17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
/ S- |. J' C1 p18         return -1;   U1 c& ]; d5 P
19  
( U, f6 J4 M& u( s7 p7 b20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
9 }( _9 ~* U1 k' Q: w% i% ]( S7 q21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;   _( w: r/ Z4 N" ~6 p' U) u
22  + k$ @* c8 C- j! c# n* q; F
23     TEA tea(key, 16, true);
1 z# S+ v7 h, r) j* a24     tea.encrypt(plain, crypt); . i  ~  X  i+ G7 V0 r( z
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
& ]; X3 c* t' W! y- W) r26  
# {9 u6 `% `4 p' `: L) y1 m  w27     tea.decrypt(crypt, plain);
6 }' m8 s0 F- t- y28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; , A- m  s1 ]" w& H+ u8 P
29     return 0;
& r7 i9 D! \5 c! S5 X7 Y30 }) Q4 @" E; W1 L  [9 M/ b: {
  D  m: B% @" p1 B) O3 f3 n) L
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
; M9 d7 g* X: h# o; Y- B# N4 J9 c运行结果:
% L8 `. F+ {' M7 I3 v: f4 n+ l& w/ o0 JPlain: AD DE E2 DB B3 E2 DB B3 ) z/ f9 w& T, b7 T
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 1 p4 l7 y# l& |# V7 H# i; @% Y
Crypt: 3B 3B 4D 8C 24 3A FD F2 " y1 J# h- ~  i2 u
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-27 20:00 , Processed in 0.021197 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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