找回密码
 注册
搜索
查看: 37381|回复: 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轮):
, ~4 A+ U  u- K7 y( c' r微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 & i8 S3 u0 p2 ^. F( v
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 - w0 I9 {' A% A: M/ U( P$ L  [
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 # X# n; [' G2 a( ^. a: I3 a* Q
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
6 n% l5 e0 D* C8 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.   h5 {# n" A+ U. G5 S  x3 {9 a
  2. void encrypt(unsigned long *v, unsigned long *k) {
    1 @4 M, z, h" W: @. Z5 @
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    9 }& T, }( q1 d6 v- F5 g& A
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 6 T  ^2 G# A. z3 L" I% W) Y
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ) l5 |; S7 b! w5 }
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
      L' e6 b% r! S
  7.          sum += delta; / u! r& V4 g# S5 @: H. Q
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 1 a' \5 V* d7 d! ~% D
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    1 Y, {4 L9 E6 ]+ D3 |5 A$ }
  10.      } 0 V# t7 `! B7 E4 d
  11.      v[0]=y;
    9 o/ v) W* G, X
  12.      v[1]=z;
    5 O* u( s& c9 ]; a# K6 j6 Z
  13. } % @" u( N: s+ _2 U# h9 X8 P$ F
  14.   ; ]; X3 x7 L; }- w% m" _6 k
  15. void decrypt(unsigned long *v, unsigned long *k) {
    . i6 d0 t. f& W6 R
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    4 u, Q" u1 j) m; A- |
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 1 f1 W% t# ?( u4 r
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ( O$ ^0 N7 i( U1 Y- A1 f
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    . n! v1 \3 s+ L2 w# k" Z# l* |
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 9 o. w- {; V* }
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ; Y! f/ i! b# a/ G$ u" G; R
  22.          sum -= delta;                                /* end cycle */ ; G* H5 @0 ^# u
  23.      }
    / U4 w, N, ^, m9 ?6 D
  24.      v[0]=y; ) R1 O* f# [0 W$ T- i2 x+ ]
  25.      v[1]=z; + q" ~: G! J) L7 d. L
  26. }
      T8 V7 L* T) {! x( F$ x9 r
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ' e) m. m. y3 Z$ D' K
#define UTIL_H 3 l; K" V$ I) C0 V8 M
5 f6 m2 {1 c. X% ~* |) ?
#include <string> $ {9 x8 d8 d$ k1 h/ \6 R
#include <cmath>
3 C& H0 _, ]/ G9 Z) e. J% d5 e8 W#include <cstdlib>
* j$ l! u6 V) V4 g. h/ S0 U
9 h% o0 ]- U# \- X; k: p6 c% atypedef unsigned char byte; 4 C( j/ A. Q( Q% C- f
typedef unsigned long ulong;
! Z- O7 _) p" G' q# b  Z$ A+ h 2 @5 {/ f. B! d' j8 h0 K
inline double logbase(double base, double x) {
6 o7 C7 W) b- x) y& ^. X    return log(x)/log(base); ( {# z! H9 l3 b; r5 I
}
, \- S) c+ m% f' F4 w* w# T/ ^ 5 C2 l; g" B: a$ [9 T8 N
/*
3 Z1 `! ?& k7 M' @+ D*convert int to hex char. 1 q: o! r4 \" O. n0 G  u; R
*example:10 -> 'A',15 -> 'F' . m! n. t' B  o4 G! s$ f+ y
*/ * v$ f' n5 R' I1 g& g) O3 Q
char intToHexChar(int x);
* l/ V0 y; I# ?  I4 v
0 K' }- }+ k- M2 e/ n/*
  C/ @; ^& n2 m' t+ ^: ~3 ~& k& r*convert hex char to int. ( k3 E" ]6 \- M# j9 x+ E
*example:'A' -> 10,'F' -> 15
5 r% L0 H/ g7 i8 q) V6 L( E*/
% _/ k4 @+ B- [8 M. rint hexCharToInt(char hex); 1 Z; h7 T% `  ]8 L, s
* k8 s9 K/ B: f
using std::string; - p! ?0 t$ X; A+ Z
/*
* K; y2 ~4 S5 f' p5 O4 ]0 `*convert a byte array to hex string.
" \6 G6 r+ C* m4 @*hex string format example:"AF B0 80 7D"
; e. t' j/ H+ t7 v5 E*/
, q, G& b5 x/ X& L2 [! V3 Istring bytesToHexString(const byte *in, size_t size);
- p* }7 y8 e! G; N) R
- x& Y  ]0 C/ P' g4 d9 w' q/* 4 p$ Z; T9 H) W+ e+ K) {. i: s
*convert a hex string to a byte array.
; f# s- D5 _' e/ A" i3 M*hex string format example:"AF B0 80 7D"
8 u$ o4 u1 G% l/ k. F; X4 M*/
% M$ O  f* \0 F( O$ b2 _' fsize_t hexStringToBytes(const string &str, byte *out); 1 N- Y4 C" P; Q- B+ ?- {+ d
+ e7 x/ B1 {* {5 T
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ) |. l) S& }  E" W
#include <vector>
' q  k: B' H7 v   y0 M' m. C1 J) M8 Q' W2 ]+ s4 `
using namespace std; 5 {0 h3 e, W, ?! T" l7 w- ?
2 E" S( K0 p9 n! F/ D
char intToHexChar(int x) {
: q# k: p+ I9 e3 o! t$ y    static const char HEX[16] = { , Y' y" H5 N: u7 g: k  Q4 G9 k" T
        '0', '1', '2', '3', 8 m6 w# S9 u- C% ~2 c7 E
        '4', '5', '6', '7',
! |7 e! B+ R9 U* Y$ v        '8', '9', 'A', 'B', 1 \( I( O% Q. A, L5 s& h: [
        'C', 'D', 'E', 'F' ! R7 H" a( r# R7 `- K+ B; z
    }; ; [" Q; ~6 n$ ?$ s2 q
    return HEX[x]; ; t  V$ g( W" o1 m( L4 i; ~. q$ n
}
; |6 ~5 t$ j" Y: G : w9 ^* E, V0 ]( m  b7 m
int hexCharToInt(char hex) { & n% o. m! b/ _  F
    hex = toupper(hex);
! n4 |/ W$ L' L6 s/ ?    if (isdigit(hex))
& ?+ |3 M& [* D$ O! h6 i4 Y+ H4 z: d        return (hex - '0'); 7 {& s1 l# h& B, l
    if (isalpha(hex)) 6 [2 X. t* r- V% {+ y+ R- {2 t
        return (hex - 'A' + 10);
0 B( @4 t1 M* U1 f  j& ?. g    return 0; ) I1 |8 E& C- u) `" @& j( U; G
}
9 e3 S( G# U% k
; f& ^+ M, ]' b6 A8 b1 Kstring bytesToHexString(const byte *in, size_t size) { ) s- k) c" \0 {) i+ o( G" E9 q
    string str; . N$ i( k* v) Y. V+ ]$ w# q) m9 N5 T
    for (size_t i = 0; i < size; ++i) { 3 B1 ]' P7 X* t
        int t = in[i];
  Z% j& n  I" |+ A0 i( ~6 o- v" U        int a = t / 16; ( `# T3 k6 u- \% ?) s( L
        int b = t % 16; 7 ?& k  Y& k' \" v/ L
        str.append(1, intToHexChar(a)); 5 j# `9 O6 r+ v5 ]' I' d; V# x* ]7 _
        str.append(1, intToHexChar(b));
. n, g6 W: y0 c' J% a3 z        if (i != size - 1) 4 W5 q; p" c8 r1 e" [1 Q$ @& ?. }
            str.append(1, ' ');
# E! ]0 n7 O, W3 |/ x) h    }
- o( [1 P6 v- A4 h+ G+ V    return str;   g( n  J1 J0 f9 S! n
} & D7 o8 ?, |* U  `7 _, ~6 n- [

. |3 j8 H' x) P# D8 F3 m) }  z6 csize_t hexStringToBytes(const string &str, byte *out) {
  u/ U4 D/ w8 s- G  V
7 _' S- s/ t0 r2 |! G    vector<string> vec;
1 `& A$ r/ y* d! @; z2 k    string::size_type currPos = 0, prevPos = 0;
# E! v+ u4 A1 [+ \  A" D5 g    while ((currPos = str.find(' ', prevPos)) != string::npos) { ( b) t. c0 Y% F
        string b(str.substr(prevPos, currPos - prevPos));
9 c0 d5 }8 |* S$ }        vec.push_back(b);
: c, E- V: a# h8 d- ^7 y, K        prevPos = currPos + 1;
2 T; v  i& W" U0 o0 D7 m7 J    } 6 n4 k6 M& k3 H: r/ a
    if (prevPos < str.size()) {   _5 z4 i, w: ^
        string b(str.substr(prevPos));
( v" A- j4 Y2 R5 g: N$ I# S: n        vec.push_back(b); / X0 @7 ~( H# ?: S' Z, [
    } ) ]7 _" q* _$ {) q
    typedef vector<string>::size_type sz_type; 3 Z, B4 I$ S4 E$ M
    sz_type size = vec.size();
/ f0 D6 Q4 d2 V' b6 j& u' o; g    for (sz_type i = 0; i < size; ++i) { 7 V7 s* u" o% O' s- |
        int a = hexCharToInt(vec[i][0]); % K* S: w( C( p  b! O
        int b = hexCharToInt(vec[i][1]);
6 Q, a" G, `  q$ K; r+ q% W4 \( j( l        out[i] = a * 16 + b;
4 _9 a; Z+ W$ p" r& d4 V    }
- e  |6 P/ e" v    return size; ! q5 H$ z) ^- B# }) c+ z
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
8 m1 f! x% A' S. g! I! Y9 p#define TEA_H , Q1 b% C9 {+ Y$ U2 f+ r
% r+ ~% [1 _. U8 m: m
/* 4 @2 ]9 V  I; @; q. E2 W
*for htonl,htonl
; Q; i4 [. i0 T/ i5 J6 f*do remember link "ws2_32.lib"   X4 w2 B8 ^/ O- ]1 u4 x7 Z: D
*/
0 N, e; _* |6 u7 q& t3 R* _% T#include <winsock2.h> 6 m8 N7 _* v, `3 D; J" t( }( }# l
#include "util.h" # }/ L7 h" z1 A4 S! G
. b+ ~, D% I% q$ z) u: }
class TEA {
: O0 j" j- `7 Ypublic: 1 l% L3 g5 b. K% r9 {9 A: O
    TEA(const byte *key, int round = 32, bool isNetByte = false); ( F9 r$ K  f# j# X2 v, f
    TEA(const TEA &rhs);
+ x& _8 `& V( k- o/ Z* ]    TEA& operator=(const TEA &rhs); 7 N4 r  e" M1 v8 z6 G0 _- Y% o
    void encrypt(const byte *in, byte *out);
" P- k0 a4 s9 }: C( X2 C2 ]* c0 O    void decrypt(const byte *in, byte *out);
3 M$ {& @4 E) s0 o( c0 ~private:
) [9 y, ]4 I$ ^2 ]2 T. }    void encrypt(const ulong *in, ulong *out);
3 q7 a( n  K, S+ P    void decrypt(const ulong *in, ulong *out);   m' q2 C! R* o) A% Z2 A& R9 D
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
% _6 Z/ k9 C1 L0 a  W- E# o    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 1 _1 D: j/ T7 A5 F% L4 f2 {
private:
$ B& Y. X% i5 K, |% T4 C/ z1 @    int _round; //iteration round to encrypt or decrypt / x5 l: z5 p/ v& A  m
    bool _isNetByte; //whether input bytes come from network / h6 U2 N/ j3 m5 p# X6 V
    byte _key[16]; //encrypt or decrypt key ; l5 v$ H' d! V. t$ w# ^- B
}; ' o  Z" k& P" z+ v
7 w7 v/ P$ c, \/ T8 i
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
; K- o: |4 @* u9 L3 @+ V8 f6 ]1 O; v 2 #include <cstring> //for memcpy,memset
$ x3 g0 ], w$ M, C: N( ~3 s 3  
, e: ]4 d/ @' E 4 using namespace std; " K% }& }8 z! ^, C( D
5  
6 \, }" I. _; |: [2 V 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 6 k1 W! F% Q, A( D# K
7 :_round(round) " D- a: c3 f; N- Z3 K
8 ,_isNetByte(isNetByte) {
2 {8 q) r* J6 e 9     if (key != 0)
4 N" H9 C' \! R- `5 f10         memcpy(_key, key, 16); $ {: O. v; h- ?; R1 w
11     else
- M* q3 J2 c6 r% _2 U" H12         memset(_key, 0, 16); 8 o4 u8 Z* B3 ^$ U3 p
13 }
3 n  [) \4 w" C: u14  $ {: {- S# B( Y1 |+ F# {0 G# C
15 TEA::TEA(const TEA &rhs)
, z* [) A) q' t) q: p' ]( Z2 C16 :_round(rhs._round) 4 n: `) R3 i# d1 S. i
17 ,_isNetByte(rhs._isNetByte) { ! K# l" n* B! y6 w/ ?( p$ x
18     memcpy(_key, rhs._key, 16); * Q0 W, M, D4 B2 E5 G* G
19 }
# |: f9 B' N0 L6 K4 Q6 ^) N20  5 {! l5 Y1 L+ i( C$ D2 U
21 TEA& TEA::operator=(const TEA &rhs) { . N  c) B8 }  |1 w
22     if (&rhs != this) {
# F8 y& q: c& y) S23         _round = rhs._round;
, f- f- a' o, M: P: S, O+ C24         _isNetByte = rhs._isNetByte;
, P% I+ w1 Q3 J/ A0 ^: A4 x1 i25         memcpy(_key, rhs._key, 16); 2 u1 T# d5 @7 l( N: L/ L! H
26     }
$ _0 H( n8 x8 ~8 r$ f$ B) v27     return *this; 7 y( A2 ~2 C1 _3 r  G& ~3 ^3 q, h
28 }
: {+ n+ Y% p2 l* Y29  3 u9 |, F2 J' B
30 void TEA::encrypt(const byte *in, byte *out) { 8 l: O7 x) i1 [( o+ ]; N  H
31     encrypt((const ulong*)in, (ulong*)out); 7 j( a) u  P; k. V! r2 |8 q
32 }
# \% c1 {* K. O' m" e33  ' ]1 y; ?7 k7 a" t! C
34 void TEA::decrypt(const byte *in, byte *out) { / {0 s5 }9 b+ n  T: x" Q  M% m: V
35     decrypt((const ulong*)in, (ulong*)out);
4 o$ T; S# M/ {: _7 k36 } ' m& o+ s% i/ R) r# `, M" d
37  , Z2 }- Z1 [5 Z/ ~! W3 K+ q
38 void TEA::encrypt(const ulong *in, ulong *out) {
7 `4 u2 E9 R8 I7 i39  
2 \8 P% C9 j# p0 L+ H2 n0 d% n( p40     ulong *k = (ulong*)_key;
- ?" ~3 E: G' J! m+ w41     register ulong y = ntoh(in[0]); 4 `# `+ a& ^; T2 r' |5 I! l, x
42     register ulong z = ntoh(in[1]); , @- P3 z( w; y  g. j" N* w) V
43     register ulong a = ntoh(k[0]);
* Q8 D0 R$ V9 M0 p" _1 K44     register ulong b = ntoh(k[1]); / r, d  W- x4 V+ q
45     register ulong c = ntoh(k[2]); ! z  J  B% O4 K
46     register ulong d = ntoh(k[3]);
5 q- J& R4 Y! P* p3 \47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
0 W2 e( o' h) O5 r8 B# \48     register int round = _round;
" L) s* E9 f% L5 _6 g/ |# g) E, H49     register ulong sum = 0;
0 P2 T! @0 w$ B! s0 n; |50  
* N6 I9 w3 U% Q% S1 }, l6 q7 N51     while (round--) {    /* basic cycle start */
# q* ], M: t( j! H6 H52         sum += delta; $ F4 T# r2 z: {
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
. }+ d/ G3 o3 I0 q+ O: a! _# M54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
/ K  V2 o7 I0 N9 ^55     }    /* end cycle */
# g6 @* q* [$ h, @! W56     out[0] = ntoh(y);
, ]1 O9 F2 v( n: ^, [. V57     out[1] = ntoh(z);
- e2 Q- e8 H: l( }. b  n& G58 } 1 e1 o4 i, g# r' t: A$ f
59  
  c) T0 U' U9 H: t' }" h, G60 void TEA::decrypt(const ulong *in, ulong *out) { 2 |& t. N$ S& P2 L
61  
' Z& \: E. W% ]$ Y3 f# P9 N6 d& P, Q62     ulong *k = (ulong*)_key;
$ g+ V/ }$ J$ M2 Q9 B* r8 {63     register ulong y = ntoh(in[0]);
( m& g; q0 u1 Q+ s1 A: l64     register ulong z = ntoh(in[1]);
- ~; |; q) ~7 r$ W65     register ulong a = ntoh(k[0]); 7 ?" u7 w2 L' @0 s7 c
66     register ulong b = ntoh(k[1]);   y) N! O0 r" R! a% I" E0 c
67     register ulong c = ntoh(k[2]);
. Y, b7 n6 U: n- Q68     register ulong d = ntoh(k[3]);
/ F+ @) |4 j1 t, V69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 9 y; H+ a; [$ K5 i3 ^; _
70     register int round = _round;
7 D1 j7 w+ q% Y  u# d8 O71     register ulong sum = 0;
* Z0 t3 _7 Y) s/ ^0 k+ g72  
4 U9 E7 h+ e1 }$ z9 Q1 a+ e73     if (round == 32)
, p" |) T; u2 k5 _3 ~6 b4 }74         sum = 0xC6EF3720; /* delta << 5*/
7 S' h' j# j/ V' e3 C( |75     else if (round == 16)
( e/ E' B, G$ ?  k; |76         sum = 0xE3779B90; /* delta << 4*/ 6 x7 \4 @, [( e1 ^- \
77     else
# S) [6 f8 J. E  W) z3 K( n78         sum = delta << static_cast<int>(logbase(2, round)); 8 j# _$ v* l; [1 u) Q8 R% ^
79  
$ b6 N3 h$ u6 K, ?3 A7 A80     while (round--) {    /* basic cycle start */
2 ?" v+ z( j4 P, x, d81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 1 C1 {3 Y/ o/ L/ g/ v, T3 V
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
# n4 g# L* {2 V0 I. t$ N- E83         sum -= delta; 5 e" S& n; t9 L4 d) ^1 e
84     }    /* end cycle */
3 z# J1 \/ S1 c4 N& |6 u85     out[0] = ntoh(y); # V2 U7 v6 y: T/ `4 t
86     out[1] = ntoh(z);
: a% j; E" G; z$ Y) J4 \$ n6 j87 }
( ^! r7 J! I& ?1 V) k2 }' v/ S
+ }4 |* `& r3 X! e% \需要说明的是TEA的构造函数:
7 y4 X1 m6 D4 |3 @6 XTEA(const byte *key, int round = 32, bool isNetByte = false);
6 O6 P/ I2 {. U; b8 |1.key - 加密或解密用的128-bit(16byte)密钥。 4 B. J$ E# d, r8 j8 [  m; _
2.round - 加密或解密的轮数,常用的有64,32,16。 0 G+ g6 v" }0 X2 [' _
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
& L2 [% s4 m: h1 V/ i7 k) R5 k8 W; @/ m" o; _' f
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
: Z- h, r1 ~4 @, B! q. A 2 #include "util.h"
( q/ F7 a6 x  i 3 #include <iostream> ! O5 @" J0 R# x" g% F7 B" D2 m0 H
4  
7 l$ C" [& R- f9 _. G( V0 l 5 using namespace std;
8 @. p# ]/ U% V* J: N$ j 6  4 a$ M9 }2 W8 h1 i3 d; u" S
7 int main() { : k" W4 v  O% m( y( ]/ q$ c% c  l
8  
0 i9 x8 o: ^9 h" P 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 6 m/ j( ?3 _+ K1 X) F9 `. }% ?
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 2 c* R( O; O: j1 s- X
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 8 s  ~/ T' i8 u
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
6 X9 `6 @3 i% {/ M/ P' V13  
# A2 V5 V$ u  `* _14     size_t size_in = hexStringToBytes(plainStr, plain); " b5 o: G: V7 J" u0 Y
15     size_t size_key = hexStringToBytes(keyStr, key); ! D' O, _" y2 C. X1 J% [- N
16  
1 W% }# S7 H$ u/ A+ i& \% B17     if (size_in != SIZE_IN || size_key != SIZE_KEY) . J) F7 {; x4 D4 A+ |3 X) _
18         return -1; 4 R; S7 o' R0 `
19  / a$ H. J3 G" L8 F. l
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
* f" T$ O) O1 u5 c21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 0 a1 G! u+ P8 N3 D, V
22  
! x2 \8 h8 k* B6 p" j4 d3 r23     TEA tea(key, 16, true);
4 _. E0 g& U0 Y/ Q, Q24     tea.encrypt(plain, crypt); 7 ?& r0 I* n# k/ a$ Z% Q
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
' _4 {* V) n. C5 G- I8 `- g+ I26  ( h% k5 H( t4 ]& C# ]
27     tea.decrypt(crypt, plain);
6 \6 [/ H. j* M28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ( a" [7 J$ O! C$ G: g& H6 O
29     return 0;
* F! \: ]4 d2 |+ n+ h: T/ ]30 }
5 f2 G# d) S6 n" H7 H5 V' Z& u9 j( a* j2 E4 K' y' U
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
) T1 N$ ^; g6 J& p0 ]% h运行结果:
3 C& i/ r# q( L& N1 P2 t1 ~Plain: AD DE E2 DB B3 E2 DB B3
+ f/ ]; i0 `, a6 ^* N) |Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
$ R* L0 [6 s& hCrypt: 3B 3B 4D 8C 24 3A FD F2
& e1 s, l7 G1 Z( s2 V! iPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 20:22 , Processed in 0.021786 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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