找回密码
 注册
搜索
查看: 37580|回复: 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轮):0 q+ V8 I! _. r3 e
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
' B7 j) N$ S4 jTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ( m/ S% _. j. M5 Y
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
( x; q, u; M# H7 O. i6 [在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
0 ]8 J" I; R; X) ^5 c* W* f) x: g在 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. " e- o) g) }9 F8 m# e: l
  2. void encrypt(unsigned long *v, unsigned long *k) {
    % Y, _$ ^$ G- d$ D2 L
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    * T5 p+ y- l0 A  f' G" i3 R, _
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    " v) l' j4 c7 p# @2 b7 |
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ * q! _) e8 X3 o4 z$ p. Y
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    # H5 g" }8 N+ Z, x" W$ K
  7.          sum += delta;
    * I1 ^# ~9 X% A/ o
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & t3 i( K$ Y* `# v7 Z! i
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    " [3 Q* ~2 r; p
  10.      }
    ! E$ Y  I4 Z% U1 j8 R& c% F* p' D
  11.      v[0]=y;
    / s/ q7 _! P1 T0 c7 O5 K6 f( Y
  12.      v[1]=z;
    3 ?- P  \) V4 d/ x
  13. }
    / E6 A( b) s# @! D0 {
  14.   
    3 c, e0 {: b6 ?5 u& K5 ]
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ' y! O: L( j+ O: n
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ & q* S# I( H8 S/ C) n0 ]! O5 @) Z- [
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    " b6 N; }6 O3 y# H- H
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    + P0 {) V+ u. D2 a
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ : M: _, ?) z: ^) B
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    - W0 J6 c9 r! M/ w, p; I# F
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    6 }+ C8 m( a7 Q" j- S! Z
  22.          sum -= delta;                                /* end cycle */
    6 P0 G( ?4 g! L' x) ]
  23.      }
    . N7 N: t; b6 ?0 |- Y5 I
  24.      v[0]=y;
    . f2 J* r$ H: `$ N. S! o4 C5 H! M
  25.      v[1]=z;
    ' X7 M; u% I6 _, w9 T, m
  26. }
    5 V3 H4 k5 ^4 U# |7 Q! q/ k
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
! Q! p: h& [9 I% l3 E. y5 v#define UTIL_H 6 P. R! m: R6 g0 A2 {" {: T7 n

; ]0 D" A" n: I1 y2 J0 V# I; d#include <string> ; k2 R% t; f/ N) D
#include <cmath> 3 v8 P) Y, h- y6 t. K& m. @: I
#include <cstdlib> 6 q5 Q# V+ P# p8 E( z% l/ ]# d
. e( t; V3 N( G: t
typedef unsigned char byte;
9 r# \; Z$ j6 C& f8 E$ i; d1 E$ htypedef unsigned long ulong;
  B1 E9 H4 U% q
- m  F' ~! B; F  O& b* T0 winline double logbase(double base, double x) { - d& D# e. D+ f( [4 L
    return log(x)/log(base);
: G8 J6 Z- U7 X# E/ s# h* F} ( \2 ~- q2 k' V4 h
! _- a% V0 P8 a7 Y0 _% k/ S
/* 3 ^; r) Y1 {( m. S
*convert int to hex char. # Y8 {( V# }) L! k/ X, X
*example:10 -> 'A',15 -> 'F'
8 A+ x2 ]9 ]1 e0 j) ^*/ ! z- ^2 m1 M+ t& ]* z' f
char intToHexChar(int x);
2 E- J3 j6 x9 i8 {
4 w0 O, m; N" h6 C2 o* o/* ; c* H  n- ^1 Z& g$ Q
*convert hex char to int. 7 A( I2 x! b/ A0 w
*example:'A' -> 10,'F' -> 15 ) D4 R2 ^+ b8 C" w3 K2 ^9 [
*/ # ]  E7 `3 z- K& U4 N
int hexCharToInt(char hex); ' Q& T% \" [: B! F7 I
6 ]* S# j5 t% h
using std::string; : e0 U5 s1 k; E, i
/*
' k' C& R  B4 s  a% B*convert a byte array to hex string. 2 e8 ?& f2 {" n. k& q) _6 ^6 h
*hex string format example:"AF B0 80 7D" , t' t. E: c! C' G; ^
*/ + W! i1 I4 {! X+ ]+ m5 e! |
string bytesToHexString(const byte *in, size_t size);
7 R4 q# t8 g. n8 V# ` ; w! {! Z/ A- F1 j; H# K" I# ?
/*
: N( G* H' r4 |8 M7 j*convert a hex string to a byte array.
& a2 C3 o7 ]" z0 f*hex string format example:"AF B0 80 7D"
# |+ P( A3 \( V5 W8 b% I*/ " L0 C( y2 g- S4 k3 w6 P  S
size_t hexStringToBytes(const string &str, byte *out);
& B6 K+ z$ f& ?* g0 y 4 ~# I% f- N; m! K% t7 B2 p- {
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
) b# h' }% {# f/ X% Q, W#include <vector> ! L9 c5 g. a7 J- p% W
$ m6 G: L7 l" R- g
using namespace std; : n0 k% O( U. m' U+ W4 Z! I
- w' n' x$ J7 d  T
char intToHexChar(int x) { 6 f, t# U' h1 R, u" J$ `, c; m  A
    static const char HEX[16] = {
3 H' i, }, Q$ W) {7 x  ^        '0', '1', '2', '3',
* U$ v& f) S* e) k! U        '4', '5', '6', '7',
( |( t. C1 O6 o" o        '8', '9', 'A', 'B',
7 q* r. z! O8 i6 L; M5 _' V        'C', 'D', 'E', 'F' / C8 D1 k' g9 W! E$ W/ b: X
    }; 3 K' M5 H* c; @( O3 [& f+ K4 E) D
    return HEX[x];
( G3 H9 d( U! M} ( z4 i8 [% k! H  w' p" E# B

! O+ r  K9 f$ M- D& gint hexCharToInt(char hex) {
- D; g1 s* z4 }: Y+ g    hex = toupper(hex); / h# Z3 D+ F* s) b9 s9 U
    if (isdigit(hex))
. F* B+ p+ u% p        return (hex - '0');
' C: G: X! B' j# i" B4 p' ?    if (isalpha(hex))
5 s3 r& j, j* t8 O        return (hex - 'A' + 10);
# t% j8 f( M8 Z    return 0;
2 O& K6 f' w* I$ Y7 H- L5 m} 2 C9 s" R1 ~, {9 G  d( ~2 F
# a+ i$ t: I6 x" U' b: k* s
string bytesToHexString(const byte *in, size_t size) {
5 Y, M5 O6 @( @" f( U7 i7 Q    string str;
% L7 n* Y" l8 v5 i! l( ]) n    for (size_t i = 0; i < size; ++i) {
& q# @7 f( C4 E) j6 ], ]( C/ t        int t = in[i]; 1 B1 l, P7 _+ C/ f8 b" g5 {4 q7 B) s& X$ l
        int a = t / 16; # J- ~& m8 G9 v5 m" Y9 C
        int b = t % 16;
3 _+ }' n' i' ?& A( G/ u4 F, @        str.append(1, intToHexChar(a));
: _8 ~$ x' v$ Z* O        str.append(1, intToHexChar(b));
4 e! l; R7 S9 E7 ]2 m, B        if (i != size - 1)
; ^! [/ @! P2 y3 a! j            str.append(1, ' '); : B  W9 |7 l; z0 u+ I, d
    } / v1 z$ q0 U& n3 q) k) M5 l5 _8 B2 c
    return str; ( d: R/ b+ X: o2 K
} - Q' _  j0 h* f  O

8 f$ r8 Q% C/ k# Wsize_t hexStringToBytes(const string &str, byte *out) { 8 e% U- ]; {  b. O
0 l, @$ d# t( ?# d# G) P8 l
    vector<string> vec;
; E; R5 v# ^8 |, k. v( H, |+ }    string::size_type currPos = 0, prevPos = 0;
( J+ d) a& }  T! N1 }: @6 \    while ((currPos = str.find(' ', prevPos)) != string::npos) { . l8 N/ J% T! I' i
        string b(str.substr(prevPos, currPos - prevPos));
+ n8 o0 s, ~1 Y+ w        vec.push_back(b);
* Y. }& n$ h& e8 T: B6 `6 j        prevPos = currPos + 1; " G. t3 y  H$ X. f2 X% L6 E
    } ! s) Q, }" T& u3 ]
    if (prevPos < str.size()) {
+ x+ o; R; }$ R7 ^  O! S* }        string b(str.substr(prevPos)); # U3 l$ j$ \7 M1 [- {
        vec.push_back(b); 3 l6 l* u% V9 H. f6 v
    } " |7 G1 U6 |0 f6 c0 y! A& X, ^" m0 w
    typedef vector<string>::size_type sz_type; ! m8 S2 q7 F+ ~$ h  Z- X
    sz_type size = vec.size(); / p1 [3 V2 D2 b8 k( @
    for (sz_type i = 0; i < size; ++i) { 8 o- a! Q+ }7 h. p0 D6 y
        int a = hexCharToInt(vec[i][0]);
& Q: \/ H& v0 M1 [$ B* H0 s        int b = hexCharToInt(vec[i][1]);
. C# u9 m8 V7 ~# {9 M* q9 j        out[i] = a * 16 + b;
- Q: D  Q8 a9 {* @7 e5 p/ J    } 9 Q4 K& G; K+ D: C
    return size;
" @( e0 w0 r' P0 A9 E/ ?}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H & B' D+ B; @% L  n# L4 f
#define TEA_H ! u) S: t( g5 [& f

5 ?2 ?& E& ^* {! A- H/*
8 ]6 ^$ i; ]& i9 C# C: ]$ S8 s) V*for htonl,htonl # u) w" m- ?$ t# U: X+ L& v
*do remember link "ws2_32.lib" 2 \7 o, v4 j. p6 @$ ^# @, f3 A8 Z
*/
1 P" N7 f; ~( a; t7 |  \#include <winsock2.h>
: P2 \/ j2 B; c' M7 L8 q9 G1 c#include "util.h"
4 ]+ i) M+ g, J0 s# a/ G0 O3 D
$ T& \6 k! W" `5 H, {class TEA {
, _( @& c$ C" k+ Rpublic: % [( |) v5 {. W
    TEA(const byte *key, int round = 32, bool isNetByte = false);
( A" o1 c# X  q+ p/ g- }6 Z: B    TEA(const TEA &rhs); , E% ^3 T! F2 f
    TEA& operator=(const TEA &rhs);
6 X; `; x. r% z6 b+ m    void encrypt(const byte *in, byte *out); % {" X  z  }9 o, i5 O
    void decrypt(const byte *in, byte *out);
+ `9 [2 R- ^; n! h8 T! R; Zprivate:
7 o+ g, e# C  t! g2 O: W( `# d    void encrypt(const ulong *in, ulong *out);
! [% d/ X3 U, Q/ |& n    void decrypt(const ulong *in, ulong *out);
$ g9 I' |( ]6 U$ L, w9 d: y    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
& n& Y# s( ]+ S0 ]. T5 g    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } + ?) U( B( w, H0 {( z6 Y
private: 9 `% Q. G+ g  a- u- L$ L) q
    int _round; //iteration round to encrypt or decrypt
1 t0 m; A. L, g    bool _isNetByte; //whether input bytes come from network $ v6 b1 N4 C6 [( o3 B: B
    byte _key[16]; //encrypt or decrypt key
6 k9 P) V, G: X" U8 r( z- c};
  S$ q8 S7 X; O3 ^7 n$ L5 w; p - {& _; s3 `' g; S3 w
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 0 O; d0 I0 D4 r: F3 X, d7 E1 N% c; |
2 #include <cstring> //for memcpy,memset ! O4 X3 r: N* g' D' ]2 e8 N
3  
& S# r) t. y& |  f 4 using namespace std; # A0 t* Z8 }& r3 q
5  6 w- o+ Q1 q5 }/ |( j; N. H/ |
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ! I+ i4 ?* R3 \" L. Y6 H
7 :_round(round)
% C$ G3 L; ~" U9 Y  D 8 ,_isNetByte(isNetByte) { 2 G. m& J2 P* i  Q1 C1 s
9     if (key != 0)
" z: e7 O! a. Z$ d10         memcpy(_key, key, 16);
1 {* F' x$ r( A8 h  k11     else
8 `4 k# u7 j9 u- w8 y12         memset(_key, 0, 16); $ b  h. G1 o  `' L
13 }
) _6 Q3 R( \: c9 P* V7 f14  
" Q2 ~3 p0 i. @* ?6 @15 TEA::TEA(const TEA &rhs) * i& a/ Z0 m/ U" L$ Q( p: j
16 :_round(rhs._round)
/ O/ m* u. V% @7 I( F( \1 E5 z17 ,_isNetByte(rhs._isNetByte) {
' x7 g, o8 R! [/ C& `18     memcpy(_key, rhs._key, 16);
$ I4 h: Y" ]7 j2 U2 ]19 } 8 k+ X, u% G, u; {) l* ~
20  
' {% Y1 @" Y9 T- f21 TEA& TEA::operator=(const TEA &rhs) {
4 @% j; _! W4 `4 T! |22     if (&rhs != this) { 7 w% p# j# X- q& {( I
23         _round = rhs._round;
$ |% J9 B4 H/ s! F8 T0 y" N' z9 m, r24         _isNetByte = rhs._isNetByte;
& c9 b2 _) y$ ~( B1 F$ F1 ~25         memcpy(_key, rhs._key, 16); ! x8 J* {. L, j) w. a
26     } - B$ \/ G( v0 }- k2 j
27     return *this; + w8 I2 j0 |7 P: ~6 c
28 } & @, h2 p3 s; x  _6 A, e" h
29  
& @& s) q/ c. U5 ]- S! D' a0 }; d8 s30 void TEA::encrypt(const byte *in, byte *out) {
/ o7 y) p5 z% X# `9 V: i31     encrypt((const ulong*)in, (ulong*)out);
- t, p8 l3 r: B- o/ A32 }
1 d( L& \, `( }0 _" \- ^  R" j' Z33  - `4 t, v# V# G2 _- S' n2 G3 R4 [
34 void TEA::decrypt(const byte *in, byte *out) { ! z* G0 J& Z2 b  n
35     decrypt((const ulong*)in, (ulong*)out);
4 L: z1 U7 M* J8 m36 }
6 a" n4 f* n4 I8 c4 J37  6 r/ Q1 A. [2 I$ P( ?
38 void TEA::encrypt(const ulong *in, ulong *out) { ( d+ q. ~% z) @; A, M  k4 P$ X
39  2 Y( v* f5 r- R" g: `! k/ W9 ?( X
40     ulong *k = (ulong*)_key; 9 W0 e7 S/ z/ w+ c& K
41     register ulong y = ntoh(in[0]); ) x& U- Q: w, e( }/ V5 ]
42     register ulong z = ntoh(in[1]);
  Y* I9 A1 S* v43     register ulong a = ntoh(k[0]);
! N% K' m* ^) G9 n% Y+ u44     register ulong b = ntoh(k[1]);
4 [% C' f  e5 X: B45     register ulong c = ntoh(k[2]); 9 _, I; M  f( x, l# Y
46     register ulong d = ntoh(k[3]);
; ]0 x; Q7 J& f$ u3 [- o* T47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . a3 p& |5 D! ?
48     register int round = _round; 8 n: d8 ^! M6 x& ~
49     register ulong sum = 0;
6 N. O% Y9 S! k2 e( a50  
# l- z+ s& G; ?+ N51     while (round--) {    /* basic cycle start */ ) ]7 v% T' n2 o
52         sum += delta;
6 I& ~, }) c: K+ W: u& G2 y53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
$ s1 Z5 ^( |& o. b: O, {54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); " S+ B0 @' |5 m$ c( I! }8 S& L
55     }    /* end cycle */ $ N) N6 j" W; {  z4 ~# \
56     out[0] = ntoh(y);
# X, o7 t5 p9 q: c0 j6 h" E8 C57     out[1] = ntoh(z);
' ~. L4 C9 x( E0 E1 _" h/ v58 } 9 h* l: ?. E$ g' B- X; n
59  3 k! x! ^1 y- H3 u( d
60 void TEA::decrypt(const ulong *in, ulong *out) {
" l3 T9 m- d6 k, O0 }+ G+ ^61  
6 C& [9 ?) [/ W0 E62     ulong *k = (ulong*)_key;
* `. r+ j1 u: Q2 S  t63     register ulong y = ntoh(in[0]); 1 f* |3 v8 ]/ ^' K
64     register ulong z = ntoh(in[1]);
6 z' s* u" d7 l2 T* Y6 F4 h, P65     register ulong a = ntoh(k[0]);
4 `( m+ A' P; ]8 k. ]7 u66     register ulong b = ntoh(k[1]);
! ~5 O" ^4 Q" {  I* R67     register ulong c = ntoh(k[2]);
0 d$ H; c6 \: ~7 Q  K( r68     register ulong d = ntoh(k[3]);
" o6 G2 G. o. G$ U2 O, R69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 9 Y) G6 b9 Y/ ^: {' c! }
70     register int round = _round; 5 s) n3 i9 d, w# p
71     register ulong sum = 0;
, e1 Z' c* j$ o9 F0 [9 v& F, N! x72  - g# v1 {3 R( I" U$ e, c
73     if (round == 32)
) F0 t8 j; o# _( V4 T74         sum = 0xC6EF3720; /* delta << 5*/ 0 }8 p" J) X( i8 B. G3 F9 V
75     else if (round == 16) 7 d( {6 K# s3 l  ~9 D+ A
76         sum = 0xE3779B90; /* delta << 4*/
" h& Q# G, O& a" \7 c77     else 0 i! s4 z6 h& r0 }9 d
78         sum = delta << static_cast<int>(logbase(2, round)); * F( w0 B% W( K$ _5 k
79  - G" g4 J0 Z( }2 A2 e) c5 z
80     while (round--) {    /* basic cycle start */
+ V5 F4 }3 j. G5 j81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
4 G4 R8 P# |% H+ x. q( w. I82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
# n- f6 R) G2 {. E# G83         sum -= delta; " n& b+ g& S5 E" a
84     }    /* end cycle */ 8 A4 h6 t+ s1 q. ^* j: n. \6 a4 _
85     out[0] = ntoh(y); # Z  [, V- b; M; D- N" R- e
86     out[1] = ntoh(z); 0 O, d, {1 ^& \+ w8 J) \6 C) s$ s3 A
87 }
+ N6 F8 j2 |. k
9 j7 a( N: `. k需要说明的是TEA的构造函数: 6 C" d9 q7 D& c' d
TEA(const byte *key, int round = 32, bool isNetByte = false); $ m/ U- D$ [( K6 A% c6 f+ K0 E; ]4 R
1.key - 加密或解密用的128-bit(16byte)密钥。
" S& q7 h( d2 d: ]2.round - 加密或解密的轮数,常用的有64,32,16。 - s$ o9 x4 C9 ]" A4 x0 f8 ]
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! + Y' R1 U6 p/ _3 k6 f

8 N  k' Y% _2 W5 @4 p最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
" m: W) t2 J; [) ^2 D 2 #include "util.h" # b" ]. U/ F0 t8 u, l) c
3 #include <iostream> 5 g# @, r* j) Y# Q; F: c
4  5 j. q+ [! }) d% a
5 using namespace std; 9 W: j/ _% Q, J! T4 e
6  
0 V" P- [/ w6 _; o1 F 7 int main() {
" P" b- ^0 S4 H  z 8  
7 w  @7 J1 y! R 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 4 [& b: ^) H9 ~. C3 L
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 8 L$ G5 h& z4 V0 J9 k
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ) `7 X) @5 B5 {  h' {5 F$ r  J
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
. k4 p* t' Q* A3 }+ m; I13  
& S2 w3 H' W$ {+ {+ x. I- J5 M14     size_t size_in = hexStringToBytes(plainStr, plain); % T& J* O( Y$ b* Q$ v
15     size_t size_key = hexStringToBytes(keyStr, key); 5 J  |% {8 M1 P7 ~* b! }4 l" {
16  
/ D9 B0 N, w, C2 S4 t17     if (size_in != SIZE_IN || size_key != SIZE_KEY) " t: x& D+ ~; a7 J2 s. G
18         return -1; # K# P: N, \. n; Q1 i' T. {1 \: b
19  ' z( u( ^3 S( r5 n* `
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; , O. t# f' ~7 x8 _
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 8 t! D( e9 q0 v
22  ) B- |* r0 Z  p: p, U( i; A
23     TEA tea(key, 16, true);
4 a4 y+ P0 l" L! f. i24     tea.encrypt(plain, crypt); 8 b- ]5 \, t) N2 o' s: _7 R
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 6 B, j3 J" j0 F! D0 q* Q+ ^( S
26  ; T: W, K6 M# I# F
27     tea.decrypt(crypt, plain);
: @( p2 r+ V8 e5 _* f( W6 L28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
- ]2 Y6 }$ ~6 j. M( `6 M29     return 0;
$ h1 _8 L) @. B0 P30 }
8 Z; |$ W. R2 O& E% h8 B! I' l7 p4 q+ ]% k0 h/ h# f! f
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx; b. c$ r% h4 _) n1 F1 Y( {
运行结果: 3 i" W- v' a  U: _
Plain: AD DE E2 DB B3 E2 DB B3 $ t6 A2 O! ~' `, X* S8 c
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 - M$ `* \# y3 f1 H2 n2 Z0 _0 @
Crypt: 3B 3B 4D 8C 24 3A FD F2 * G! s# G- N+ M- b
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-3 07:10 , Processed in 0.037180 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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