找回密码
 注册
搜索
查看: 37384|回复: 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轮):
/ a4 k* h" D9 i; Z微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 / y# b' \  Q5 X4 u( e( j: R( g0 v
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 . X, Y8 W% c  S* V+ _# K0 a
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 & w& ]8 d* N/ R6 l; W4 M( {
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
6 g- j& S' U( g* C, C* F: M在 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. # t! L( x- |+ h+ X  U
  2. void encrypt(unsigned long *v, unsigned long *k) {
    5 O# W( U- q: P* a  f
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 3 u6 j; x; K& ^; l
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ! _8 I; y5 o% P) L
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    $ ?7 ?1 Z  }6 x5 O3 P
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) i  r! @) X, U2 {( o% d
  7.          sum += delta;
    ! m+ _5 u7 S" _: f' s: z" R: z  X
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    4 T  i4 p  H& @5 N( U# ~2 O
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    % M% l+ ]' ]( ~
  10.      }
    % \. T5 S- t( X& Q
  11.      v[0]=y;
    : b7 a9 E( O. C6 I: \
  12.      v[1]=z;
    : S9 g8 F8 O9 P5 S, |
  13. } 3 F. Y6 S$ l8 z0 N$ f% U( w
  14.   
    ' L" Y% w) [5 w
  15. void decrypt(unsigned long *v, unsigned long *k) { $ T! r* K8 e8 h/ p: S1 ?" ~$ Q0 Z
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    , S2 {6 S: g: {4 T; l; h
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    $ H; V" f8 D3 o  @
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    8 V7 q( k7 c# h7 q" W; N/ {
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ! F6 w  |7 h; }0 p( e& R- e
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); , E* [7 u' _! J
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ' C. d. j& O9 n* E0 s
  22.          sum -= delta;                                /* end cycle */ ! f- F# \; l$ E# P% U& m" [
  23.      }
    0 e; d  F- H' H# g0 m
  24.      v[0]=y;
    : b$ u7 X; j* Y: |, i2 m3 R4 l; E
  25.      v[1]=z; ' _( m( b7 t* n4 c5 m: ]
  26. }
    6 _6 d' r2 t5 u+ g+ A0 c
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 0 o  _: J3 T( s$ `; F
#define UTIL_H
9 |: J  e6 L  Q0 }/ b' o
+ A& E3 e2 ~) ]8 a  s' H6 i4 `#include <string>
( b+ |/ {9 s5 E' {% j) y#include <cmath> . x- \# i1 Y, J% V* h
#include <cstdlib> # K. B( ]: s1 m+ G+ s" Z8 [
8 V; B/ B: u+ h# p. S. `, \
typedef unsigned char byte;
! Y+ I6 D5 L/ i) b% Ftypedef unsigned long ulong; ( T, m6 Q) w" ~" t" F- Y# U
+ \; m- A2 P9 U! }$ n! N
inline double logbase(double base, double x) {
1 C! D$ V; x/ c5 r5 f2 a( J    return log(x)/log(base); 6 k  K4 U2 ~2 F& k! y" w* S
} 5 h/ W. ^; b, J% h) ]

5 X! M* n& r) P5 {/*
7 v- P7 T+ E1 S9 J6 r7 X8 E9 l*convert int to hex char.
/ k! u# U9 p! P*example:10 -> 'A',15 -> 'F' ) d: Y/ l! Z8 s1 g
*/ : `4 A4 d& n, h7 `3 q3 g% x' ~! h- T
char intToHexChar(int x); 1 r( G8 }! z5 s+ C! J* C

; J8 _& r7 b4 V: X; u( P/* # f: [1 V5 R! }: v6 u( l
*convert hex char to int. 5 j) d2 q5 ~% k2 Y8 _8 n6 l! H  h9 e/ F/ A
*example:'A' -> 10,'F' -> 15
# d. L5 X) ]$ \/ A/ w*/ / m3 Q: K5 z4 d
int hexCharToInt(char hex);
; E% v7 G' N+ ~8 e, C5 P
$ R+ K1 s1 q) yusing std::string; 2 N. v8 D- \' L3 K: [6 D
/*
7 H: k  L+ v7 N2 D4 K. j- k*convert a byte array to hex string.
; L+ g* G5 W- N1 R6 @*hex string format example:"AF B0 80 7D"
1 U/ Q, i0 [- O6 X: o*/ $ q1 o/ Y# ?2 M6 Z
string bytesToHexString(const byte *in, size_t size);
; O: p' d  a3 r& ^5 M+ w8 c $ k& _% G1 k. c$ x' z, C# t
/* ( D( w+ R7 i0 }$ C
*convert a hex string to a byte array.
& `, @* G; q8 n3 H0 V- D7 f* d*hex string format example:"AF B0 80 7D"
  o+ ?! T1 T8 ]+ o2 D8 p' H9 r*/
0 K6 s3 L1 ^- ~7 t: n. [# g4 t/ Tsize_t hexStringToBytes(const string &str, byte *out); % U1 Z, q) E$ |$ E5 r4 k( T6 _

6 d. s  i1 s- \3 L8 H8 U9 u3 w+ r4 G#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" % p0 L2 a: \. }6 d
#include <vector>
& \7 m5 z* Z" k: e, Y* M" P : M! j9 |8 `' Q0 r/ Z9 V( J/ d1 T
using namespace std; ; m: h! M( Z5 H1 `9 s6 ]

$ [' u5 G' }: C" wchar intToHexChar(int x) {
" w- `0 ^2 E" j3 |* r    static const char HEX[16] = { : \1 b+ S3 n! m) V/ l3 m# J
        '0', '1', '2', '3',   ?6 [5 v. O/ ]  y* e. D; G- r
        '4', '5', '6', '7',
' T. ]) Z" V8 ~        '8', '9', 'A', 'B', ) ^9 u) Z3 _: r1 T
        'C', 'D', 'E', 'F'
" K6 |9 k$ K5 U! ^) x7 [    }; ; S4 P+ f; ^9 y6 y6 g; W, S
    return HEX[x]; ' A, l& W' ^! h5 a6 V! f* q" r
}
5 v6 }* x0 W( w8 H/ l2 u# d5 j ( J/ J: J9 V0 y6 O! R5 C9 g, u
int hexCharToInt(char hex) { ) m  {* @2 i' {; Y1 ~7 `
    hex = toupper(hex); * L$ @* D$ f8 i4 i' v
    if (isdigit(hex))
2 I( `) U% p, d3 E4 E        return (hex - '0');
6 O5 v7 D8 Q, }4 u6 Q* A    if (isalpha(hex))
  F  J" m; w3 }6 @        return (hex - 'A' + 10); " F3 ~" J$ ?4 w# r9 l1 @9 Z0 D) K
    return 0; / s0 o. q* X) W8 J  t
}   ~$ f0 X8 H& o4 Y' Z8 S' S6 u

5 G8 ?. o( T" `1 h  K! J, u2 zstring bytesToHexString(const byte *in, size_t size) {
) |/ F0 x/ b- s+ _$ g    string str; ( ^) C, t% K( [* [5 f! F7 M
    for (size_t i = 0; i < size; ++i) { $ P8 k. x: B/ R5 n) d
        int t = in[i]; ' B- u' Y4 n, {! k; R! {$ \& t$ K
        int a = t / 16;
" Y7 ~! [0 P# z# k        int b = t % 16; - l8 [8 |5 J* F4 y" H8 i5 `7 E" U/ }  B
        str.append(1, intToHexChar(a)); 2 p1 v7 C9 N2 x" M! {' Z3 E' m6 r
        str.append(1, intToHexChar(b)); 9 I: A  j. ]" _) r. a, {
        if (i != size - 1)
8 j( v, t7 H* G9 r8 n& ]' ^            str.append(1, ' ');
: R+ [; ^; t* X5 m/ k7 S9 @    } 6 l/ m4 w5 ?2 z9 w9 e* }8 r
    return str; / B$ O% c  x& g" A: [
} 7 y" W/ z& m1 V$ H" [8 Z

( y9 K; Z. [8 F* E3 O0 Ssize_t hexStringToBytes(const string &str, byte *out) {
" p' x1 R  B* V; k) w1 V 9 O* ?( x) k( R) D* j
    vector<string> vec;
' `# W) Z+ ]6 b( b$ _( n5 r  E    string::size_type currPos = 0, prevPos = 0; / H9 l$ |7 P' C" ]: b
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 6 S* |+ k% @+ f0 i; N6 V
        string b(str.substr(prevPos, currPos - prevPos));
# e' [& r" j% ]0 c        vec.push_back(b); $ z# @) [. I1 _9 _( k2 s
        prevPos = currPos + 1;
* k8 o: V, M3 O( W2 M: I    }
# `' y3 D4 ?$ G# K. i    if (prevPos < str.size()) {
) p+ i! H+ Z  o* p* n: x0 p0 X        string b(str.substr(prevPos)); / t% m$ s/ C6 J( s! c) O( ~
        vec.push_back(b); 6 A* [9 A4 x, l/ @6 ^
    } & R: T2 j% y+ k' e4 B
    typedef vector<string>::size_type sz_type; & F# K7 R. M4 h- R/ d8 }
    sz_type size = vec.size();
/ M5 [' v. H2 c3 l! }  K( v5 t    for (sz_type i = 0; i < size; ++i) { 9 V6 @+ x. k- ~
        int a = hexCharToInt(vec[i][0]);
) U/ ?+ u  [1 P& H: A1 o/ r1 x; ^        int b = hexCharToInt(vec[i][1]);
7 x0 ~* b1 M0 {0 P; _0 Z        out[i] = a * 16 + b; 9 o, |2 P$ d- X( f# O4 B( u
    }
, Q/ l2 W4 a* S& Y) L! k1 S7 T    return size; + c' s- d. I" h5 ~
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H / ]3 i, u' ]$ ?3 Z+ S% T" Y7 f- a
#define TEA_H : O# |( \5 p* Q5 C
! H! k; `) Y$ @& w4 p
/*
$ p% Y5 u; e& I& k; v*for htonl,htonl 5 M: J3 t1 U- p
*do remember link "ws2_32.lib" * T8 U1 C. l2 a" l2 C2 I- z4 g
*/ ( {( C- _9 ~" Y
#include <winsock2.h> * J8 H; L  q5 q2 z) {4 P3 N& p
#include "util.h" / J7 @7 }5 H  T* O0 L

# M4 f2 B' z# F) L" R+ X7 {class TEA {
. p4 q( t- J& M% g/ Y8 Gpublic: # O3 K: `; l% d( `# G
    TEA(const byte *key, int round = 32, bool isNetByte = false);
" V6 ^4 C7 M1 ]6 g+ u( o$ D    TEA(const TEA &rhs); / X. x) I* m7 K4 {
    TEA& operator=(const TEA &rhs);
0 C: z6 t0 T" J1 Q4 T7 T    void encrypt(const byte *in, byte *out); + {2 K( L$ F/ @( L
    void decrypt(const byte *in, byte *out);
3 v' H4 l, I+ {5 ]3 U; wprivate:
- f% `- ]" p& c- h( _- [4 `; u' \    void encrypt(const ulong *in, ulong *out);
. i. o* p. l- z: E    void decrypt(const ulong *in, ulong *out);
  U8 i8 W9 G( s7 c( |0 P5 E    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
8 k! W9 q( A7 \: d    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } # S: g/ |. G' u* I) Y
private: 6 p1 t- o. |7 l6 L- a
    int _round; //iteration round to encrypt or decrypt $ u( x5 D$ R, S) q) e- R: B
    bool _isNetByte; //whether input bytes come from network
8 |% y. r4 T" ~( d" k    byte _key[16]; //encrypt or decrypt key $ ?: L2 m* f2 n! [' G$ u6 ^
}; . [# h& E0 R5 u# Z  A/ L; ^

6 s$ R; e: h& G# z#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" # h- K# J6 C9 A- O. v- ]
2 #include <cstring> //for memcpy,memset
) d' C* P2 }4 P* [ 3  
, B( @2 [9 i, S 4 using namespace std;
# R( v8 L$ y, b# U5 G4 O 5  
: w/ e( f( V3 a$ L) {; ? 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
& V" E; p  A4 C+ {! P" l 7 :_round(round) $ C8 U+ s4 {- N# l9 }! x* p, i
8 ,_isNetByte(isNetByte) { 5 x: F6 N8 H8 T5 D7 K0 `
9     if (key != 0)
( M/ d# p1 ]: u" b7 i10         memcpy(_key, key, 16);
2 ]! v4 D( b" B3 g11     else 4 j3 K- K+ m# J9 \4 N8 @+ A
12         memset(_key, 0, 16);
* B, P& [0 L# n. u13 } 1 {& K( N1 l3 G& p
14  
2 ]; a0 d( T* j7 ?9 k( l4 {15 TEA::TEA(const TEA &rhs) ) J) p% N$ X" v8 u* Z3 ^
16 :_round(rhs._round)
. I" p- w7 P6 F2 g: `8 \17 ,_isNetByte(rhs._isNetByte) {
# C7 j) I& z; l7 l8 t18     memcpy(_key, rhs._key, 16); ! {6 \4 Q. v! ^/ e# _; ^4 d
19 }   D6 Y# X5 a% L1 [6 [. K
20  
3 t8 H/ m+ G% p' B* u: _& d& C21 TEA& TEA::operator=(const TEA &rhs) {
+ p1 \. g4 u* l$ v0 X3 H22     if (&rhs != this) {
* `( p6 |1 g5 G" P9 p23         _round = rhs._round; ; t6 B8 h/ z# C; `2 e) R' [
24         _isNetByte = rhs._isNetByte; $ K0 c3 r6 l  v* t5 [
25         memcpy(_key, rhs._key, 16); 9 t9 E' ~- E; V; k3 v2 S
26     } 0 x. p; k2 q2 o% u, F
27     return *this; 5 x8 t! B8 s' @0 V
28 }
# `: r! }7 X% b5 ]6 p8 |29  9 c3 R, _4 L* W8 l
30 void TEA::encrypt(const byte *in, byte *out) { * ?' J+ X% g% Y# ^4 i8 a
31     encrypt((const ulong*)in, (ulong*)out);
( d3 s* t; R, H- a7 S32 } $ b: S7 Z8 |: L( Q5 p" z( Z1 d
33  2 V9 }3 _+ V. q& T: E5 e
34 void TEA::decrypt(const byte *in, byte *out) {
: J3 {$ r" ]+ T: o% G! a35     decrypt((const ulong*)in, (ulong*)out); : @. d# T( A9 M0 @/ u
36 } & ^8 A. Z' c' R  A
37  
# Q! B0 [, m7 i/ b, j- [38 void TEA::encrypt(const ulong *in, ulong *out) {
: g  ?' U1 C! n39  ' c) n5 d: n, P; h4 C) l1 m
40     ulong *k = (ulong*)_key; * Y( D/ \6 r0 L5 K( v
41     register ulong y = ntoh(in[0]); . m4 b( u5 ~2 _6 A. K& u% F
42     register ulong z = ntoh(in[1]);
4 |' G3 W5 h8 l/ W43     register ulong a = ntoh(k[0]);
% }" X2 H/ y  L; w44     register ulong b = ntoh(k[1]);
! c' I. w( U8 D" m* Q' g: d45     register ulong c = ntoh(k[2]); ; C/ W- X  N) M
46     register ulong d = ntoh(k[3]); : E5 k- V! r) G7 }' q- u. `
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ : Q4 w$ n& i9 k/ W1 s
48     register int round = _round; ( U0 o) D& V6 c3 ?
49     register ulong sum = 0; / F- o  R0 ~+ J, a; ^5 j$ d+ b: p$ Z2 j
50  1 w5 d7 C" T; }+ ~: m1 c' J
51     while (round--) {    /* basic cycle start */
8 F0 X/ W! @# X2 F52         sum += delta; ' a. O' E* T( G2 D% Z" x' P9 T
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ) C% X; f* V0 b/ L0 k0 U; b
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! f6 _# A: m( F7 S55     }    /* end cycle */
  G% |" g# m" O2 f! N* Q1 r' a56     out[0] = ntoh(y);
$ y" D! w0 ?# D% p* \/ U57     out[1] = ntoh(z); / [7 e! r0 t- N
58 }
( ~1 m0 X9 f: l: N$ @59  
: n  D; l" }0 e. [( V60 void TEA::decrypt(const ulong *in, ulong *out) {
7 ]5 w2 o) Y) q! x" P6 z* H! W5 ]61  
; z8 I8 t/ }3 n1 r% f62     ulong *k = (ulong*)_key; 2 _  m5 c* w; B9 V
63     register ulong y = ntoh(in[0]); ' H+ ^" i0 x, ~, w& k; g
64     register ulong z = ntoh(in[1]);
+ h# ?8 |; L- E5 k5 i65     register ulong a = ntoh(k[0]); & r. u" {2 K' ^6 _, F
66     register ulong b = ntoh(k[1]); 2 L: y0 k" }' r9 e
67     register ulong c = ntoh(k[2]);
0 D7 ^0 C$ o- R( ~68     register ulong d = ntoh(k[3]);
6 C. x4 H0 Y5 B2 z9 E- D. k3 {69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ L1 ~, J+ j0 d( M0 ], M70     register int round = _round; $ u- X8 k3 b. m' s/ d
71     register ulong sum = 0; 7 v* o2 d# ?# ]; N6 Q
72  
2 k' c" r! k* B/ `) x. v73     if (round == 32) 5 G, m: I, m8 w- B$ h( K$ {
74         sum = 0xC6EF3720; /* delta << 5*/ 7 @: a- x5 c8 A; x: m
75     else if (round == 16) 1 W: I$ `0 E3 h+ ^# T
76         sum = 0xE3779B90; /* delta << 4*/ % l, x% Y& V5 S2 f
77     else ! @3 C$ j- N' O+ u. f
78         sum = delta << static_cast<int>(logbase(2, round)); ' i8 F+ L6 Z$ D) j( ?: C8 s
79  
; u+ O1 ^3 h/ W4 V80     while (round--) {    /* basic cycle start */ - j# U+ q! E% X' j
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); + Z$ t0 q2 R! [! W& L5 n) E" ]
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); # c3 z: f4 S0 B) \- Y
83         sum -= delta; $ \+ Q3 ^$ G1 k
84     }    /* end cycle */ ' r2 o- ~; _7 F  \: v, w
85     out[0] = ntoh(y);
; A) p: o9 \. T# K3 P- O86     out[1] = ntoh(z);
1 W" ]. t$ v1 c) P3 P8 g, v" s87 }% h8 G1 O& J, h5 S& o8 E

" t$ V) ^- ]+ g$ U; r/ t5 t1 _# [需要说明的是TEA的构造函数:
7 V# {: r6 v4 P2 UTEA(const byte *key, int round = 32, bool isNetByte = false);
/ I& ]) X& L* k& S6 L1.key - 加密或解密用的128-bit(16byte)密钥。
$ E8 r% ^1 u# g2.round - 加密或解密的轮数,常用的有64,32,16。 1 h7 R% N6 v0 ^1 t7 B  c: F
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! + \4 Z; L7 K7 a6 [  ?
8 S# r& e" z* F
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 6 H! z  g' {+ @5 G) F0 A  U* T
2 #include "util.h"
  l5 q: R, }( {# E# v 3 #include <iostream>
% W8 Z7 U( f/ e( n 4  
6 H  C; K9 k) o; V 5 using namespace std; & Q; D3 x$ N, A" Z+ V: n( x  q
6  
# G" B% l& t9 l6 @. T1 \' O 7 int main() { : {0 i: s; h3 J. w- ^. u: U/ E
8  
0 O+ W7 K, L. M: `1 i9 R: i 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ) z% D! q- m1 a/ [, q8 b) S4 e
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
! b% P- k8 b# G11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 9 e. {. j7 v* z. }8 Y
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; " J) t$ I4 q) C2 v" ]3 p0 W
13  
' ~' x  i; o! M7 Q: m14     size_t size_in = hexStringToBytes(plainStr, plain); # H/ |# W0 M1 r8 \2 w2 \' T
15     size_t size_key = hexStringToBytes(keyStr, key); 9 ^, I3 _1 ]' _# n" Z5 f# P
16  
  X4 \# H3 `6 \- l$ Q4 W3 ?7 e" _2 C17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 1 R5 b# M6 ]1 O3 H1 U& U5 ]
18         return -1;
  c; M5 O) w( G; y* D$ s+ v19  
5 }4 v& `5 q, k5 w6 Y3 {20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; ; Z5 f! V' ?0 h
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;   ]+ i8 V* o( s
22  
  B6 Q0 [0 f6 ^( b: K) \$ l/ I23     TEA tea(key, 16, true);
. u* m$ n$ E- w0 g' ^24     tea.encrypt(plain, crypt); ( m2 o2 n; Y7 b& U+ A/ K
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
1 p. q/ o% d$ @6 j" v" T26  
9 [5 f! Y; _3 f7 M27     tea.decrypt(crypt, plain);
- E. B" t$ j3 ]/ h% ^" u4 F3 a/ H28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
( J2 e3 J& Q! b/ L29     return 0; : F$ C/ z+ T, D. h
30 }
" Y. Z: t& w$ K. V, C7 V, m" Z- T
2 x- F* V$ t+ ^  @本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
  j2 |+ O& y5 }  j) K运行结果:
7 [$ J2 Z, R/ {; z' ZPlain: AD DE E2 DB B3 E2 DB B3 ' G- ]* O  M8 t; c+ \! R
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
5 i% }5 w0 Z! P4 Z: jCrypt: 3B 3B 4D 8C 24 3A FD F2
0 f2 F5 L4 j5 B3 P: tPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 16:53 , Processed in 0.019887 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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