找回密码
 注册
搜索
查看: 37334|回复: 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轮):
3 w: B* U; \# u$ s9 n, W微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 : N" I3 p: {# V7 I$ x7 u- g* P
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 $ @; @* E* |( B( p1 n  H
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
# V/ I; G* _* M2 ]) V在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ( J- D9 n5 C; V/ T9 G' 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. ! U( i0 r; b' n" m+ E" y
  2. void encrypt(unsigned long *v, unsigned long *k) {   z3 D  Q- A8 N4 j
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    & @! G% y2 v1 `" |) {
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 9 y9 x5 x+ w" M. E% f* _1 k. U/ B
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 8 e/ e: B0 p  Y' [5 o* X
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 9 A+ w/ ~. d! s6 T5 Q
  7.          sum += delta;
    . `- f1 i# T- g
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 7 c' l* }: k) S8 N6 ^8 f
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    6 v1 P$ E" G& x  T, `; a
  10.      } 2 J% o3 I+ \/ m7 F
  11.      v[0]=y;
      ?* ]. L' G% k/ i2 a1 S7 H# t9 M
  12.      v[1]=z;
    , y0 i( \9 @6 R/ D! K7 [
  13. } 9 |: j! S7 [5 S6 d
  14.   
    . s( ]1 ?4 Y" O; R- B; O
  15. void decrypt(unsigned long *v, unsigned long *k) { & T3 j% X9 Y9 ]2 P- N8 J: ~
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 5 Y2 f( {; W: w1 o# `4 `: }" }- E% ~
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ! _. x, x7 i; L3 W- M# I- }
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    8 D/ _5 S  d$ `5 g- H; p5 l
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    & n8 ]4 ~  W# s
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); + G! e: _& W4 w- v
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    - `) o; s* V7 n% E4 W0 ]! b, ^5 Q
  22.          sum -= delta;                                /* end cycle */
    ( ~! I0 a) i/ @
  23.      } 8 I; b: h; e4 ]8 B
  24.      v[0]=y; , z' D- T8 {) Y( d  H
  25.      v[1]=z;
    3 Y4 [: h# z3 G* }
  26. }0 O# d* q8 U) P- l$ G: x& ~( I
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
  R8 n# C, [$ C/ A" z" S- w#define UTIL_H
3 D5 T' c: v' Y$ ~+ T1 v/ H
$ Y4 L5 q; Y, l# T! V#include <string> . t, C# s$ G* X- [- Q: U7 U
#include <cmath> ( i' {7 [$ l1 b9 N# c0 l
#include <cstdlib> % P* V' h' [! c5 _6 a& d; V

6 j- _9 D0 ~0 x, _5 q* }" Utypedef unsigned char byte;
: P- t6 x; K, S! t' j9 E, Ytypedef unsigned long ulong; 0 x. h( h: n! @4 R( x  N( p
& S9 Z! N( ^3 z$ ?
inline double logbase(double base, double x) {
* R2 K% R& D$ K9 e+ i    return log(x)/log(base);
5 ?" M/ R6 x9 b* i}
: u* r7 p; C) L* W 6 ^: ]+ ^" ?, l0 i2 Z! Q  G2 c) q
/* ' I, q. p5 k; m3 D6 p
*convert int to hex char. . `1 `/ {8 ?" F* ^* R  W
*example:10 -> 'A',15 -> 'F'
- o& h& m6 g; }' Y2 U*/
$ a' O; \& V5 [char intToHexChar(int x);
, W" ~' E5 J3 z. A  H% f 1 ?7 |3 V* W5 [8 h  h
/*
+ c- s1 q7 K2 r& S6 Q*convert hex char to int.
4 C% `2 P7 l- [4 n: n9 X9 O! r*example:'A' -> 10,'F' -> 15   a6 u$ u3 T1 i
*/ 3 F: F% n3 Q2 Q* `4 J5 J
int hexCharToInt(char hex); 7 ]3 o) Y$ x: W0 u: P- L7 T
. P9 `" X4 R$ Z; i/ e+ ?
using std::string;
6 P! w- y" s4 t' e  A+ p* y/*
$ [! A. P8 f/ {5 Z*convert a byte array to hex string.
- z# [$ m  L( Y) \* S/ l3 y1 t*hex string format example:"AF B0 80 7D"
6 L. ~" P! K1 _9 a3 f*/
! W6 R* L" X' `) kstring bytesToHexString(const byte *in, size_t size); ) P# j" h' U0 K4 z
7 z+ n. u( E5 _6 k9 a
/*
% @: ~. \! B) y% _5 g! r3 K*convert a hex string to a byte array. 9 z3 q5 {& q( C  _0 @
*hex string format example:"AF B0 80 7D" + p  K5 A3 C1 }6 v" }
*/
" u$ L0 x# ^$ F* @& O: n) c( tsize_t hexStringToBytes(const string &str, byte *out);
* d' |. T1 F, _4 Y ' b+ O, p9 e- ?4 L" v. ]
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
9 A9 d. t. ?- [, R, g' l& [#include <vector>
) T  E- P/ j! @ 1 Z- w7 G; u$ e0 S  `. m
using namespace std;
& I: _7 R$ a$ T & S; @9 v4 X/ U8 m  H, ~
char intToHexChar(int x) {
1 j5 K# Z7 t9 ~. [) x  e6 ~3 ]  P0 h5 D    static const char HEX[16] = { 7 t0 G, W4 h' ~( S& x8 X$ A
        '0', '1', '2', '3',
  [6 F4 u. N" I7 ]# D        '4', '5', '6', '7',
8 j( F4 U$ Q6 [0 F0 D: ~1 T& l: d        '8', '9', 'A', 'B',   q  l7 U+ v& X/ M! l4 A
        'C', 'D', 'E', 'F'
! q/ D8 _7 g! I# P  Z5 e    }; 3 p. H  |8 `. X$ ^. p6 g2 T5 q# X3 ~& u
    return HEX[x];
7 {' O) p: _, Y( b: Z/ L0 A# w}   u+ ~; f) N% b/ o
2 ^* @9 F; D  d  ^0 \; y" w5 T
int hexCharToInt(char hex) {
- T- m' C# `% ?* |    hex = toupper(hex); 9 F# k2 h0 K& u; ^
    if (isdigit(hex)) * [& _' x$ S3 o2 I5 B, X9 h
        return (hex - '0'); / k3 S5 J& x+ r" g3 I- M5 q' \  k
    if (isalpha(hex))
! R, n8 V3 [" L1 s4 o# K# U        return (hex - 'A' + 10); , R: T# B% Q* I( b! S- B/ u1 m
    return 0; 1 \$ H( g% t) j) }5 G/ K. @
}
3 l  {, K3 z) d: `* Z, G! c
5 O! [' @, g) rstring bytesToHexString(const byte *in, size_t size) {
4 ?3 @. b$ ?1 x6 J6 l# G, |    string str; & d9 i  X$ Z. T0 M$ y7 W
    for (size_t i = 0; i < size; ++i) { 7 k5 U" ]/ u% K" V; H; Z: q2 v7 L( Z
        int t = in[i]; 3 _. q, ^4 Q4 D% ^8 I' o
        int a = t / 16;
; N$ i2 h+ @1 r3 I$ I6 y) i        int b = t % 16; ( K# x: }" Q6 A7 Y+ I- @& X$ F/ R. x
        str.append(1, intToHexChar(a));
- v' R( d; V2 A+ N  x) J        str.append(1, intToHexChar(b));
; z) l0 b, G* \. T) E4 @  ~        if (i != size - 1) % i" ^4 x$ P4 h
            str.append(1, ' ');
0 H) s* h# C. h; G9 l" K    } * K8 t1 ^% B, Z" Z9 u) ?! L
    return str; . p0 v% p7 D/ Q( J. H
}
% ^1 p6 q: ~/ Y3 L! r% Z
6 v# ?3 O( f( fsize_t hexStringToBytes(const string &str, byte *out) {
) ]- d% h; \+ s8 ~7 M& R ' m- ]- W. \9 @9 F& ]3 m
    vector<string> vec;
2 w5 F# d/ {/ H/ y$ w: I    string::size_type currPos = 0, prevPos = 0;
: i& T; T0 a- o    while ((currPos = str.find(' ', prevPos)) != string::npos) { " e  T- {" E( r
        string b(str.substr(prevPos, currPos - prevPos)); . @# y3 e4 I$ o" G
        vec.push_back(b);
" v6 l8 m6 {$ E# S- g        prevPos = currPos + 1; 7 u( l1 T3 ?3 t( \- T9 g- f
    }
4 C* Z% w, j& j' `    if (prevPos < str.size()) { / t$ H6 m4 w" ~
        string b(str.substr(prevPos)); 5 p. R/ w3 O4 w- ^
        vec.push_back(b); 8 D( Q7 \( n: r5 r
    }
: @: o$ N; Z  n    typedef vector<string>::size_type sz_type; 6 h# W( P; n( v0 e- D( b3 D& z# [
    sz_type size = vec.size(); 8 \- Y2 [3 f! v& h: u7 p
    for (sz_type i = 0; i < size; ++i) { 8 Y$ X& j( ~. r" w
        int a = hexCharToInt(vec[i][0]); 6 m" W' M' L  r2 w! v1 H, s+ g! k- ^
        int b = hexCharToInt(vec[i][1]);
4 i, U% A- x4 l1 r+ }" w1 G% c        out[i] = a * 16 + b;
; I9 h7 Q  b8 C* `3 \3 E, ^    } 8 b2 ]* ~$ W; H
    return size; 5 L' |/ D( L" P$ y8 y3 Z
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
3 v% L7 j5 x5 k* n! A* v/ m7 ]) w#define TEA_H 7 l3 F) l( A) D5 @

& N4 R4 `* K: ]9 y" V/ D6 {( t/* : z# w, j( W, T$ H* o* w
*for htonl,htonl 9 K1 _; M! b% f- I; H
*do remember link "ws2_32.lib"
# S! e* R4 |2 @4 L$ N7 X/ l*/
6 g! h. L% ^9 T: [#include <winsock2.h> $ w* t! e: A7 X
#include "util.h"
  i6 Y% R% K+ E, a; E
3 d% |( U; R4 y% qclass TEA {
- y" _4 w: o& w/ `" Z. lpublic:
  Q, q* ?4 s7 }* C    TEA(const byte *key, int round = 32, bool isNetByte = false);
6 ~3 Z6 `& g( V) C0 t2 E    TEA(const TEA &rhs);
* {6 o/ w! a' c! N  U3 ?2 R. H    TEA& operator=(const TEA &rhs); + j- L9 p* @1 c. ?, \# `
    void encrypt(const byte *in, byte *out); ( O( X9 O) h1 _; Z, d& q
    void decrypt(const byte *in, byte *out); 9 g* {: d3 C. c; o! ^% d3 y! x: n
private:
7 {5 H& G8 Y% ~3 Y! }    void encrypt(const ulong *in, ulong *out);
/ G5 D1 p# \) t) g    void decrypt(const ulong *in, ulong *out);
( j/ D$ e! R$ W; g. U  Q    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
4 F2 V) v  y, W6 g. N    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
: E, x* \# f  x! |5 n# j; d3 _) Eprivate: $ v: o1 _& \& o/ M- M) K
    int _round; //iteration round to encrypt or decrypt 3 U  g" l+ R8 w4 ~5 ]
    bool _isNetByte; //whether input bytes come from network
3 p  f  v" M/ U! G    byte _key[16]; //encrypt or decrypt key
! ?7 e' a6 M: v" [5 Q- L}; # W5 t1 z( |7 }
  J1 _9 C" @$ I% ~
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ( N+ b% l- \& g* q& l, |
2 #include <cstring> //for memcpy,memset - ^# K  e1 J; X+ ~2 `
3  $ h3 j! M$ u: T' q
4 using namespace std; ) n! f  u$ [4 i8 S4 N+ ]
5  2 M3 P$ M3 S" i# a+ q' n
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 9 l5 O" M. d* |& t
7 :_round(round)
/ R8 t' P/ y* I1 |0 y. j5 S 8 ,_isNetByte(isNetByte) { / @: V6 x2 Y$ \) q. {0 h$ c
9     if (key != 0) 1 u; U5 [! `* e5 k* J! \4 \" ]. X
10         memcpy(_key, key, 16);
% B2 [9 J) o8 W) }  G1 c: {11     else 9 y1 [9 @: k3 k
12         memset(_key, 0, 16);
7 C2 A' d9 V' W: p13 } - B# p. K7 H0 ^
14  % k9 _* ~7 I% i" q0 e( M% W# J0 H* j
15 TEA::TEA(const TEA &rhs) 7 k; D- _& c( L3 b
16 :_round(rhs._round) + P. s* {/ _) ~6 b
17 ,_isNetByte(rhs._isNetByte) {
$ ~. Z6 f- c/ ]18     memcpy(_key, rhs._key, 16);
: v+ p4 \6 h; A- U19 } ( H, r" o8 [8 \( G) E4 @* M( s5 }( M
20  
4 G7 L& U9 l$ ~% H) \9 G2 |21 TEA& TEA::operator=(const TEA &rhs) {   M  B/ r1 C  X; S- A4 g! |' B; i' ]  F' n
22     if (&rhs != this) { & @/ A7 G  k) j. p9 _% z
23         _round = rhs._round; + _% T: p8 v: T9 t, d0 t
24         _isNetByte = rhs._isNetByte;
- ^4 O- J) ]0 Z6 ^1 U9 F$ y25         memcpy(_key, rhs._key, 16); # c8 R! c7 C- l3 q9 f# e8 [5 C% Z
26     }
0 h5 Z) R" z4 A# J# R3 G2 O. j27     return *this;
, r( v1 Q. ^, F( ^  {- ^0 f# ~$ T4 [28 } & o5 c5 ]1 ~# t6 }2 E$ G# J3 p+ [
29  . b1 a6 ?" q+ V* N
30 void TEA::encrypt(const byte *in, byte *out) {
- @; p7 W: G* m* \* u31     encrypt((const ulong*)in, (ulong*)out); 5 ?) q5 a$ K7 O' R3 q
32 }
' z/ w- Z5 P, G( k7 q$ @33  - d0 Z# h% l3 J! r$ W
34 void TEA::decrypt(const byte *in, byte *out) {   b; ~6 t: G' I3 d
35     decrypt((const ulong*)in, (ulong*)out);
# C4 Y4 K+ K$ Z* }& i36 } ) W) v* N/ C1 |& A
37  + ~! p2 O1 ?5 M! v6 {7 b# Y
38 void TEA::encrypt(const ulong *in, ulong *out) {
7 @/ L2 t6 u. ?0 {* z39  
; V) Q1 v8 |8 G8 N9 K1 \; ?" G40     ulong *k = (ulong*)_key;
$ g$ x& g5 F; U) O) w1 Q4 L9 X41     register ulong y = ntoh(in[0]);
4 U7 c. @( ?/ z& S# j: H- N5 M42     register ulong z = ntoh(in[1]); / U. ]( G$ C9 i/ G6 I
43     register ulong a = ntoh(k[0]);
# R( I$ |5 ~/ G) f; L44     register ulong b = ntoh(k[1]); ' D9 E2 P0 R- d1 n3 l6 I! A) X
45     register ulong c = ntoh(k[2]);
+ \4 j6 `+ C, J4 R, Q7 ]46     register ulong d = ntoh(k[3]); $ Q7 P+ g4 P8 O; _. a& _
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
& R/ Q4 S6 H/ I8 I5 n7 K48     register int round = _round;
% E9 _0 |. G4 M, X" _3 s  P* \49     register ulong sum = 0;
0 |8 Y3 P- I4 ~. `50  
5 G4 \8 F( V5 b3 c51     while (round--) {    /* basic cycle start */
& J3 p0 ?# F& a# a52         sum += delta;
" ^& [6 }; f( x9 C9 O; z% d6 i" p53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ' r; ?+ i2 Z) y6 u) C5 u' F
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
7 v2 U  j8 Z6 S$ q55     }    /* end cycle */
  k* M5 ^6 i# k2 K" H; }* _) I56     out[0] = ntoh(y);
; o  U/ g  [  A2 g0 p57     out[1] = ntoh(z); / R* o3 S+ @6 Q$ z4 r
58 }
# }$ }( F* ?' Y  G! ]- u7 a; G59  $ V: j8 b8 [- e! j1 \5 W
60 void TEA::decrypt(const ulong *in, ulong *out) { 5 N+ }- k8 V1 r3 l$ Y
61  
7 b' H2 _& J4 H' P( \62     ulong *k = (ulong*)_key;
+ A+ l+ _- n2 D$ e% @+ e$ b2 }63     register ulong y = ntoh(in[0]);
3 Y! L% `3 H! {% N; x4 y64     register ulong z = ntoh(in[1]);
1 p, j0 ~. G+ c+ J- Z65     register ulong a = ntoh(k[0]);
) W( K9 j* [' Y( o66     register ulong b = ntoh(k[1]); . N* [9 Y) x: L' Y2 q
67     register ulong c = ntoh(k[2]); % B3 E- X, E* b9 [( o' C- o" t* {
68     register ulong d = ntoh(k[3]);
2 H0 h, G( J1 a0 X6 ^7 S6 m69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
" o  l$ d* H5 \% a6 T- M8 J( y70     register int round = _round; 1 i" z1 y: h9 T+ `
71     register ulong sum = 0; . z5 v  d3 l- ?( L
72  
$ s8 m- [' j9 Z2 T& N( |- f/ G73     if (round == 32) 0 H4 R5 x' [5 O% M2 T
74         sum = 0xC6EF3720; /* delta << 5*/ ( q) C! w6 t/ ?$ r! b
75     else if (round == 16) ! H0 e5 Y; B- V4 y5 T. Q+ x9 e
76         sum = 0xE3779B90; /* delta << 4*/
3 I+ y  D0 S2 {6 v/ @2 ]  @9 _77     else ! d" R6 S+ [' R6 f) K+ j, @$ W
78         sum = delta << static_cast<int>(logbase(2, round));
4 [, C4 w2 p. U7 Y6 u6 d" K79  
1 E, A6 [3 d% }! Z" W0 T80     while (round--) {    /* basic cycle start */
0 r( @4 m. j2 P& Q81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 4 n3 H8 q: S% ?  _
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
1 ?6 @: b0 s' g3 e7 a: ~/ C83         sum -= delta; 7 |9 z4 x3 P, y. H% r- \
84     }    /* end cycle */ - `/ y- I. C2 K! u
85     out[0] = ntoh(y); + e$ s% p: }. F
86     out[1] = ntoh(z);
/ J. o' ^8 {/ \, {0 O# `" e7 P87 }1 R) p/ m8 y2 B  x3 B: ?

. r% v4 c  n3 q7 x7 T6 {& C9 K需要说明的是TEA的构造函数: + w: @- U' D- r; @7 m5 r" P3 O
TEA(const byte *key, int round = 32, bool isNetByte = false); . l" W1 O% ~/ v4 U
1.key - 加密或解密用的128-bit(16byte)密钥。 ; K0 J- D7 l6 C( }- P1 S, i  e
2.round - 加密或解密的轮数,常用的有64,32,16。 % ^, ?0 `! G/ ?$ l5 k* d9 U0 f' U
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
3 x* V% M+ S$ X! n+ n8 G9 P: y' {2 L* S  [
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
0 Z- j# Y* w6 Y0 ^: Y& z9 t, ^ 2 #include "util.h" / Y4 R- w2 L: X8 H! r! j/ g& Y
3 #include <iostream>
  l/ \( A' E  t3 @ 4  
9 a9 u/ R# F: o" w 5 using namespace std; # ?9 K9 j& b5 Q4 w  l
6  
5 L  F( P: v9 [9 O$ o  p- b# d 7 int main() {
" i$ d- C8 l4 O+ s% u# _ 8  2 ]  @( A) x  K( M* W7 X; c
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
2 }. u1 C4 G% H: z10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
' k& o! J) p5 }0 @2 x2 j; ^11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; " A0 j2 u! y" X' ^" Y) f" z
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
7 [3 P* w7 |4 B$ w- F% i1 ?1 ^13  
, S. }, T: C! [14     size_t size_in = hexStringToBytes(plainStr, plain); 9 ^& W$ y$ X& D" n' y% c# t
15     size_t size_key = hexStringToBytes(keyStr, key);
" N) J) ^$ [9 a  q, l# B16  9 J1 d& U, P- t
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ' }& n7 r8 S# _; \
18         return -1;
8 [; G0 y0 o- ~- C19  , a1 |: \: ^1 w, q
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 5 Z) D4 D( H# K6 ?2 d, A
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 1 E/ {# ?9 b# ^4 Q. x0 ^
22  
% ^9 W7 t& b' w& O23     TEA tea(key, 16, true);
0 v3 p* c1 m: r24     tea.encrypt(plain, crypt);
, A: u. Y8 X7 S( I# F2 M" W, z  X25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;   _+ u) v+ M* R) p
26  $ I! h6 f0 r8 Z# z) X
27     tea.decrypt(crypt, plain); ; B2 S- U& K3 ?7 ?) D2 I+ _
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; / K, p7 d5 j' C8 n6 ^
29     return 0; ' j. p9 y# I; q# d: A' h- N; g
30 }
8 B5 D) k/ n) ]6 W5 @9 I# p$ E; ]4 x3 Y3 ?; E
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
8 b, b9 V$ h( v+ H2 Y; G) \4 l7 z运行结果:   D: ^% f! O6 r" |. ?. g, x
Plain: AD DE E2 DB B3 E2 DB B3 # o4 y6 Q3 X+ S. `
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ! n2 B+ S9 w7 ]1 l! M9 I
Crypt: 3B 3B 4D 8C 24 3A FD F2 0 q( M. c' _* R+ q5 b& n
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 02:56 , Processed in 0.017571 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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