找回密码
 注册
搜索
查看: 37771|回复: 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轮):
5 b& k! r/ k  J; G3 y3 [6 E2 N微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 5 x3 H$ S# z* [, N& E* ^" v# N  r
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
# C5 L6 J2 h* {  Q9 a- \  L之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
6 B, q, R4 v6 R- l9 g在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 . n) _( o: u& ^- i# ^
在 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. ( ]' K$ u6 o( [6 V" `
  2. void encrypt(unsigned long *v, unsigned long *k) { ' \/ ?- m7 e# l! s! A* }
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 8 P$ i5 p# K: v0 L! ~. n- `
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 5 l4 P  a- ]5 H, g4 ^6 @, o/ A
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    % Y# M# G$ X6 T( [* l' P
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    1 l2 q$ ^' D( s" i- V( ~& x2 P
  7.          sum += delta;
    ) x3 f, s: h9 L% p/ M1 |
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    1 c, k1 z. {2 C
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ $ C1 w, v( U# C; R; G* \
  10.      } ! w/ G3 N0 P9 S5 h' k
  11.      v[0]=y;
    ( L- B, s* u* z3 i6 p
  12.      v[1]=z; " e7 U+ t8 |, u3 ]/ u2 c4 c# p& E
  13. }
    0 D4 s0 U) x* a( h( e+ \: a' _
  14.   4 T$ |" `& F+ l
  15. void decrypt(unsigned long *v, unsigned long *k) { 2 \) x; _5 U  ^$ X* X0 p
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    4 l; q2 [$ H5 m; {* }2 D
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    - R  ?3 q& b) P2 D7 P
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ; M/ S+ d& S( t
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    7 L* U+ L' L$ H) j* j' t- i  l# s
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # J9 A+ k% e  z: t9 w
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ; C  v. L! a  @+ H# j( F
  22.          sum -= delta;                                /* end cycle */ : O) {$ i, L' M- S& U: y! ?+ ~5 D
  23.      } " p5 S# \3 ~; s7 A' y# F* t
  24.      v[0]=y;
    3 V& }9 q8 q+ d) L3 ?; k" k5 F
  25.      v[1]=z; ' S' |: f: e# y- V
  26. }
    . x7 G/ C& X! k6 H2 u& M
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
/ y0 g; h0 W& \# Z4 C! B- J' n. h#define UTIL_H
* q& \5 }0 U1 v( E5 b, D* M/ i" o. j6 M7 c, y6 n# ^5 B2 |
#include <string>
, }% K% x: [- ?& S#include <cmath> # r, O0 y7 l/ z+ `$ G
#include <cstdlib>
# G: i' D, P$ g  J ) {6 T5 m! ]. @8 H$ ^) q" w- _
typedef unsigned char byte; ) y& r1 I1 o) T: U! M, w2 ]
typedef unsigned long ulong;
0 D4 W- h* G. {! V # j: [6 w- |* R% }: x' ]1 d/ @1 R
inline double logbase(double base, double x) { $ L. @6 u8 _: @! V! [# c3 \
    return log(x)/log(base); : U/ S5 f1 a" X) h
} ) A' ~' t% I3 A$ b- S
1 b+ X9 E7 C0 v* \
/* 0 t- h' y  G( g: M0 C* {, p: m3 g& j; _
*convert int to hex char. 2 c* f- h6 y) R" d4 _# G
*example:10 -> 'A',15 -> 'F' 3 `8 x: x# L4 T
*/
- y; K. R5 W' Schar intToHexChar(int x); 1 p* q& s9 g+ J4 d& D
% r8 X) ?+ n/ z7 h4 L4 }# {
/*   S: d; V5 Y  c2 h- v
*convert hex char to int. 8 |/ M7 D7 i- J
*example:'A' -> 10,'F' -> 15 4 v5 |7 y2 o% @. j, n/ `2 n5 Z
*/
. l3 ^; E( J) W" [8 V9 Fint hexCharToInt(char hex);
/ [( C+ f$ l/ E# i3 }* C0 J
* j& w3 g# ]) n2 S! C5 |using std::string; - l& R$ g8 ?& R( |1 e0 v; ?
/* % m8 M" B; S: [" l4 T! E
*convert a byte array to hex string. : I9 f$ D5 s! a+ o  |3 Q
*hex string format example:"AF B0 80 7D" / S- S% V' ^$ Q, `( \, r' S. A' @6 u+ g
*/
( D8 t* r# g; @* q- g9 N  c2 Fstring bytesToHexString(const byte *in, size_t size); " s/ J4 ~+ R5 H3 n2 {
8 `1 m' S& ]: u+ f2 ^" ]
/* , H& G- l" M$ Q! ^
*convert a hex string to a byte array. 9 g8 L$ z; \& C# `  R1 y
*hex string format example:"AF B0 80 7D" 2 x  R1 F) ~+ Y* j/ X: T9 M! _' z
*/
: S/ R" s2 s5 N, \& ~, w/ ?size_t hexStringToBytes(const string &str, byte *out); , h& v( ?* z1 a8 g) q8 N! A6 d

) \% a- |, K  c. d: o* _#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
; O* L% N! c- b& C; d2 j#include <vector>
" S0 F( C0 _( M( P: ~* X6 J7 B / S6 d( _5 D- _1 _: s2 Z
using namespace std; 6 H1 v* E$ R! Z. U* v' w- O

9 b9 x$ [. v2 |1 h- Ichar intToHexChar(int x) {   m; W( A& S. ^- r7 f7 c* [
    static const char HEX[16] = { , ]" S0 N- E: ^) ^
        '0', '1', '2', '3', , q$ n  K- _* A( O$ I! l
        '4', '5', '6', '7', 8 N3 i# R6 X1 Y
        '8', '9', 'A', 'B',
+ Y8 \. K/ Z9 ?. m2 x        'C', 'D', 'E', 'F' 1 c8 A* ^. x( V- l
    };
6 c  W  \, T  `+ B, M# R, B  |; @    return HEX[x]; 0 Q* C+ i+ A& K: Y
} ; N! F. R. q+ j+ i  ~7 i! F* g$ l* N
) m% S) M. A7 e' F9 v/ L
int hexCharToInt(char hex) {
) d5 F3 P  C( b$ x* B* V. t    hex = toupper(hex); 0 F# E% z# ?) W
    if (isdigit(hex))
* p* m( {) s9 I3 r        return (hex - '0');
$ t2 [  N  a. o, O9 Q    if (isalpha(hex))
0 n. I4 E5 ~8 E  f! L! V+ [$ H* A        return (hex - 'A' + 10);
2 N3 O: {5 a  ?3 a7 }& q, ?/ u3 l* T    return 0;
6 Q0 ?& A, z  r, `3 O' Y} , g. K4 s. h& |7 s
* R- V% y& w% C5 b5 v
string bytesToHexString(const byte *in, size_t size) {
6 \- {. O1 s8 X5 b6 z- M5 d  S4 O    string str; ! L8 J1 ~, K  d! R7 m' ]8 u
    for (size_t i = 0; i < size; ++i) {
# Y! k& }" A( s& |        int t = in[i];
% r" @( Y! m8 B' [7 [3 |9 p        int a = t / 16; 4 `+ E& P. b$ R8 |: r
        int b = t % 16; - L7 T- ?4 c+ x6 r, @
        str.append(1, intToHexChar(a)); ; R* e  R3 i) r* M, W5 A3 F* k
        str.append(1, intToHexChar(b));
( F2 {+ f+ C5 D# ?. s/ Q# h, c8 v8 P        if (i != size - 1) . ?; V/ ?9 k% U8 r9 s0 h( r7 t
            str.append(1, ' '); + @& Q. [( s3 U6 p  J, E7 {
    }
  p" o5 b! s7 c# j* f5 U" g9 I    return str;
) z$ D* r; y0 [3 N. m1 m- Z6 p( ?' q; M} % q, ^0 `1 l: K& `" @) E1 B
" b, f8 e7 N1 x4 a4 c, q# a
size_t hexStringToBytes(const string &str, byte *out) { % V! s5 G3 \$ a
9 o2 ?  z6 r. T5 M4 S" X
    vector<string> vec;
9 U. E. }5 D! Q6 D; k8 X    string::size_type currPos = 0, prevPos = 0; 1 |. d! B9 o8 l8 \4 ]
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
$ p. n- n' D# x0 g; W  b. m        string b(str.substr(prevPos, currPos - prevPos));
4 \6 n. B% Y3 C$ m/ W        vec.push_back(b); 6 x2 t% F* D5 A$ W
        prevPos = currPos + 1; - n/ D8 h! ]* \
    }
8 p/ K- v9 C, b: K- j" W6 l    if (prevPos < str.size()) { ' \1 E/ X7 }! X! a# C
        string b(str.substr(prevPos));
. f2 J, i4 d4 I  S" k" S        vec.push_back(b);
, C$ o( T6 i5 X1 W$ d+ H$ c. A    } / ]  R. l8 T* |" Z
    typedef vector<string>::size_type sz_type; : @" W( B( m) z/ A
    sz_type size = vec.size(); 8 f+ A5 U9 {. F& Z9 ^: K, P/ r: i! f
    for (sz_type i = 0; i < size; ++i) {
& m& ~: |. O7 R; R% h" l% u        int a = hexCharToInt(vec[i][0]);
0 N( P/ W, ?7 G8 R        int b = hexCharToInt(vec[i][1]); + f( r) H" M  k" A* w  Z
        out[i] = a * 16 + b; : [) Q3 D  O/ f5 e/ }" J
    }
, {6 x# q0 Q7 }+ {, X' R) g9 {    return size; , s  L+ d$ k. A. O. W
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
2 s1 P( ^- P( @, F* o! i+ a#define TEA_H 9 O* z  T, r; s6 U+ z
' Y- {, B7 Y8 N- t3 f  {; L9 P
/*
9 X/ x  m; r: @( p3 y4 V, t( p*for htonl,htonl
+ U$ [0 T' i* E& T( [/ ~0 K" k5 Y8 W*do remember link "ws2_32.lib"
$ U8 h" D) ]# ~: U& x8 d* a*/ / K9 p9 x* Z. m9 V" [( u
#include <winsock2.h> 8 j( Z+ d" C: r7 k0 I/ X
#include "util.h"
; h3 v5 p+ q$ [. O, f0 G8 T% Q( m7 y % U$ m6 b  Z, Q: s! X6 f; e& q
class TEA {
. a9 z4 H  ]8 E+ A& V: a. mpublic: + {0 q) o0 V/ i, Y
    TEA(const byte *key, int round = 32, bool isNetByte = false); ; T4 E' X! e/ I8 k# K" ]
    TEA(const TEA &rhs); 3 |" Q% H6 i+ m) u& q: D) F, A2 e
    TEA& operator=(const TEA &rhs); ; @7 D! x  a0 u5 D
    void encrypt(const byte *in, byte *out); # U1 a# m5 X% q/ R3 q& l5 c4 |# G
    void decrypt(const byte *in, byte *out); ! D7 h1 J, I( a5 a% R" c
private:
" ]: l; e- C; `+ i8 B) }/ L    void encrypt(const ulong *in, ulong *out); 0 K8 E- _9 r# H/ r0 R" O" h
    void decrypt(const ulong *in, ulong *out);
# S3 [) [  U3 Z: A    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 7 d- }% P# o/ V  [+ d
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } . Y$ h9 `$ M4 ^8 F5 B* ^2 U
private:
0 P! e4 {  w6 r2 d, ]# i    int _round; //iteration round to encrypt or decrypt
; J$ p& B3 C" |) I% E1 J: c  s% a  ]; }    bool _isNetByte; //whether input bytes come from network 2 p" g3 y' ~* d
    byte _key[16]; //encrypt or decrypt key
/ k! e. v, B( a! C+ u}; * _9 r4 Z( V: u
& s2 c9 y- d% w; C; J  |
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 3 P- v$ x. L' i
2 #include <cstring> //for memcpy,memset
4 n2 f- m' J/ J 3  
3 n5 L. Y% R5 n  v3 v( Z4 Q 4 using namespace std; % w2 x7 g! c4 w
5  
2 n# N# S0 u  r- R4 A 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
4 y! j, _: ]" c- | 7 :_round(round) 3 p" q  F( K: w1 b0 f/ q( ]- b
8 ,_isNetByte(isNetByte) { % C. `& U( s: Q
9     if (key != 0)
! M4 w! r2 N& K" X7 Q10         memcpy(_key, key, 16);
1 t* |8 \) s; M' w+ E11     else . v. V' ]% k$ c: u+ p
12         memset(_key, 0, 16); " v& \" q* @/ P* y# _+ @- i/ \" t- O
13 } / |1 ^! j9 ?0 q6 m' J% K% ~
14  
5 _6 q" [& e% g7 [15 TEA::TEA(const TEA &rhs) 6 b/ N) D* `$ F, ~. i6 Y' v, s% c
16 :_round(rhs._round) 1 e4 h* B/ Q7 M( D, T2 j
17 ,_isNetByte(rhs._isNetByte) {
+ u3 w- \& }0 B' r  _, q  m  W7 V18     memcpy(_key, rhs._key, 16);
1 [9 X) {' p/ v; Y19 }
+ E- S9 x# T' S5 w4 R* D20  0 w. z8 @+ j% o' B
21 TEA& TEA::operator=(const TEA &rhs) {
8 e0 I+ ~- F/ d8 \! `: B22     if (&rhs != this) {
: j1 r- n: ~; {23         _round = rhs._round;
. \; S& q; `5 N3 c% [+ Z24         _isNetByte = rhs._isNetByte;
3 M0 o/ p$ U! ]- l" i" B0 D25         memcpy(_key, rhs._key, 16); 9 p) Q5 B5 l0 t" e0 C7 e
26     } * ]2 {4 }, J6 z0 h: c* r% G- g
27     return *this;
6 ^; a# z" ?7 v: Q28 }
% X0 u# h" _9 t& J29  
7 _5 i5 \2 u7 L) ]! F9 z: [30 void TEA::encrypt(const byte *in, byte *out) {
+ m1 b! a2 R+ L9 ?" `7 N31     encrypt((const ulong*)in, (ulong*)out); 9 T4 a! q( z1 g. h( C, w9 C
32 } ; ^, J9 o) B  i2 A3 y! |/ C  x
33  
6 ]4 W$ i6 S; j8 a, h6 Z. w1 b34 void TEA::decrypt(const byte *in, byte *out) {
0 p: g) g/ T9 Z& {' }35     decrypt((const ulong*)in, (ulong*)out);
+ l- g5 e, Z6 t2 L6 s9 A36 } 7 K% T" k4 v6 b& F2 |
37  
; t4 X" u5 b4 `/ |6 e38 void TEA::encrypt(const ulong *in, ulong *out) { 5 x: N" b+ B$ e$ F& R+ c9 ^
39  
' \, J8 y# }& I  t8 g40     ulong *k = (ulong*)_key;
  E7 J; O2 P4 {. w1 |, t" Y. C6 f0 Y41     register ulong y = ntoh(in[0]); 4 t) t2 M0 Z$ I& a7 T
42     register ulong z = ntoh(in[1]);
4 a6 L+ e% u  t43     register ulong a = ntoh(k[0]);
0 G/ L7 {) W% o& w) b$ d* d- m44     register ulong b = ntoh(k[1]);
+ {( \8 V/ m( P. {/ A* T45     register ulong c = ntoh(k[2]);
1 S. v+ {( K  x- x. {46     register ulong d = ntoh(k[3]);
4 g4 G: q0 k; |% C5 ]' s3 `, I" b47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
0 x/ n0 f. [7 M# o9 v7 i48     register int round = _round; ; q1 F5 t+ P8 w! z
49     register ulong sum = 0;
' V' o: ]' j0 T% I$ }! v4 `50  / `! A$ y- s& D6 M+ u
51     while (round--) {    /* basic cycle start */ 3 X2 d- b" d; W6 o+ U0 C
52         sum += delta;
  B" X" X* B$ w  U7 A( e+ I; `53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); * R- s# Z2 Z+ G, D
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
# t( Q; P4 o8 Q55     }    /* end cycle */ 9 \4 P2 `% ^/ [/ f. e
56     out[0] = ntoh(y);
! Q5 ?/ v" V: c3 L57     out[1] = ntoh(z); ' ?! I8 e# z8 I/ B! N5 p* \
58 }
, R0 q8 D8 j: v6 J6 u/ Q% ]59  3 Z5 n& {( i# W  K# J# v
60 void TEA::decrypt(const ulong *in, ulong *out) {
$ l2 S% x. x( c61  3 R! g( O  q$ ^4 z+ d3 ?
62     ulong *k = (ulong*)_key;
. J( T0 `( ?) V  M9 r  f0 P8 @9 N! L63     register ulong y = ntoh(in[0]);
( _0 V. ^5 Z8 x1 I( a0 \64     register ulong z = ntoh(in[1]); ' ]5 O" K& `1 e/ A3 l
65     register ulong a = ntoh(k[0]); : \) s/ s6 s4 D; U
66     register ulong b = ntoh(k[1]);   h: c# I6 K' X- O
67     register ulong c = ntoh(k[2]); & `! X" w4 q; X! Y+ N0 g
68     register ulong d = ntoh(k[3]);
: B8 R+ H/ N, Z3 r/ h$ h69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ , z- J- ?/ w3 n6 {% n! \( d
70     register int round = _round; 3 O* g; [: r/ c
71     register ulong sum = 0; 1 ]9 Y3 L, q/ b( y' c$ {8 M8 [4 j
72  $ S( P3 ]8 c) a; _7 E3 }) s; K
73     if (round == 32)
4 w3 x) x& N( {74         sum = 0xC6EF3720; /* delta << 5*/
. Q( Q9 u2 \/ p5 ]75     else if (round == 16) ' o3 x' h: w; [8 f$ E2 X
76         sum = 0xE3779B90; /* delta << 4*/ + ?" n8 _, f$ N  Y% T, b3 @" J
77     else
. R/ g! c8 X% w78         sum = delta << static_cast<int>(logbase(2, round));
* Z( z( E4 \* A- Q( }" Y- A79  - K  S0 y4 y- x- N( G% Y
80     while (round--) {    /* basic cycle start */ # T5 Z0 M3 {7 E; J# _" U7 J# R9 O
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
; E8 b8 A/ [& n9 h( y& s( K: O6 h82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
5 p  Z5 p7 _, [" m83         sum -= delta; ) O7 i( q4 I) U% H" R; c6 U
84     }    /* end cycle */ & Y# X+ C1 b3 E# Z
85     out[0] = ntoh(y);
5 E8 o2 E3 `7 e86     out[1] = ntoh(z);
. @! n$ A% n3 F5 J& p87 }( M' S+ W! k! ]. T

' l( t; X! ?/ {" v; r* {" X需要说明的是TEA的构造函数: 2 `: Y% M' b& X/ F( |
TEA(const byte *key, int round = 32, bool isNetByte = false);
  {$ N5 q. q* c' w3 s3 c1.key - 加密或解密用的128-bit(16byte)密钥。
1 q# ?/ b4 s! c8 `8 w+ x2.round - 加密或解密的轮数,常用的有64,32,16。 $ O9 T% u+ h- G! Z0 U8 j5 T7 }) X
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
9 s8 {$ n: u# r4 I- @6 Y" y0 F9 `# }6 ?! d8 s, H2 V6 A
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ! _/ P7 }& x& F- {) G
2 #include "util.h" , G1 U9 @- G7 H9 I2 I: L, y
3 #include <iostream>
# S! n* o# N7 {, c7 y5 R 4  1 Q* I$ I) `& e+ Y
5 using namespace std; . q4 H7 \6 J. |) r9 o$ |
6  
6 E+ u. i/ P1 B% `  ^3 e3 D- e! ^3 Y0 J 7 int main() {
' {. I8 @; e5 q& f) F* k- R 8  
0 e6 D9 l1 L3 k3 j+ M* m+ p" H  m 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); % R' a: e! N$ z+ ^/ m( z4 [0 A
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
* V+ L2 M2 I9 r11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
3 v# \7 N" _' S: |9 n12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
* I8 ]( q( Q. c( }! m13  ' {! S; L& p/ h8 m& q
14     size_t size_in = hexStringToBytes(plainStr, plain);
6 ^+ V. J' u0 p- e5 P/ _15     size_t size_key = hexStringToBytes(keyStr, key);
% ~' u) ^$ ?$ R5 T# X6 s16  " N( J" B( ^; O/ v6 g0 j: I
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
  {  \9 T) L4 c% C6 a18         return -1;
! b* q6 f  R' e19  
5 Q2 t+ J# G- z( O3 \7 d% ?& }20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 2 V3 L( v8 g# c; j$ t
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
% R& j$ e7 F! I22  1 |  k' D) A; Q: k5 h
23     TEA tea(key, 16, true);
# K, B4 m6 Z% k24     tea.encrypt(plain, crypt); ; J, M4 `7 ?/ H5 i/ j" W  f$ r- A, @6 Q: u
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; + @8 g- p$ ?8 S; E, a) w
26  & ^% a1 o, g6 o& K, M
27     tea.decrypt(crypt, plain); + `( D3 s. D5 S
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
0 i, q" E' u1 o1 p' B7 W29     return 0; 7 L* o$ a8 W' x: e. T0 u
30 }
# v9 L2 [% `, C) P$ x
8 @7 E4 L/ {+ ?5 G. {7 R; A& ^本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
: X5 C/ g, f0 G, j( h( C% T: D运行结果: + D" @( H; S% v* @! X3 l
Plain: AD DE E2 DB B3 E2 DB B3
8 o; b4 ?9 |0 q$ S  i' ]Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
3 r6 H3 @) ~# [, g* @Crypt: 3B 3B 4D 8C 24 3A FD F2
  W. f: B* k) Z5 T9 _1 z7 Z) gPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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