找回密码
 注册
搜索
查看: 37682|回复: 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轮):! F9 E0 v1 B( [  E2 [8 I4 ~% F
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
$ r! d/ u; S. r3 m; w  R2 nTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ' @7 y' u* P, V; p8 j) y0 D1 c
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
' i% i% ]! }4 [5 z, c+ S在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
( z+ ~( l4 i3 d3 }9 u5 M$ c/ E在 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. ) F( r3 o/ X# }/ r$ z
  2. void encrypt(unsigned long *v, unsigned long *k) {
    # J6 ]' i# {/ n* V# S
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    - ^0 {/ j; f4 n5 G) M
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 8 n0 K0 j& E" @5 O9 m0 Q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    6 H4 Z: U  Z8 b! D: ^' [8 h/ _
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ + l: S) f8 c) V9 ^  ]- A( u8 R
  7.          sum += delta;
    2 r% B$ i" t# ?8 k+ q. x
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    7 \2 x0 j( P: A  f( _* I
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 8 l* x9 j0 n& S' E. F9 h0 m
  10.      } 8 M& J# `' S' u# Q6 s! m2 l" j1 i: V+ W
  11.      v[0]=y;
    3 X- H* b5 |6 I1 q& }7 F9 b
  12.      v[1]=z;
    & \+ h8 u( n! S6 m! E2 Q/ W
  13. }
    ! g2 K( S7 W# l, Y7 |0 `' s
  14.   
    ! \4 Y/ K; y8 ?3 u% s
  15. void decrypt(unsigned long *v, unsigned long *k) {
    & g1 R5 C# _: s3 H& R2 P/ x& [
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 5 r/ x) O* d6 l0 C2 L0 N0 v6 f+ ]8 _
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    # e) _5 r$ C. G3 W$ p7 ?. X8 N
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ! N' `0 S! U' Z: g" {8 F7 z# v
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 3 ~1 [5 X# H' @# T
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ! h! e1 L. C" \( @
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & r& M4 C. ?3 j2 i6 r
  22.          sum -= delta;                                /* end cycle */
    ) }1 Z" r- L1 D, ~1 R
  23.      }
    3 g, l- Z' f2 E/ P! }) E/ F8 S
  24.      v[0]=y; ( L" \8 K* N2 @0 G5 E. g
  25.      v[1]=z;
    2 f- J3 S6 Z$ j) ^
  26. }8 {( w1 P% T& a/ c4 i
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
6 ?! a4 L/ [& v* u' d& V#define UTIL_H 9 N3 L0 j: z/ p

) p3 [7 D9 o' J4 l9 c, c' F#include <string>
: U- J% F( W( N  Y/ [#include <cmath> - H% S4 @! k! X0 K- B+ g
#include <cstdlib>
) {0 T6 L5 r" b/ b6 p) S
; b. x  @% H, M0 S/ y) Dtypedef unsigned char byte;
- s) I3 V; ~) ?3 Btypedef unsigned long ulong; : m9 O7 O2 w# ~3 c6 k( f

6 }$ a0 }# d, |* c4 c1 g; m. j; f: ninline double logbase(double base, double x) {
& b6 S1 _  {4 o4 S* u/ O    return log(x)/log(base);
! S3 e. |6 I" N+ x} + Q$ `$ d  r3 Y, t* s
; }) e2 N) C! V5 [( `
/* , M1 g7 M  n+ j( a
*convert int to hex char. 7 M; |6 D; [, {; Y. W& Z
*example:10 -> 'A',15 -> 'F'
" U* C8 d$ u2 C3 z' {" }1 l*/ ) W6 n+ ?3 s1 U) p
char intToHexChar(int x);
* H  N" S3 I4 j/ \$ x+ d8 } . o+ [# L, ?. G1 r+ W
/*
, q2 X; k+ D* q) g1 b*convert hex char to int. ( C% R( E2 z/ j7 f) V+ Z# Z' }
*example:'A' -> 10,'F' -> 15
: [. U& h: h5 P- z# X$ x% L*/ 3 H+ C$ @2 t& ~- l6 u% `
int hexCharToInt(char hex);
4 k8 H0 A& a( i) v; |. M+ c * j5 Y/ t' M. E
using std::string; + x1 `6 d: h/ @9 ]( i3 m8 ^. A7 Y; I
/*
2 a' J* q0 u. v*convert a byte array to hex string.
" k, O4 q0 \- h% `9 M6 i8 u, g: z*hex string format example:"AF B0 80 7D" ) O% V+ ?1 K# C0 d# c
*/
5 F$ _. F6 e1 j" }- L* Q5 jstring bytesToHexString(const byte *in, size_t size); 7 e0 Q" e( L/ U4 W3 r
; m+ l2 Z, Z. f8 ]  p0 {. D# m4 {
/* . H3 n7 F0 l' q; C) _" w) m
*convert a hex string to a byte array.
/ S( R0 U  F# d$ _5 G*hex string format example:"AF B0 80 7D"
& d2 [4 s0 w; ]" }*/
; O5 K2 q% p, u' ?  W+ asize_t hexStringToBytes(const string &str, byte *out);
' u/ h4 M$ h5 L- F5 h) E7 L
1 j7 y  \! v7 B8 Y% n  C+ p: p#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" % l$ C3 ?% ~3 ?( w/ C
#include <vector>
) s% S! X* ?8 c; L+ B% \: s6 ?0 M5 I * {. W5 M! S  L: ]
using namespace std;
2 l% w$ y* h5 o, m6 d
( _& c! r( C2 e: ?9 I1 n$ a3 k8 M& Uchar intToHexChar(int x) { : F$ @# S! b( T$ T
    static const char HEX[16] = { 2 x' {7 [# i0 h1 q
        '0', '1', '2', '3', 2 H# {* |: ?2 ~( s4 a
        '4', '5', '6', '7',
5 n9 h+ _) }* @        '8', '9', 'A', 'B',
& v. I1 i5 O) P3 @        'C', 'D', 'E', 'F' 6 b" q" n# S3 ^1 `2 z
    }; 8 `+ {& o2 u1 ?- X; |, P6 C1 ^
    return HEX[x]; / Y5 S9 n3 t1 u
}
- N: G% z: Y! g. Q; \ ) H& D) f4 Y7 m8 l. U& G
int hexCharToInt(char hex) { + m3 m' s" {5 n. Z8 A
    hex = toupper(hex);
; ?3 p5 y% N; C6 L! |0 A    if (isdigit(hex))
8 a. t0 I3 i: B1 U0 W$ ?        return (hex - '0'); # R+ [) M. _5 t( E$ g% u
    if (isalpha(hex))
4 {6 V' Z: }1 t" p. y2 p( x        return (hex - 'A' + 10);
2 ?# s1 L. g8 A0 M    return 0; * n7 S. U: M6 j9 p) C
}
; I4 [8 f8 |4 l7 y9 f6 o5 M
. @& n4 r* q2 c  q8 z6 M: zstring bytesToHexString(const byte *in, size_t size) {
/ X6 |7 H5 {' L9 \6 v! l    string str; , G' D+ [; d9 T. {: b
    for (size_t i = 0; i < size; ++i) {
& @+ @4 M/ y4 ~. J0 |/ o4 x        int t = in[i];
; g; w, S' a/ E) X        int a = t / 16;
/ A) A* X" @+ H: V( Y8 U" M$ ?5 y        int b = t % 16;
+ g4 T3 ~1 I- F: v- \# E, t. h& v% T        str.append(1, intToHexChar(a)); * T* f6 W0 U; H3 [, L- @
        str.append(1, intToHexChar(b));
0 c" K6 S8 U/ y$ {8 o3 W6 `# k        if (i != size - 1) 0 P) c; W- K9 s4 G8 M7 w
            str.append(1, ' '); ( m6 V' s# M' q  A* i
    }
( p5 ?" M4 c+ a9 I  h1 s- M- G    return str; - D# o$ ~2 i# i' X/ f& D, O
}
* j# K( b0 x6 V7 A1 Q% ^9 n$ x ' e) R: S" ]0 W+ r, F. x7 j% H
size_t hexStringToBytes(const string &str, byte *out) { 9 Q5 N% Q- P5 c1 V# X( a

$ W" v/ K' f' b. l+ N    vector<string> vec; $ A( q! G9 b- w' V$ J6 T
    string::size_type currPos = 0, prevPos = 0; * S' ~0 A: B* r4 w9 j$ t; h9 @
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 8 I8 M4 E2 ^. Y6 x/ n2 _
        string b(str.substr(prevPos, currPos - prevPos));
0 K4 n6 k( {% c( j. z$ X( r        vec.push_back(b);
4 B7 o5 t! R) M7 x% `* r        prevPos = currPos + 1; # ]' n. G  E, Q7 _7 ~
    } 7 t8 `! k2 f2 {, O
    if (prevPos < str.size()) { 8 f* c/ |5 p( J0 F' n) `1 |# b# e
        string b(str.substr(prevPos)); ; N0 ?: U7 u* S$ H, d; q5 z; e, i
        vec.push_back(b); - W$ z# \7 e$ i( f& b* C
    } ! w2 r" e1 _& W3 t7 C4 u
    typedef vector<string>::size_type sz_type;
# `/ N% R) Z; V, Q    sz_type size = vec.size();
5 h0 [+ r; g9 Z5 E; Q, k) y9 x3 ]    for (sz_type i = 0; i < size; ++i) { , `( N8 H" k6 {/ I
        int a = hexCharToInt(vec[i][0]); - [7 F. T; {! H8 K/ g4 O8 Z" w" n
        int b = hexCharToInt(vec[i][1]);
- m2 a0 F1 W' ]" m        out[i] = a * 16 + b;
& s) B' n; I- ]4 a9 R    } ) J& z2 {  U; ]! D  x6 \" [4 @
    return size;
2 A* z  m) F) a' s}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
! x' t' _7 Z6 [9 ^; q#define TEA_H
1 g* u( g0 e9 J" K1 k. ^/ V
0 v5 s! x' Y" N/* ) M8 Y) J7 f) h
*for htonl,htonl + Z3 N" n. Z, g0 Y2 Z% D- N4 i
*do remember link "ws2_32.lib"
7 H# E- Y. H, Q" O7 f. _*/ + k: T: t5 I, b7 i& Z- w) A: s+ a  N) H
#include <winsock2.h>
7 L! C' u5 U. k. s$ y( c, q#include "util.h" 7 G) v# p( ^/ }: f+ I" x

- l- @1 Z6 Y. Z( U1 [class TEA { 5 }3 q% }6 A2 C  X1 L( m. `
public: $ ?; l+ w5 @. n8 c# P
    TEA(const byte *key, int round = 32, bool isNetByte = false);
/ s4 p% a6 b; Z' H$ `% D- x: |    TEA(const TEA &rhs); 9 t2 S: U; i. y, z
    TEA& operator=(const TEA &rhs);
* y2 D8 p# u' l/ q    void encrypt(const byte *in, byte *out); 0 P9 @2 w6 d+ F" e$ ?  a
    void decrypt(const byte *in, byte *out); 8 A3 z" O7 b( Q
private:
: x' r7 b8 M7 N& D    void encrypt(const ulong *in, ulong *out);
+ F9 I" `) D5 ~9 u    void decrypt(const ulong *in, ulong *out); ) n, ?4 z# s( q6 E# Z. s
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } # m2 A/ ^  B3 u8 B/ S& V' a
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ! x% u" J" d  Y0 s$ |- }
private: $ N. ^* i2 g( s
    int _round; //iteration round to encrypt or decrypt - D$ }$ e( K5 Z4 W
    bool _isNetByte; //whether input bytes come from network
( e+ K4 _7 z1 f- I& R# T# K3 G    byte _key[16]; //encrypt or decrypt key
' m/ C4 K# S& d};
% m9 e9 A5 R; D' d; G
8 s0 b8 i/ U  p3 l8 Z  B#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
9 q" P8 Q( x2 F. E" m. T  F 2 #include <cstring> //for memcpy,memset 4 N+ a8 H3 r0 B; ]
3  
9 }' E9 A3 W  | 4 using namespace std;
8 q% l% R; x% C) r/ }+ z8 j 5  
; l* z. V. |, |( l4 I- B9 f 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) / \+ U8 A# ?  E
7 :_round(round)
8 x! g- p0 r! b3 |0 a 8 ,_isNetByte(isNetByte) {
9 n- m* H/ Q5 @& c 9     if (key != 0)
7 z3 ~* r3 D8 t10         memcpy(_key, key, 16);
# v: h! v5 T/ o. C3 M11     else " N8 e8 g) N/ u" Y4 C
12         memset(_key, 0, 16); * S& J3 O# f% P6 s# F
13 }
5 f) ~- h7 `; R. u( c3 D14  , Y$ C. l  o: T! b( Z4 }5 C
15 TEA::TEA(const TEA &rhs) 7 G- R" l. F! K
16 :_round(rhs._round) 0 I- C& V+ }$ m& m( y7 J
17 ,_isNetByte(rhs._isNetByte) {
0 U& W9 q! t* ]18     memcpy(_key, rhs._key, 16);
8 e" P( c% k" H19 }
0 V7 C* H& P9 _: G4 B  a. I7 m20  
# ]: J/ g1 d4 s  k21 TEA& TEA::operator=(const TEA &rhs) {
2 a% ?3 ^9 _7 U( V22     if (&rhs != this) {
" L* l0 _. A0 H7 J& m; h8 q1 e$ d23         _round = rhs._round;
6 O' N( f% ]; Y, o* a" y$ S24         _isNetByte = rhs._isNetByte;
) y7 P% S; Q* F, |' ~& b  u25         memcpy(_key, rhs._key, 16); 9 q0 S) R7 x' t
26     }
5 `+ l! M6 V1 @/ e27     return *this;
! H$ _3 f7 `1 P$ p2 E4 x" n. y28 } 4 x4 a1 D! g. R5 e6 N. ?8 j: ^2 e9 P( Y
29  % J& Q1 b/ I5 K
30 void TEA::encrypt(const byte *in, byte *out) { % q* R) V& e- `5 Z  P0 z
31     encrypt((const ulong*)in, (ulong*)out);
4 W) y# w6 u% }, y: t3 a32 } 4 F+ o/ F( }9 Z& e- T& [1 Z
33  
! L- i4 y5 M) G' Q& `4 F+ o34 void TEA::decrypt(const byte *in, byte *out) { 6 ~6 A/ U# `- P' v2 E% T& g# h
35     decrypt((const ulong*)in, (ulong*)out);
5 L1 d: m& _7 K4 m! o36 } 7 W+ `! g8 R* S1 l0 s# g
37  
3 t5 H) r' j" B" G$ l38 void TEA::encrypt(const ulong *in, ulong *out) { 9 L4 }9 A+ v+ I- ^2 l+ ~
39  
# |$ M1 [# m/ k& k* s5 Y40     ulong *k = (ulong*)_key; 7 X" f2 A, x  z
41     register ulong y = ntoh(in[0]);
- c  Y4 ?. ?. u2 i0 v; N42     register ulong z = ntoh(in[1]);
. b4 j& F5 p# e  \0 m8 d43     register ulong a = ntoh(k[0]);
2 }" U9 ^4 ^; ]8 m! a2 B6 e44     register ulong b = ntoh(k[1]);
: P; K" C/ [( u' S; ]9 I% g45     register ulong c = ntoh(k[2]);
3 k  t) \7 _/ h2 @2 O: B46     register ulong d = ntoh(k[3]); 6 m, ?9 q( s' E2 w
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ' {( f( T' }. g5 v6 \* k" G
48     register int round = _round; : e$ o0 B7 q" i# V5 [* y
49     register ulong sum = 0;
) \/ n1 Y0 h' u6 _7 w1 u( ^* q4 H( k50  2 |, t" }) b1 ^" W/ z  r6 _  z- e
51     while (round--) {    /* basic cycle start */
( j2 _0 a# Y7 }, `$ q; p52         sum += delta; : J* p' J0 j4 `  x7 P
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
! R4 N1 J  c7 G0 T: s) K7 B54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ) c; N) y. m5 V* I6 v: l, t
55     }    /* end cycle */
! M9 t) q0 ~+ ?. u/ d56     out[0] = ntoh(y); 4 l4 J; z) [7 T  r4 W3 r9 t/ e
57     out[1] = ntoh(z);
+ c; M3 Q- V3 h+ [- A& t58 }
8 _0 o) m- ~+ Y  d59  
  A6 Y+ g' f( _9 z4 z5 f60 void TEA::decrypt(const ulong *in, ulong *out) { 8 ^+ W; W& ]0 a( O$ M1 d4 q
61  
0 y4 z: O2 V2 e2 J+ e9 x! ]$ f, W. ^7 A62     ulong *k = (ulong*)_key; ) ^% G+ o" `3 E
63     register ulong y = ntoh(in[0]);
' ]4 z# {" {% c! |  j64     register ulong z = ntoh(in[1]); / _+ q/ A, w  p. |9 w2 t8 \
65     register ulong a = ntoh(k[0]); ) F/ Y3 ]( x/ q! n4 d8 _
66     register ulong b = ntoh(k[1]);
( w9 d, O6 l! N6 S3 ]" @% B67     register ulong c = ntoh(k[2]); 0 Y/ W# Q- R8 U1 g! W- x" \2 A) v/ o
68     register ulong d = ntoh(k[3]);
1 {/ S1 T6 N. }5 O' P' b* D* [69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
8 z3 e7 Q0 c+ m70     register int round = _round; 0 ?& j. H# l4 s7 J5 \* Y* C7 C" Z
71     register ulong sum = 0;
: \# F3 c# Q# x3 ~5 [9 ]72  
. R3 ]6 H  |) U" p73     if (round == 32) : p4 J; g& I! M
74         sum = 0xC6EF3720; /* delta << 5*/
* h- J8 K) O5 c" ~" d- P" z& e# k75     else if (round == 16)
0 d: e9 D* H; Z( x6 N. z76         sum = 0xE3779B90; /* delta << 4*/
# H' s7 i: C) |7 _" I77     else
! f, Q# [1 ?9 f$ ]78         sum = delta << static_cast<int>(logbase(2, round)); 5 [, p$ \  D% {: I' L/ R
79  
9 B8 f: u8 w8 w9 U) [9 \. L& G0 {80     while (round--) {    /* basic cycle start */ . o' Q6 b: M/ k; n+ U( X# ^% V
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
4 r( _8 i3 g3 P' T! C82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
3 b; [. t( i( V* J1 \( J6 {% `7 m' N83         sum -= delta; ' n$ ~% n1 s; t4 T$ K4 D9 H
84     }    /* end cycle */
  H& o+ M1 F5 e, r% {' s85     out[0] = ntoh(y);
- ]2 _& j7 Y9 v86     out[1] = ntoh(z);
3 O/ @5 B+ V( P- ?) V/ S4 I87 }
! a" X$ W/ |) m2 O' H) X8 l* q2 \- K% g0 _
需要说明的是TEA的构造函数: + w  w8 g2 z' Y
TEA(const byte *key, int round = 32, bool isNetByte = false); " j2 a3 h" o, w+ Z, b
1.key - 加密或解密用的128-bit(16byte)密钥。
% N/ U1 Z$ O; H/ y5 O% G/ z$ h  i2.round - 加密或解密的轮数,常用的有64,32,16。 2 Z, T1 C) T$ k1 F' z8 [( h7 _% s( u
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
4 Z5 S# D& W7 X7 `7 |+ p3 V+ K( a$ y/ T* }( g! r
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ) s% n$ U* c; l/ [$ W
2 #include "util.h"
* j, X+ E  r( ^4 [( }; ?( G" p* d 3 #include <iostream>
: U5 |' G7 ^$ B' y+ m  |- y 4  
( a5 z5 D: l, R4 _% i% ]& X5 H3 o 5 using namespace std;
5 S9 v. U$ T+ `6 G% D. O& q 6  
' @& {' O# u! M 7 int main() { 9 x1 B) O7 s' M5 s4 E( C1 k5 F9 Q
8  
* s6 Y. m0 r8 ?# C6 m 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
/ r! o1 p. S3 W0 M/ @; D5 E10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); * G) h2 I4 ?: p0 F  F! c
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
9 l! Q- f- p. j2 c, _12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; # ?% m1 f$ E& c- ?4 j
13  
  a, M5 K$ G, [! x; {7 W14     size_t size_in = hexStringToBytes(plainStr, plain); 4 r" j7 x5 I( W7 v# a' J* n
15     size_t size_key = hexStringToBytes(keyStr, key);
: M' k) X( t! T# T& f" j16  2 m( n' Q& Z8 \) ^3 R: [* E+ K1 U
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 7 |3 |# T& m. v% Q1 y
18         return -1; 7 V. i7 }/ b" B' b# ~. t1 a* R; C
19  + @  e: W4 K9 W/ L3 ^* @" j
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
* n7 ~$ ^; [! F8 x2 U4 R21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
3 o/ ]8 x: B/ q( z# y! W; B/ d22  
8 {( L7 f2 v/ V23     TEA tea(key, 16, true);
6 m7 @& \8 k+ h* D24     tea.encrypt(plain, crypt); ( ], M4 w+ ]' B; V
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
+ C6 Z/ E- S: w. c: K+ H. F' m26  6 X. @2 I' T: ~
27     tea.decrypt(crypt, plain);
0 S! l) k  B: q# Q0 d0 Y3 R28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; # ~3 R  O6 z6 \) G; c8 S2 I
29     return 0;
% }% t' ^% v0 c, `30 }. T# _6 l; r& D
7 Z# F  K( ~1 R5 ?$ }
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx6 W+ E1 J8 f: ^/ Z
运行结果:
1 m7 W7 E: D! I$ F  iPlain: AD DE E2 DB B3 E2 DB B3
" W/ F3 S6 w; j3 Y- C: P4 V/ oKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ! m5 A3 U. ?# _
Crypt: 3B 3B 4D 8C 24 3A FD F2 0 e$ G0 ~5 V( p; U) E
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-14 14:28 , Processed in 0.020480 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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