找回密码
 注册
搜索
查看: 37790|回复: 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轮):
$ k! P2 S+ ?1 n2 V% p( m微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
1 `1 z) h& v3 L2 g( p4 n" YTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 6 R# {# p; I. i+ @  C
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
1 w/ j0 e& v4 i7 Y8 N+ W在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 * A/ R6 P8 @( O$ L) r
在 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. 9 v+ X6 z! t- }& |0 H3 P+ A
  2. void encrypt(unsigned long *v, unsigned long *k) { + i0 z4 A& k7 n# k, }
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 7 i- `' |, X* _+ p% g% d
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 1 q- g: v& U2 _' j5 J
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    # |8 u% g" a9 {8 ^7 c  Z+ B
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 1 A. x2 ?& i% g/ @6 Z, o$ t
  7.          sum += delta; 8 R8 n* M* G6 P2 A; a2 p( G: ~
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 4 ?, Q/ Z" [& P7 n
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    # B( k# U* w# b' w  r9 w
  10.      }
    - U7 I, k' e0 {' F
  11.      v[0]=y;
    % q8 J+ K/ _3 K4 H  a
  12.      v[1]=z;
    6 B; F$ c$ z" M8 g* T
  13. }
    ) z5 q  {0 B% @- B$ e
  14.   ( C% H. J' L  C  [& `/ q' E5 x
  15. void decrypt(unsigned long *v, unsigned long *k) {
    : z4 A7 r2 p  s9 a  I$ h" ^7 u
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    " v$ C7 ]. w* u2 Z% e, X' y( A7 m. V
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 2 r) U2 ?( ^6 O8 v
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ & c2 f0 Z8 Q$ y% o1 w5 O2 u
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    8 t/ N( q8 k( j6 F  `
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    , Z# {3 T- u( y4 A- `
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    $ N: v5 ]  T& E# ]
  22.          sum -= delta;                                /* end cycle */ ' W5 F/ }6 ]5 l
  23.      } 1 L  D* _! o: `* m9 N
  24.      v[0]=y; 5 ?! c5 a* a) t  `" \+ r8 @5 M
  25.      v[1]=z; 5 T5 i7 i% x, z) G' E
  26. }
    + \# ?( D8 d3 Y9 z6 \1 U. C
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
) X/ r' D' `7 F" z6 P#define UTIL_H 0 |% R# V# `% R

4 Q/ E) c4 C, E#include <string>
& u1 I2 i& y, O: i; k: _& ?#include <cmath> ! E$ r6 T2 [8 O; h& G" j' Y
#include <cstdlib> ! o( ?! j( T& o
5 c. r1 P! H$ |: f8 [/ T/ G: a
typedef unsigned char byte;
4 d8 v' H+ U  q: \3 ctypedef unsigned long ulong; - n8 A& Y% d: H$ x
' H9 c- E, \: w1 j, @
inline double logbase(double base, double x) { , s% U( S! Q# W: ~( B  K) ?$ S
    return log(x)/log(base); - C1 J4 y  Y6 B  L
}
, @1 }/ T. Y  l" ]6 }& h 3 M8 d9 p: U, p
/* 0 Y) Q2 P3 C( V' e8 B: H$ F
*convert int to hex char.   f3 `1 ?3 P% L" Z& h+ _
*example:10 -> 'A',15 -> 'F'
5 q  s( K& R# k*/ . a- d/ G0 _6 O6 M
char intToHexChar(int x); # Y5 |7 M0 c4 e3 k( o
0 D7 Q  R: V% }
/*
( g2 d+ L% L- o$ E3 D*convert hex char to int.
! z: P6 @) F" y" o' H* \9 E*example:'A' -> 10,'F' -> 15 0 L& H9 k* r4 h( A
*/
. D  V/ ^" @/ m7 Q5 mint hexCharToInt(char hex);
. \  m9 l' V/ _
1 u. d: x$ e/ F0 M) n" s# h; ?using std::string;
/ C$ G  _$ W, L; V( \( B9 l3 P) \/*
9 W$ S5 ^! n. @  k8 d$ J7 B*convert a byte array to hex string. " x  h1 ]6 K! H. B$ N7 H2 Q4 O
*hex string format example:"AF B0 80 7D"
2 Q' o( h* _6 O7 L0 t3 k' b*/
7 T4 ]+ A9 M; S) g1 zstring bytesToHexString(const byte *in, size_t size);
8 r( X( `1 a( V2 [ 3 ^4 p& P9 y; T& O0 m  D- t
/*
; ^1 ~& _: U7 ?/ Y( L; t( Y*convert a hex string to a byte array.
* n* ^5 h" L/ s/ u4 ~*hex string format example:"AF B0 80 7D" ! @% P. q2 H5 \; b4 o6 ?3 @
*/
% x5 C7 g: I$ B  |& ~+ v$ I- \$ i; osize_t hexStringToBytes(const string &str, byte *out);
3 V% O9 [+ f0 @. ?9 y
' {1 J2 H" K6 }! X+ D; a4 N#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
" J* u3 ]% z2 e# z- D. q- j#include <vector> 3 q# f/ g" u6 k* `6 P- x: \1 K; f

1 d+ z* b; |8 L; ^% N+ b3 cusing namespace std; 5 }  O5 C) }  ?: v; }% N5 r+ A% w

$ _$ @  O8 p: ?' \char intToHexChar(int x) { / C5 [( s9 W; ~9 M( ~3 `
    static const char HEX[16] = { 5 u5 l9 ^" U6 q( k
        '0', '1', '2', '3', * G' g2 u  q$ r
        '4', '5', '6', '7',
) K& M0 l5 c: |" d* V, x$ A: s8 E        '8', '9', 'A', 'B',
  u8 ^1 N8 e9 \- I# Y& Z, K# g        'C', 'D', 'E', 'F'
3 w, E4 R# n% o7 e- `, D. q    }; ; q3 _8 U9 B- \" @
    return HEX[x]; ; N* B+ d9 P# f- ?: `) O# |
} - x, [7 p1 E! M3 K2 w6 v
, d$ D6 t6 Y0 p$ t
int hexCharToInt(char hex) {
4 @: C6 ~6 ^1 i  v  P    hex = toupper(hex); ! w3 a, X+ T8 n2 c3 w0 M' J
    if (isdigit(hex))
; w1 W- l4 Y8 `        return (hex - '0');
1 S9 L3 f3 ?. l) C, t5 U0 l    if (isalpha(hex))
" F( Z$ H3 G8 |# Z! Q+ M  z        return (hex - 'A' + 10); : E) M# P' f) x0 r; \+ ^
    return 0; * |6 w( G- S8 q& m2 C, V/ R
} ! Q# A/ L% ~% D1 v9 j) ]
. l) X. x. r/ A# W# w2 B
string bytesToHexString(const byte *in, size_t size) { " c* h% r5 A( m4 X# l$ k2 B
    string str;
0 R# v* r2 O7 K1 L9 ~4 R" e    for (size_t i = 0; i < size; ++i) { 0 G" [  K; E0 A) E' G! a( G+ u
        int t = in[i];
' M2 {* q1 M- }' _' O& v        int a = t / 16; 6 V5 ?  I* f7 X( Y' z7 U& V, a
        int b = t % 16;
" s: J2 d* |5 X0 L  t, w. Y0 y+ X        str.append(1, intToHexChar(a));   l7 V* B+ i8 h" ?5 z0 i' h' g1 I& U
        str.append(1, intToHexChar(b));
+ I- I4 k- q. ]+ d5 x, _        if (i != size - 1) ' p1 J9 T" }9 r' K+ X6 i
            str.append(1, ' '); / ]5 r1 v( h3 g/ S2 G
    }
1 q5 y( D0 l$ ]5 U' ?6 T5 ~    return str; ' g  ?) O5 n! g* t4 Z/ _) _, V% g
}
, j# V* z& c, ?& ~* L8 h3 I: Q
3 p! J' G9 m; m0 c1 C8 nsize_t hexStringToBytes(const string &str, byte *out) {   f# r$ u1 q# x% p
( O, e1 O( f% r
    vector<string> vec; ; L5 o' U, q9 P/ \0 f+ j
    string::size_type currPos = 0, prevPos = 0;
5 n- J2 X5 b# X    while ((currPos = str.find(' ', prevPos)) != string::npos) {
$ O( `1 o" _; M% \        string b(str.substr(prevPos, currPos - prevPos));
3 Z* R+ a( r* a, U4 ~+ {        vec.push_back(b);
* r. I) g- _. c; r+ P; ^        prevPos = currPos + 1;
- B6 L$ q. ^  I, b4 L    }
. m+ q2 N; G8 a! \4 K    if (prevPos < str.size()) {
0 k1 B' Q, b# Y        string b(str.substr(prevPos));
4 w/ J- U- D2 w$ S+ {" s        vec.push_back(b); 5 X8 X4 R7 ?$ x- G1 R
    }
7 P1 J8 h. S( b    typedef vector<string>::size_type sz_type; 2 e4 I* l8 x1 m2 P" d9 |: |2 D
    sz_type size = vec.size();
9 R9 q7 g2 n- q+ l2 z  W* `. m    for (sz_type i = 0; i < size; ++i) {
9 p! e2 m5 S( H  r4 n        int a = hexCharToInt(vec[i][0]); . O" R9 k0 P- O* l' `
        int b = hexCharToInt(vec[i][1]); ' N6 g3 {0 ^$ |6 S' `* R
        out[i] = a * 16 + b;
) G- M5 z% w  R4 _: J' K    }
3 r( |% w5 y# }0 M& ~' h8 b# h$ p    return size;
2 \9 [. F- V; B& Y9 _- _}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H . J3 @: T; E6 ^5 o/ V" ^
#define TEA_H : n1 A' Y/ p6 U, i* R% p
1 ?. ^4 s' j5 d) k/ o0 M4 p  _( e
/* . V3 a0 }& F5 P! _' s' e' y
*for htonl,htonl
) ], B+ l* S1 a, e*do remember link "ws2_32.lib"
, n8 D( ~) M4 d% |*/
  {" g) W& C6 T% W#include <winsock2.h> 9 v7 T! O+ S0 ^3 j3 j, r& B* E, K
#include "util.h"
% l8 E/ V* b& `1 W2 P
) q( r6 ?% C% V; c; }% o! I% rclass TEA { ; y" L  x7 j: ~+ I* ?" q) s
public: / j4 \3 A) u* F5 Z( M
    TEA(const byte *key, int round = 32, bool isNetByte = false); 5 [; z' a$ q' ?, l
    TEA(const TEA &rhs);
! G$ L7 B9 _. ]0 v# R! j    TEA& operator=(const TEA &rhs); : ?! e0 c$ |. \
    void encrypt(const byte *in, byte *out);
, H- S. i6 H$ u9 B  S. x    void decrypt(const byte *in, byte *out);
  L) f/ q, c3 cprivate: 6 ^6 f: O" c: M  U6 k
    void encrypt(const ulong *in, ulong *out); . o' ~/ A, ]' `. Q9 M
    void decrypt(const ulong *in, ulong *out); 5 t7 w& x1 ]: |. t4 G
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 6 a! j2 w1 P" G3 e/ O1 {
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
3 \2 c2 K) [, M6 A5 `* G1 ?private:
# K# X6 J6 I! g0 p5 I    int _round; //iteration round to encrypt or decrypt 6 j1 e( T* ~) ]6 o4 ]; T3 I+ K
    bool _isNetByte; //whether input bytes come from network
9 B. o  _0 w: l7 _+ ^$ M    byte _key[16]; //encrypt or decrypt key * n& V( V( I0 y- K/ |' Y# I# P
};
& I6 Y  T8 {. K ! \9 K4 o$ [) I: r" A
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 8 e  E2 D$ E) [* o1 ~4 Z/ N
2 #include <cstring> //for memcpy,memset , F- s9 o0 }8 z# H1 G
3  " o. S1 W; _  L1 P3 `1 W$ ?8 `/ v' ]
4 using namespace std;
, Z3 ^6 |. V" E! ^ 5  
7 f% {! k% {/ d. f 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) : [8 J& p: }# |; _# e. A! t4 h
7 :_round(round) 9 D! y' F/ V8 c* Z
8 ,_isNetByte(isNetByte) { 6 }9 r; z% P& W% v
9     if (key != 0) , t$ [. T2 |3 Z
10         memcpy(_key, key, 16);
3 B+ }2 ^+ G! i' ]5 k$ W- C11     else : [- ~, j0 ~# Z3 A- K& z
12         memset(_key, 0, 16);
! Y  _  h7 G: g1 r5 `13 } ) m8 R/ q; M2 [+ ~
14  
5 t/ r. K4 W  ?8 [; i15 TEA::TEA(const TEA &rhs) 7 a5 E2 s$ B6 [8 q9 R
16 :_round(rhs._round)
" Y& ]% U; g7 _& _17 ,_isNetByte(rhs._isNetByte) { ) i9 Y2 p; z. ?3 _' j8 ~" `
18     memcpy(_key, rhs._key, 16); ( \* @* Q/ L+ m' v% P/ i
19 }
5 \7 k$ S' \; G  j+ d20  - N" M: \1 Y: I4 t1 U
21 TEA& TEA::operator=(const TEA &rhs) {
. I9 N# a3 F9 c: h22     if (&rhs != this) { 0 A0 `4 Y9 R' l( u
23         _round = rhs._round;
; z2 a  i7 l8 b9 O  Z24         _isNetByte = rhs._isNetByte; 0 Y+ [8 T8 b4 @8 z
25         memcpy(_key, rhs._key, 16);
0 ?& i- }7 b. U2 W! z26     }
) S' K1 P8 Y! ^) C$ x/ d" B27     return *this;
) [2 W8 R7 Z6 q1 b. g* G3 Z28 } : j. I: C  r8 e0 F  `# Z
29  ! _9 U, Q0 j: ]" m
30 void TEA::encrypt(const byte *in, byte *out) { 7 }% u+ {! J. M
31     encrypt((const ulong*)in, (ulong*)out); : ~# S% b2 A- p/ ?
32 }
  P/ P' p% K4 ]4 ~. G( Y2 O33  3 ]( e8 c, A9 R
34 void TEA::decrypt(const byte *in, byte *out) { 3 `4 d8 t( R3 h: P5 r5 a
35     decrypt((const ulong*)in, (ulong*)out);
) u% I/ a4 P6 s! y; q36 }
4 J! }- K% J- e. h) U6 ~1 ^37  
2 I/ y4 c8 e0 i, N* w, \38 void TEA::encrypt(const ulong *in, ulong *out) { $ q* x1 A; z* N# p; o
39  ; J; x) v2 v; X3 @* b
40     ulong *k = (ulong*)_key;
8 T; C& Y) R$ P1 V2 P2 @8 X, P9 V41     register ulong y = ntoh(in[0]);
" m. g3 A6 t* G5 x+ v( i42     register ulong z = ntoh(in[1]);
1 H3 ^8 z" N. L/ X4 {+ f43     register ulong a = ntoh(k[0]);
2 D# }1 C( M" c- m$ t, Y. W44     register ulong b = ntoh(k[1]); . y4 b; n  q" X* G+ W1 {8 G! w$ N7 `
45     register ulong c = ntoh(k[2]); 2 Q/ J; X! r& q% o4 X' B5 S' v
46     register ulong d = ntoh(k[3]);
) m+ ?, S1 K6 ?' M1 j; R4 L% _0 i47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
& }- ^' {9 Z- T6 T: J! K1 K48     register int round = _round;
. `8 Z8 y6 j/ E; Y" d, l) C49     register ulong sum = 0; & Y) T0 ~3 |8 A- Z" i
50  
0 [* K# i" ?- D2 ^) v51     while (round--) {    /* basic cycle start */
. J& L# n4 x8 g2 q/ ^6 s6 F/ S52         sum += delta; ; b  p3 E' `  k: x0 v  F7 z+ |
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
8 B, _) P* Y5 P) A! d& j5 U54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
9 K. Y7 G) }% \/ U$ N55     }    /* end cycle */
* q; U1 a6 d6 U/ V+ N% g56     out[0] = ntoh(y); 1 K0 A# A, j  \& g& ]7 i3 _3 N6 j
57     out[1] = ntoh(z); 4 |4 U: G) ~9 r  v! X9 A: V
58 }
& H3 Y: R/ @/ \$ D2 \6 ^+ m7 p59  
* P" p) f* h0 [60 void TEA::decrypt(const ulong *in, ulong *out) { 4 o# R5 v6 P: R" b! V/ p
61  1 g& O( H% I# P* [" p6 t
62     ulong *k = (ulong*)_key; 8 g5 C$ J! l3 K5 s* k8 M  c
63     register ulong y = ntoh(in[0]);
# Q9 `8 Y! U2 v& ~6 D1 G- {5 D& o# W7 R64     register ulong z = ntoh(in[1]);
1 D# C3 q8 O( p65     register ulong a = ntoh(k[0]);
2 y( g" X5 I; ?0 V' p66     register ulong b = ntoh(k[1]);
" h, p& s+ R/ K& y67     register ulong c = ntoh(k[2]);
$ y! u4 }* Q( i3 w2 J; D, M68     register ulong d = ntoh(k[3]);
# M" C2 S! f: [) W' }69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 2 V. H1 w6 p% W% X0 Q8 E
70     register int round = _round; # C" M+ \0 l8 P5 A- h2 @; A
71     register ulong sum = 0;
# L1 a2 a/ U; G8 t( c- W: ?72  9 ]- ~/ t3 U$ M" o; x
73     if (round == 32) ( M+ G# M' t0 L; K
74         sum = 0xC6EF3720; /* delta << 5*/
/ f5 p( w% h& g( l: f7 h  K8 |0 W9 \( U75     else if (round == 16) - d( t; T9 k) z. ~  a5 o
76         sum = 0xE3779B90; /* delta << 4*/ / q5 r' p+ z- L$ I
77     else & t8 _, W, A* R* g/ z) T* y3 q
78         sum = delta << static_cast<int>(logbase(2, round)); / D; D+ U& Y# Q8 V6 A7 H9 ?% {7 y( W  b
79  7 ?: E) S9 t* `# b7 d/ l9 }
80     while (round--) {    /* basic cycle start */
* [- |& i0 R8 ~9 z, r7 R% v81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 2 ~; s" C; t* ]( ]0 }2 W  e0 H3 P$ n
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - f& G- c7 p: P! z! s
83         sum -= delta;
+ u- c5 P# D# c6 U& [5 c4 Q84     }    /* end cycle */ 7 a4 A( p5 x% Y! ~# a! p6 C
85     out[0] = ntoh(y); - j* ~& S! p9 ^
86     out[1] = ntoh(z);
5 V+ Y& B: r! M# v; K  A& T) {87 }
# `$ E2 ]9 O1 [! b  @& j, E8 W+ E9 u" n1 ^* z3 j. G7 {4 n
需要说明的是TEA的构造函数: 5 \) s& L: b- e/ g. b
TEA(const byte *key, int round = 32, bool isNetByte = false);
  R$ q1 L* [( |1.key - 加密或解密用的128-bit(16byte)密钥。 8 b# ?; q9 F* G
2.round - 加密或解密的轮数,常用的有64,32,16。 * y7 y# |0 i% \
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
( S9 r/ M/ i$ t( [8 y+ V2 A$ v5 p
/ u1 U( Z: ~6 k% I6 {2 D2 ?/ i最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 6 R. Y$ c3 k4 C5 u( b
2 #include "util.h"
: ~) x# v) ^1 }2 j, N 3 #include <iostream>
# W) M+ Q/ r/ j! i5 R* N 4  7 l$ h, ?: |! r7 K% O# h' J
5 using namespace std; ) ?$ Y# E( b4 f0 s
6  * U# z: w( }* x, g
7 int main() {
  F) T: n! g" M. H1 `8 v# }9 o 8  
; P& r# d3 Z, u! S+ m: K) P* a7 w 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
3 p0 H( [% v7 S4 c10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");   v! s6 W5 w; |. O2 T2 f
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
& H8 c/ }3 o* F# h. G12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; : v6 ]; T+ }* r+ t; _6 K9 D
13  
+ f. r  _3 V* ~6 {14     size_t size_in = hexStringToBytes(plainStr, plain); 1 k, e& u9 j# A
15     size_t size_key = hexStringToBytes(keyStr, key); $ T1 w2 p8 T- H/ B6 ?0 y' m2 C; M0 @" F
16  * s; E: c# y7 I, s8 I; H
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
7 h% L, @$ F' L; a$ P1 A( b0 @18         return -1; ( Y9 h% L) a3 E6 `
19  ; H! m; _6 p: o0 c; D" Q( W
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; % q' X, h: r0 Z8 Z* z
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
7 L5 T# E' u5 I. ^; L( y9 ?+ q7 i22  8 Q! Q7 i% L3 V% \; v
23     TEA tea(key, 16, true);
- ~( W4 Q& K/ Y4 V24     tea.encrypt(plain, crypt);
* e- `+ m) \3 Y& t. k25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; . P, D  |. u5 _" e$ K
26  
# N0 a  N) J% Y27     tea.decrypt(crypt, plain);
" b' @! o1 L/ G$ a% z% ^28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 4 {! I6 A$ g( N- o% R! Z1 y# i
29     return 0;
9 M- x% o2 |+ j30 }( J/ F( g; ]- R" d. x. |& J
4 J) q. N: n! r, H
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx* y1 g! J0 `& S* t
运行结果: ) l2 L7 U8 M  q: j& [8 T! O( V% K
Plain: AD DE E2 DB B3 E2 DB B3
5 B' R. q# r( f2 m& s5 Q& rKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
2 }: x, W: y  }7 e* l- k) [) W9 h4 \Crypt: 3B 3B 4D 8C 24 3A FD F2
/ E5 J5 M" \, NPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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