找回密码
 注册
搜索
查看: 37399|回复: 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轮):) x  A2 _/ `) C8 E1 }: ]& m
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
7 H$ {& c; n, V0 q9 X, ]TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ) Z' e9 _& ]" }6 Z- q' e5 P
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
+ V7 C7 ?/ h1 z% Z! c. P在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
5 ?: D4 z/ b5 I8 d在 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. " h# V9 o6 c5 g1 |0 d7 [4 j5 F
  2. void encrypt(unsigned long *v, unsigned long *k) { 1 m, R1 p. |/ p
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ) h( U' k( @4 a9 x; E1 e3 n
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 5 @: |! w2 y* @1 H# ^! h
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 0 Q+ U2 j4 v+ ]4 e* J2 F
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ - k/ C- p1 d- z) m& ?" U$ [0 `8 E
  7.          sum += delta;
    # t& u5 A& J' N! }1 q
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ( R7 n7 j( A! d+ z: I. X$ J0 A
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ : ~9 b  ?9 O/ g4 v$ a1 O! j$ N, R
  10.      } 3 J& D% B- u" H7 r  l' }; I
  11.      v[0]=y;
    + j) p! `3 }6 _) N" w8 c: ~+ R
  12.      v[1]=z; : [, K6 F/ ]; U6 O9 J; h
  13. }
    . s) w% l6 B/ h- N. {" _
  14.   
    0 H2 S  B6 N2 q5 Q" t* u1 e
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ) D# t3 p8 D6 _9 Q. H5 t
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    # _5 h& m7 S8 _2 p, o8 e
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    / v6 _% ]+ f1 Y, K+ T! D
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    8 Q( k4 s# P" t5 h
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ $ s& b# p1 u# M
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); : ?& F$ o# S7 D6 I7 O2 x7 V
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); + R! Y3 T0 J" o- g2 w8 i) Y
  22.          sum -= delta;                                /* end cycle */
    # y! u5 t, B# N( z% P$ V. S
  23.      }
    ! J( N; x, n( B6 N
  24.      v[0]=y; . E) Z& @) i' {8 I- d8 K
  25.      v[1]=z; / S4 G. R" Z$ s/ w  K
  26. }
    . _7 D) b$ T( a) l. N! q2 y2 X2 g
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 1 }6 n) {# b/ @5 V" Y! Y: |. L
#define UTIL_H
2 I- q& q7 e/ W  S- L8 L  R
% I, }3 q7 E8 h4 O- b: Z/ A#include <string> ; V- t$ b+ ]; J' p# _$ e; m, s2 p
#include <cmath> . Y5 U$ F0 L4 `2 ~, w8 g
#include <cstdlib>   D9 [- k3 g5 }: i2 J) {  B
; h3 @5 ]6 b# e  n
typedef unsigned char byte; + z1 j  \) t. }( c& b+ w/ B* h
typedef unsigned long ulong;
: `9 @8 g* e, X) p3 |, I
1 G+ C, `' k: u+ c2 s: F" x' }  minline double logbase(double base, double x) {
1 q( k/ [7 @" X# ~4 z" d# m    return log(x)/log(base);
+ C' w' I. E% X" ~}
1 H1 |6 c+ V# [/ L2 Q  u
* j+ c6 f3 _2 Q: k9 \/ U/*
9 I+ h& V4 Z3 t0 ^' e*convert int to hex char. * z! ]! m3 g% u4 S2 j; U
*example:10 -> 'A',15 -> 'F' 6 @6 \& S$ t% z& i' l2 q3 i! ~% z
*/ . ?9 R  t) ?  T5 g! w& U
char intToHexChar(int x);
5 ]9 l/ H4 Z0 X7 Z7 g
: @7 @3 b* O( j& _5 h- y" y/* 8 w$ D9 d. @' o
*convert hex char to int. 1 z+ `! _0 `$ B( P$ a
*example:'A' -> 10,'F' -> 15 , C/ B* [4 q+ w+ k
*/
7 D- {, {. w! G8 `int hexCharToInt(char hex); / ~/ u' w$ f0 k+ E
9 \! X4 {  ^- P
using std::string; . N4 i' P! O+ X: Q; D  B$ @
/*
+ [( i" e' ?# {, j+ u$ }*convert a byte array to hex string. - ^0 D0 G. M' t- I! f1 L% _8 K
*hex string format example:"AF B0 80 7D" 0 T! G, D* V* T9 E4 r% H0 `6 I
*/
+ T8 a" Q+ O5 M1 o3 E+ v. pstring bytesToHexString(const byte *in, size_t size); , |; V' O9 e4 ^4 r2 k8 {; T  p

1 Z+ U' I' T5 C; X% ]  I5 D/*   f- z9 O+ u. p) h6 d" w1 n9 R
*convert a hex string to a byte array. . B( F; {8 V2 ?; ^" g
*hex string format example:"AF B0 80 7D" / l* ?0 f; f/ ]4 [7 C$ ~
*/ 3 G  ^3 l9 Q) z/ w
size_t hexStringToBytes(const string &str, byte *out); 8 n! n6 E/ U+ P
, A. b8 F4 O: h7 B' c0 ]
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 9 y, h  I8 e6 r" `+ z) A4 H
#include <vector> 9 v, ^8 ]& w, f7 b3 G9 r! x
$ ^) R( G! O( }& s
using namespace std;
5 f" f$ y: z9 I$ P! X% D 5 g) z# A+ b9 V- g7 `+ M
char intToHexChar(int x) { 0 M" d! B8 }8 u" W. B
    static const char HEX[16] = { / J" C$ a% l( X" H* }. b
        '0', '1', '2', '3',
9 k  i% J2 L' }! |8 h6 O        '4', '5', '6', '7',
: b# G: y; y/ k$ |- ^' ?: T        '8', '9', 'A', 'B',
2 o8 j8 `2 C# Z8 z        'C', 'D', 'E', 'F' ! q8 `  e# N# d! s2 o, K8 s
    }; # i2 a8 K$ w7 P  r- p4 H
    return HEX[x]; , M& ^, d+ }- I0 N
} * F: p4 a" J$ l( b& N5 Z

# Z5 l! P* `+ U$ d4 {2 Q1 iint hexCharToInt(char hex) { / q1 X! l: ?  D  g0 S
    hex = toupper(hex);
6 R: v3 e% }7 `/ A$ b6 J2 Z    if (isdigit(hex))
8 ~& y. e$ U4 W' E+ D0 j        return (hex - '0');
1 i7 f0 }1 R/ q% i    if (isalpha(hex)) ! \4 s2 v: K4 m0 ?4 s6 d* p
        return (hex - 'A' + 10); 4 S9 {8 o$ G* g$ }6 D  w
    return 0; 6 V8 V3 z1 L. ^, K* X+ ^% h
}
. r7 T* z3 r9 U6 p& ] % ]  ]8 @5 A2 L% z
string bytesToHexString(const byte *in, size_t size) {
- z4 R  R$ o2 ~- h% w    string str;
8 i* m+ l, w& H- ?    for (size_t i = 0; i < size; ++i) { , L' U8 t7 L, I7 j0 w: C- D( ?: V
        int t = in[i];
1 a8 p+ T5 l( `/ f: C: ^0 e' I        int a = t / 16; & }/ \% K/ @2 Y
        int b = t % 16; 5 f4 u# `2 Q( ^* [& x8 S" |* L
        str.append(1, intToHexChar(a)); & K: u0 i  D7 k3 N) F; H
        str.append(1, intToHexChar(b)); 5 ?: B, f9 v$ ?7 j; Q6 z
        if (i != size - 1) % W6 |$ D/ D- V' q. M
            str.append(1, ' '); ! R' e& K/ ^! ~2 i: G  o) Y
    }
' W/ z: b( y+ B6 @' ^8 [' L7 k    return str; $ c  x* j/ {  G$ a4 ~( e) A
} # K8 m: p+ [+ O' \: R
+ o0 V9 h% ~; N5 D! n% l1 f8 o; y
size_t hexStringToBytes(const string &str, byte *out) { & i- e4 ~" j, l0 _0 S

$ |' b6 q- Q: l- j$ B0 a    vector<string> vec;
. {9 L1 K* M! l# v) S' o* s    string::size_type currPos = 0, prevPos = 0;
$ z+ p) N+ d/ S$ _/ w! Q7 P    while ((currPos = str.find(' ', prevPos)) != string::npos) {
7 W( g- ]& h, l% D2 U$ O8 P4 G1 R        string b(str.substr(prevPos, currPos - prevPos));
  \( @1 i3 u$ i. |9 y2 g- k        vec.push_back(b);
0 N7 [. R4 K2 K* |3 _" z) Q        prevPos = currPos + 1; 1 N  U3 Y" v) {1 O
    } " z2 K( c9 D/ s# S. F7 n/ F
    if (prevPos < str.size()) { / f! Y; a* ~8 W* K( b. f( z7 g
        string b(str.substr(prevPos)); ; m) D# Y$ m( D' K! T2 B( `
        vec.push_back(b);
- t; O: H- {- p    } 8 S( w7 C/ W& s7 L5 k; s" ?3 q
    typedef vector<string>::size_type sz_type; $ ^  _; o$ l; U
    sz_type size = vec.size(); - K! L. F3 t/ d
    for (sz_type i = 0; i < size; ++i) {
9 u7 F9 ^6 o2 n6 Z9 ?' L7 A1 h        int a = hexCharToInt(vec[i][0]); 9 H& v' ^5 D- ~' G- G( b$ O
        int b = hexCharToInt(vec[i][1]);
7 `2 y3 |) U4 N5 l: w        out[i] = a * 16 + b;
; {0 \5 D. r4 X    }
0 A! U6 g' j% ~( h6 c; W$ Q    return size;
) O. c$ d6 T6 s}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
. Y& O* ~, n0 n! _. q#define TEA_H - L+ }+ r+ q% T1 z) d/ x' e& ]0 w

/ n. f( M4 G7 \( X/ ~/*
4 Q; B0 o. N; O1 h*for htonl,htonl
# a/ z" r: u8 x# y( G4 U1 ~4 R*do remember link "ws2_32.lib"
6 @6 \9 F% [* {* y: G) k*/ ; h( i1 R% N& q1 f
#include <winsock2.h> 3 Y) @# e- ~$ z2 M$ }
#include "util.h"
" O- f9 j* g: k# _& u $ p! a1 ^* C7 l5 q
class TEA { ' Y8 u- [# Y! _; Q% y7 r/ S2 t' r
public: , N' z. }# N/ o6 u+ V3 n) E5 v3 k) f
    TEA(const byte *key, int round = 32, bool isNetByte = false);
3 J2 `" m0 k  z& [    TEA(const TEA &rhs); & e( \2 G$ W1 U0 ~4 j* \9 h- f7 N9 w
    TEA& operator=(const TEA &rhs); 0 o+ I/ S. J" m  Y9 @+ m8 y
    void encrypt(const byte *in, byte *out); % B1 y+ m9 {. U1 s0 m
    void decrypt(const byte *in, byte *out); 0 Q; p8 k# E' G* {0 s# M; w0 _
private: + e/ K& H7 @& n. O3 q( z
    void encrypt(const ulong *in, ulong *out); : t# _5 b7 O, F. }" I$ U' y- ^
    void decrypt(const ulong *in, ulong *out);
( n2 u2 {* g# V8 s    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
, X$ O7 }0 v) q1 @# h1 K    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } , M4 v8 t) s  b5 q
private: 9 x3 q% u* _# ^& h4 G
    int _round; //iteration round to encrypt or decrypt
  g* L8 s  K/ h+ K4 X8 r9 _    bool _isNetByte; //whether input bytes come from network . Z" k, ]4 ]1 [' Y; H
    byte _key[16]; //encrypt or decrypt key
: R' y) }" t+ h( [};
7 x. h1 l7 i5 _, g) R 1 @% `- }6 @3 R& E4 p, s" s
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 5 l8 d; i1 }+ R3 e. j7 ?: f
2 #include <cstring> //for memcpy,memset
/ D; q) Y: o8 d$ E 3  
. m8 ~& O, h) z" s4 g! Z! w 4 using namespace std;
5 P+ H' _# A4 W% Y) ~: {3 l 5  
6 Q0 x9 k$ x! r$ A! B! ~5 M' B 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
! M6 k, O" s& H" A5 A- f, l 7 :_round(round)
% Z" y" ^( q, i+ N4 \ 8 ,_isNetByte(isNetByte) {
' f3 _1 h3 s9 {7 l6 y1 q5 S8 | 9     if (key != 0)
+ w2 @3 I' e3 `+ P& ]5 I10         memcpy(_key, key, 16); / G0 o1 Q) R9 J' p& P$ G% U) Z
11     else
/ u7 J7 E3 _" Y12         memset(_key, 0, 16);
* T9 \1 Y  D& F; g& J% J13 }
# S0 Z. S# M/ y* Y/ a14  
8 K. U7 I2 ]( ^15 TEA::TEA(const TEA &rhs) / A/ D0 v; ~* }
16 :_round(rhs._round)
0 X( Y+ q) ]4 N4 U; m* B: Y/ V17 ,_isNetByte(rhs._isNetByte) { * _& h6 F8 m) g, S2 h: L) L3 d3 t
18     memcpy(_key, rhs._key, 16);
/ a6 Z% f& N& [* T, b19 }
" M+ y* H8 S8 a5 @$ h  Q9 X20  / a' T4 l% G7 Q2 b6 G
21 TEA& TEA::operator=(const TEA &rhs) { , i; Z9 f# h4 Z6 u' Y: R, s
22     if (&rhs != this) {
0 I/ y. v, P% F0 S3 j* k3 i23         _round = rhs._round; 9 \' s  m$ i' K, [
24         _isNetByte = rhs._isNetByte; + w5 A8 {# i* F$ M$ v
25         memcpy(_key, rhs._key, 16);
7 F0 I$ B1 \9 R' k' p: j0 z0 G26     } ) e4 E+ F* z5 p3 W$ J: G0 s
27     return *this;
: k, i4 P* f- c8 [! r28 } 1 M& t6 o* \" ^  I  ?- n6 T. Z
29  3 p$ R% i  l4 Y
30 void TEA::encrypt(const byte *in, byte *out) { % g' D1 G! n2 w5 v; U6 r
31     encrypt((const ulong*)in, (ulong*)out);
/ a" V3 h' I9 X1 M" B9 ~32 } 7 ~! B% _8 p0 o6 c$ r! }$ g  k! L6 V
33  
# K; g' \7 G- w* ]/ A34 void TEA::decrypt(const byte *in, byte *out) {
5 Y. \. R$ H: m. p0 \3 A2 d35     decrypt((const ulong*)in, (ulong*)out);
* x; ~& R: _8 h1 C36 }
, s5 b1 A1 q  b* q+ \7 h$ }37  
. ~- c  C* N; i2 c; S3 \38 void TEA::encrypt(const ulong *in, ulong *out) {
3 u# u* l1 p/ D; N# Z' f( B, ?39  % i: R2 I3 X* ^5 A
40     ulong *k = (ulong*)_key; 7 [" }, q4 p' h7 F0 O
41     register ulong y = ntoh(in[0]); ( k2 v$ }0 e  S
42     register ulong z = ntoh(in[1]); 1 Z1 {& D' }; ]5 O( f2 F! {3 M0 v; W
43     register ulong a = ntoh(k[0]); ! ]% y: _- U! f( k$ w5 k
44     register ulong b = ntoh(k[1]);
; y) B- h, K4 W2 i* R45     register ulong c = ntoh(k[2]);
- p. V* e! B# {/ Y2 L- H: m46     register ulong d = ntoh(k[3]); 0 v& y8 i7 G! S! J
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ; y4 a2 @; ^% ~
48     register int round = _round; ( h7 o4 Q. @# _6 P7 I' h
49     register ulong sum = 0; & q: g; e2 p1 o% R' P5 }# |
50  
( ~) `* n$ y3 a. c% D  z) O4 \  m51     while (round--) {    /* basic cycle start */
5 M4 h% b" `9 v52         sum += delta;
- |; }7 J7 Y+ y53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ! h3 [9 W- D, w+ U! l7 f
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); * c) B$ C4 N$ ?. b. n
55     }    /* end cycle */
0 v7 j) L' C' w4 p6 O+ R+ v9 X56     out[0] = ntoh(y);
" i, ~( ~8 O: w# v3 g57     out[1] = ntoh(z);   ]2 x: P0 D5 g5 T, T* F! ]% y
58 }
. f$ a/ \' `. E- P59  ( W  w2 ^, Q1 ]3 g
60 void TEA::decrypt(const ulong *in, ulong *out) { $ b6 d$ r. p$ N2 I9 R
61  
; [0 k  N" a1 S7 `62     ulong *k = (ulong*)_key;
: y- x4 u7 E+ V7 u1 ]63     register ulong y = ntoh(in[0]);
4 X$ ^- X2 N7 [  c. r/ k% [64     register ulong z = ntoh(in[1]);
6 I0 o: W& Y- N' Z, l4 n65     register ulong a = ntoh(k[0]); 8 a/ Q/ B4 @/ ^1 h! k
66     register ulong b = ntoh(k[1]);
) n1 Z& Q# a2 ~- }" z+ v67     register ulong c = ntoh(k[2]); 4 e: I8 k/ _& R; O" o1 w7 y
68     register ulong d = ntoh(k[3]);
. E( _. Y. C6 z" C69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ , c1 Z1 A9 k( h3 _! Y, ]
70     register int round = _round;
3 U# h( w. z( z) m71     register ulong sum = 0;
8 b# b5 I1 ~4 u; A1 s9 l72  0 X- E" v6 g1 d5 P* n, s- C* E
73     if (round == 32) * Q( U5 q' g6 J0 v2 F
74         sum = 0xC6EF3720; /* delta << 5*/ 5 t  P$ c1 ^% D
75     else if (round == 16) * X3 M$ h' v# |! A; s
76         sum = 0xE3779B90; /* delta << 4*/ 4 l2 f4 J6 Y# n$ D
77     else
. O4 p9 [8 _" F5 z78         sum = delta << static_cast<int>(logbase(2, round));
7 Y1 Q, {" \9 x) `, i79  5 N* c4 g& G6 r8 D: n2 O' p
80     while (round--) {    /* basic cycle start */ & q$ f& A, l# `, o7 i0 j6 j; W
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
, L1 l% G; j9 Z+ w$ Q82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
0 B1 ?% A- A. O- _. E83         sum -= delta; / ]/ ?+ b1 j0 l- X' T; X
84     }    /* end cycle */ ! \/ u* X9 H# f  v
85     out[0] = ntoh(y); , c) U7 _* A4 g1 U2 O
86     out[1] = ntoh(z);
% y" h* {4 V! g! q87 }
& T7 m' u6 T+ s  Z
. L+ s3 ]5 s/ M# V需要说明的是TEA的构造函数:
' J" \1 @2 r0 c' r6 _, O/ dTEA(const byte *key, int round = 32, bool isNetByte = false);
8 ^4 \, x: L* w1 b  q9 J1.key - 加密或解密用的128-bit(16byte)密钥。 + K+ q  W  {3 X4 }3 G* M: C
2.round - 加密或解密的轮数,常用的有64,32,16。 ! C! `- z, B( h# O7 F5 b7 M
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ' y3 }, u2 p7 K

" w( y! ?3 U8 `1 E# n: j. e最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 0 x5 H6 K1 H- {$ m* N, j
2 #include "util.h" ) ?3 K4 t: V: G" I4 |; H
3 #include <iostream> 0 l6 o0 ^" E2 Y. a6 P" \
4  % c/ B) i( g4 u
5 using namespace std;
% z! R6 p' o- w+ l/ V 6  
! g0 P) o: b; N7 i6 j0 K 7 int main() {
5 R3 r2 K7 \! T- C5 q 8  * s- ]# W( v# S+ ?
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ; b4 ]- T; A( \0 p3 N
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ; O! V/ R6 Q; k; a4 o7 }
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
9 k9 z7 Z$ v: `4 x( G$ {+ Y$ p" ~0 o12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
' B! h/ I& |8 @" D0 Y3 l+ `9 G; ]13  ! i7 z- }2 J/ [7 n
14     size_t size_in = hexStringToBytes(plainStr, plain); 6 p1 W' ]- B  c7 a, I
15     size_t size_key = hexStringToBytes(keyStr, key);
: X3 Q( B+ v. V& }3 `16  
/ o$ V2 Q/ Z+ Y# d0 J: R17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
* W# H2 f0 E) q18         return -1; 3 e1 J( Y  u* L  n
19  
6 n; P7 w0 Y3 |) u0 W% M20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
5 D) P! U6 G% |3 [21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
/ i# o+ u. A- E' y, K8 l22  + y$ D# q- o/ g4 R% a
23     TEA tea(key, 16, true); & N! i* m  b4 f8 J
24     tea.encrypt(plain, crypt);
% C( P/ `% b7 d25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
; u' H& R+ E3 i; v$ f26  3 j: L6 y6 p: [1 i8 |+ J2 b
27     tea.decrypt(crypt, plain);
3 t, p0 t3 D0 i: S, [; Q* y5 `) Y28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; - _$ _% r7 x( z, O! r' w  W0 U
29     return 0;
  Y; ]2 o& g, [30 }
6 c# n! u' `; d+ N* j8 t8 y& D8 ?; J2 l0 c7 ]- C# f/ i' x) F
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx$ b* m. }& T( |& g
运行结果: , j- C) f9 v+ O; L7 g% m- P
Plain: AD DE E2 DB B3 E2 DB B3
9 C' f0 y) b( y7 T' oKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
% x6 D3 ?; T  ^0 e1 k, n7 ACrypt: 3B 3B 4D 8C 24 3A FD F2 % V' @4 a: E4 W+ S& x
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 06:22 , Processed in 0.019579 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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