找回密码
 注册
搜索
查看: 38538|回复: 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轮):
, Q* N2 x" h0 Q; c( F3 a; D3 ?微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 # d4 F1 S$ e! C" F
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 3 _, }; t! t& B" v
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 , T' M' z3 ]" ?; Y/ b1 l1 D, W! t( }
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
8 x! q0 p. p0 a2 K/ h: t2 ~! q在 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. + p) x9 T* F4 d2 v+ E# _
  2. void encrypt(unsigned long *v, unsigned long *k) { , o3 l: M* k/ i& F
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ & }2 X- o: p. q" k0 M
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    : q- }4 N, F3 p1 J$ z9 T. G3 l8 r2 e5 A% R
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ & d1 A" C/ {0 b; [4 j
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ! y+ d- S5 t( I3 y* j( t
  7.          sum += delta;
    ( _: t# y) D+ m1 w4 V+ Z
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    * t; ^+ p* \# w0 a- W
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ' F' j" R3 M! p: W
  10.      }
    ! d- @8 b. U1 I3 a6 p1 u
  11.      v[0]=y; 9 g: ~* N+ _8 u0 T2 Z$ m- k
  12.      v[1]=z; ( N+ y( i9 L6 r* c
  13. } 3 u: {8 Q: ^/ e- r* B- K- u7 T
  14.   $ H* L4 H4 F8 o
  15. void decrypt(unsigned long *v, unsigned long *k) {
    & u- [# S# t- C* v" C
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    & {% _* p  Z5 [) o! e
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    / v! I: R* i  p, s9 R3 @
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    / t0 O" {: X4 i! [$ l& _
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 9 U! @; Q+ V0 w& ]
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ( B$ ?) n4 l6 x, j. C
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 1 C  f7 ]6 `, m% j; k* g
  22.          sum -= delta;                                /* end cycle */ - _1 I' O2 D- ]5 a! E& r% c) c
  23.      }
    : O" |9 `( l9 \: k4 M
  24.      v[0]=y; 3 _! P0 ^, o) j3 z
  25.      v[1]=z;   C9 t7 d, p/ ^: ^2 ~! ^. R( l
  26. }, H# X' q( i8 W$ _! [& C* t- U' ?
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 9 J0 J( B" H& _: q; [( M3 R( j
#define UTIL_H ' @  B1 t0 C$ B3 n' ^; H. S
. d& C- {3 p' X. R  `' i/ P/ g
#include <string>
9 L# [" M# E1 R3 j/ g#include <cmath>
8 A& p0 _9 ]& v0 X#include <cstdlib>
) h$ i: e, o( }  h% o
4 I" B, ]6 [; D- T: ktypedef unsigned char byte;
$ b3 X; D, @  A1 B! G3 Z  [$ htypedef unsigned long ulong;
) F- Z' u( C) D4 B + Z5 D8 N# \# b/ e1 V! [" W" s
inline double logbase(double base, double x) {
; u7 W9 N, G2 ^4 J    return log(x)/log(base);
) h9 x1 Z/ s7 Y% y  F8 C}
! R) d: G2 f1 Z. ?  c4 [# Q " R0 ]/ n( I) p& s
/* # J6 K7 y' j. J; b1 w: ^$ E( T
*convert int to hex char.
3 q- c. A- g" N- b* O+ o  F*example:10 -> 'A',15 -> 'F' 3 [( C' ?6 K7 s3 \; z% n, d; `
*/ - I( R. r8 ^' e& y# O0 \
char intToHexChar(int x); & }5 ~" l7 ^* _) h) T# {! j, R

1 [# }/ ?8 H7 D# E& X/*
; {0 p' R7 S4 V3 Q6 H$ m*convert hex char to int.
& B8 T% M" o( @  [*example:'A' -> 10,'F' -> 15 4 Q* Y6 \# i7 i4 _
*/
8 F' }4 N$ ~4 a4 N. c* zint hexCharToInt(char hex); ; M. F" Q+ t5 c2 B

! r, o: \9 s9 U0 O+ kusing std::string; ( _3 q4 B8 Y5 q% m
/*
, J8 L* g! J" J*convert a byte array to hex string. ' g; N# P5 `9 A+ {& o# W
*hex string format example:"AF B0 80 7D" 0 g! J  L% l7 D1 [0 J0 j" N' k
*/
# f) R: @' N" a' t5 t! mstring bytesToHexString(const byte *in, size_t size); ! P2 `# W1 M" E: V1 Z

- o- }  d8 l6 ]8 ^- z' X/* ; `$ O/ R3 U4 m# C' g
*convert a hex string to a byte array. 5 G, l8 c" l( P3 S( y3 A7 Q% B
*hex string format example:"AF B0 80 7D" 4 L4 M; n! C% i9 \3 p# }
*/ ! g- U9 U) g- \
size_t hexStringToBytes(const string &str, byte *out); 5 r2 I- E  G  _0 I: a
# ^$ k$ U) a6 D9 y' w1 D
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ' {4 ?; N& E; t
#include <vector> $ d% t( O+ l1 ]( e, P: y; Y2 }
& [% y* ^$ X" H5 Z+ p5 w) e
using namespace std; * S& n0 C* ]5 W( n5 c; f
& q4 o* \  u& x: t# u. g
char intToHexChar(int x) {
; i  h( w2 x" ?    static const char HEX[16] = { ; N6 W" ^- B5 F' W! R
        '0', '1', '2', '3',
, F1 q$ d" a6 h        '4', '5', '6', '7', 9 t9 ?- v9 y, o7 m0 v- y
        '8', '9', 'A', 'B', ! ?( g( s/ o& F: _
        'C', 'D', 'E', 'F' ( x8 h% I5 f1 g. m, r$ t* j& t
    }; . M7 d( o, x; h+ R' [. |2 e
    return HEX[x]; , ~  z: }, [' d' c
}
( }9 B4 {  I5 x7 D- D % V: X+ H1 t* _& I- r3 A
int hexCharToInt(char hex) {
) V5 s2 w1 B' i* w! m    hex = toupper(hex); ) M8 g: C6 T$ P# J% E3 G. u
    if (isdigit(hex))
4 }( m# \9 ]! T8 S7 J# S" U        return (hex - '0');
  y& g7 V. T: Z* r4 x    if (isalpha(hex))
6 S+ n0 @5 E) j/ L        return (hex - 'A' + 10);
2 l& L# q- v7 F. g    return 0; " C' Q$ G+ j. j4 B
}
1 |$ k* p( j" b4 Z9 G+ ~# ^
; K% B' ~3 ?. \6 ?string bytesToHexString(const byte *in, size_t size) {   j! L! m$ P5 y/ q* K
    string str; $ |/ `- v2 \; X* {6 G6 y
    for (size_t i = 0; i < size; ++i) { $ r* G% g% Y$ W' O9 @
        int t = in[i];
' O  V4 B. m6 d4 P% A+ n        int a = t / 16;
/ u, G1 f* p# M7 t        int b = t % 16; ! x6 N. A9 \; W
        str.append(1, intToHexChar(a));
  R* k% |4 |" _* T" Q- S        str.append(1, intToHexChar(b));
; P4 H! {, G1 n) D4 J. D        if (i != size - 1) $ n7 S9 `. w, l6 e- Q
            str.append(1, ' '); . p' P$ a# v* e. {6 _
    }
6 ?# t( l, Z) V+ V3 r' C  i    return str; # E( g' X2 e- d% Y
} , |0 c$ b; y* x6 l5 g3 k  |, e

) Y/ Q  Q& `* Ksize_t hexStringToBytes(const string &str, byte *out) {
/ o2 G6 Y* q3 c- N! N& `
6 F/ g2 J* J5 c+ G) |    vector<string> vec;
6 D. o+ B% @8 g. h8 D5 n8 e: k    string::size_type currPos = 0, prevPos = 0; ) @6 f9 d! x* s9 I( c/ b
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
6 V/ C$ Z& L' e5 M5 d$ J0 s        string b(str.substr(prevPos, currPos - prevPos)); 4 f/ _" L8 k/ _" P6 {
        vec.push_back(b);
& b9 u, m9 o7 ]& C" J        prevPos = currPos + 1; . E. T3 e0 \: u0 [; \0 @! w; R% R1 @
    } ) s8 E( E) c2 _3 K6 v  b. b: J
    if (prevPos < str.size()) { 0 m, A0 D7 r. ?# w7 g
        string b(str.substr(prevPos)); ; W% s: x: x' ?$ M, X3 s; Q
        vec.push_back(b);
0 |) f1 x6 j8 \3 l, K2 F    } 7 b  ]' q( y; N: K3 X
    typedef vector<string>::size_type sz_type;
8 f- k. }. N" v3 E- Q    sz_type size = vec.size();
! z8 J6 T: h) `    for (sz_type i = 0; i < size; ++i) { 3 L& E" E7 }/ X9 f9 _
        int a = hexCharToInt(vec[i][0]); $ c0 l. R1 f& C& G
        int b = hexCharToInt(vec[i][1]); - T4 o& S# O! [+ E9 {' ^8 n
        out[i] = a * 16 + b;
4 I: b+ l7 Y, k' s  v% q2 a    }
$ ~3 l! D1 C/ K; B3 l    return size; , u$ y8 ^  [1 e  l. G/ s; A
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
& S4 W. x& N- A#define TEA_H
4 g3 A! o9 |% o ; p/ v3 Q; F( C. G$ n
/*
% U: x) ^& C* i. l*for htonl,htonl + T; i  X# Q8 Y. p3 y
*do remember link "ws2_32.lib" # f. F6 s8 ]& O' ^+ L1 A. M' p
*/ - V( Q5 n& g, e: G- L
#include <winsock2.h>
2 V4 ]& d3 y, m" K" u+ Y8 z2 ]#include "util.h" , X9 d3 _) q  O5 ]; H: h

3 ?' d6 }9 K. W0 Sclass TEA {
+ t# n9 {4 ~! C, U. U) P7 C8 n8 gpublic: - C/ }2 H( ]1 P, C7 C
    TEA(const byte *key, int round = 32, bool isNetByte = false);
* g+ L3 M3 B( U" I5 N    TEA(const TEA &rhs); ) E2 [% A4 d& B6 O7 g' g( \$ T
    TEA& operator=(const TEA &rhs);
; X- f0 K6 |5 m) d  ~8 Q    void encrypt(const byte *in, byte *out); # }/ Q/ n0 @" P- l
    void decrypt(const byte *in, byte *out); $ {. }, k! w- O1 x
private:
0 ]# b! ^9 y. s# S8 F- x$ B    void encrypt(const ulong *in, ulong *out);
( ^0 G$ s6 I. d    void decrypt(const ulong *in, ulong *out);
: q( [+ m/ s& |2 C+ Z    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } " |) W# i, U; }& L( @
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ! }2 V1 _4 i0 l+ g9 z% x; x9 ~; H
private:
0 `& s! f; m( J: w/ N* _    int _round; //iteration round to encrypt or decrypt 8 z, {' L- \  R: m; A1 b7 `
    bool _isNetByte; //whether input bytes come from network
3 [8 _% r4 |# r; p! a( R3 E    byte _key[16]; //encrypt or decrypt key # N' @$ u5 |, ^) J- B
}; " n. I' D) e  q3 A& M5 P
1 b" T8 P& A- M0 M
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 7 y* X( g5 R! [& e% a+ b$ h/ w8 @
2 #include <cstring> //for memcpy,memset 1 B; [* c) y7 O: k8 D
3  / \9 D1 v- @2 R- a( g
4 using namespace std; 7 U) c1 M1 q$ p7 E: w
5  " f1 g( C; w3 p) y" I) U' g( k
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ) f$ h3 B7 m6 g7 x
7 :_round(round)
! ^( f: }. F# O0 |7 U* J1 D! r 8 ,_isNetByte(isNetByte) { & T- x# ?4 x! K( p0 k2 y  @9 u
9     if (key != 0)
! J8 Y$ s4 e9 U- z- @4 O10         memcpy(_key, key, 16);
4 ~9 K/ B2 e5 e- ^- K11     else
( K' b: R& G$ N! q% ?: X- h12         memset(_key, 0, 16); 6 ?6 _5 `3 K9 O! ]2 Y  @% g
13 } 0 D* ?" P0 d+ b* b/ ~1 `8 k
14  
+ L* R2 ?; j7 ]* G4 ^/ u15 TEA::TEA(const TEA &rhs)
- G+ z! Q- R5 `/ y3 E1 z+ J6 `16 :_round(rhs._round)
3 p, K0 I' j5 j, ~2 f17 ,_isNetByte(rhs._isNetByte) { 0 w7 V" k4 r. [7 l
18     memcpy(_key, rhs._key, 16);
$ T  `$ }- h# ^) w% \: _1 o19 } ' b+ @7 G1 l# s4 h$ ?8 o  {
20  5 _+ i8 I) x' x3 V2 h* X6 Y
21 TEA& TEA::operator=(const TEA &rhs) {
+ n9 S( y9 h+ K4 H$ u4 m* }3 b$ y22     if (&rhs != this) { 2 R$ L# f+ a7 ~* Q3 t
23         _round = rhs._round; / p1 p( L5 @) E+ T
24         _isNetByte = rhs._isNetByte;   @# |9 P( R+ D" d% p3 f2 U" v8 ~
25         memcpy(_key, rhs._key, 16);
) O- r$ w$ y9 Y* `/ e26     } ! ]5 r6 W- c& f% ~+ f; T
27     return *this;
  p: N% k# a4 w28 }
* W1 s: a% k2 V: R& M  N29  $ H4 r3 n3 H' ]8 M2 C
30 void TEA::encrypt(const byte *in, byte *out) {
8 j$ V6 k1 u& \( U6 n  e7 B- r6 M31     encrypt((const ulong*)in, (ulong*)out);
+ V7 |! v& \: d9 g- o. ~32 } . V: x  s# b8 ^2 z8 M  F
33  & f6 Z. c/ S, @. V! q: L9 s
34 void TEA::decrypt(const byte *in, byte *out) {   L& ?# H" H: J3 L: i
35     decrypt((const ulong*)in, (ulong*)out);
5 a# j  S& a1 Z: H  l36 }
. x/ }5 x3 D3 E37  
# f: }! L# q* |# M: k0 Y: D+ \38 void TEA::encrypt(const ulong *in, ulong *out) {
* \4 V/ Y, L  A. \8 j5 P39  & x1 o$ c8 a( _2 L2 p: L
40     ulong *k = (ulong*)_key;
0 a0 {7 r6 D/ M3 H% ^& D- j41     register ulong y = ntoh(in[0]);
! J$ v5 w9 J; G) o42     register ulong z = ntoh(in[1]);
( _' t/ \. L. o% L: ~43     register ulong a = ntoh(k[0]); 4 W6 _0 N. e9 X1 G1 K7 L7 |6 l+ |# g1 c
44     register ulong b = ntoh(k[1]);
( M6 V! n" D' f, Y" ^+ d7 `7 h6 i- K5 L45     register ulong c = ntoh(k[2]); 7 S1 z  K# h; V: p* q7 }- m$ Q
46     register ulong d = ntoh(k[3]);
5 U, T  t# ^; c# i: k8 p$ x47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ : z# p% K% N$ Q- B
48     register int round = _round;
) x' ]" g" J: @" Y49     register ulong sum = 0; % }& F9 S3 x8 c& @  u* ~
50  
" z8 C- k) y( `, T51     while (round--) {    /* basic cycle start */ 6 y8 F; g! P  y8 i+ C: y* w
52         sum += delta; ; V0 Z! q. A$ _) D
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
1 A  t* C5 R% n" A) Q& Q8 r54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 5 t/ q1 L) `1 a! p, k8 h
55     }    /* end cycle */ 6 O" A) x9 K6 `& H% H' {- D# Y
56     out[0] = ntoh(y);
0 ?( [  r8 a% }% m4 N* W2 B, Y# |57     out[1] = ntoh(z);
" _5 K( I8 p( ]) b/ H* [58 }
# [$ K5 R* T# g: G+ X+ R' ~5 f7 |59  
! H/ h3 A$ G  a60 void TEA::decrypt(const ulong *in, ulong *out) {
/ W+ n/ Y  Z2 W2 U8 w& Q' a61  
( H9 e3 P) M/ r6 b62     ulong *k = (ulong*)_key; 1 R+ a+ Z! V  ^6 s# q
63     register ulong y = ntoh(in[0]); / F0 G; L# ^- p. c- {$ H
64     register ulong z = ntoh(in[1]);
9 T& ]$ O7 u- R1 m$ z2 ~: P65     register ulong a = ntoh(k[0]);
! b/ z5 H2 N  r* P3 v" r7 T% Z66     register ulong b = ntoh(k[1]);
- D/ o4 g7 |( {5 u, R8 z( A67     register ulong c = ntoh(k[2]); " r* ]" e9 S5 M: n$ p  V
68     register ulong d = ntoh(k[3]);
) c' q) Q6 _. J69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ' X+ U, l5 h0 U: b1 [. b# v
70     register int round = _round;
' u* y2 d4 S! Q- Z  _( t71     register ulong sum = 0;
8 Q0 _6 a% T: y1 y  z72  4 U; p& L3 @+ ?" H* l& D
73     if (round == 32) 1 y3 I6 d( X: c* Y& i! T1 C
74         sum = 0xC6EF3720; /* delta << 5*/
- M/ D0 @( a# P1 R# g0 v1 O75     else if (round == 16)
4 A# C) Y+ X% _3 F% I  I+ h76         sum = 0xE3779B90; /* delta << 4*/ 3 @' ?1 e8 v8 M8 c) y
77     else
  v) V: q9 V  X. `78         sum = delta << static_cast<int>(logbase(2, round));
) f' }$ p5 L4 h* ~0 \: W9 n, ?! X' a79  * h: p7 K5 P" r! l7 [
80     while (round--) {    /* basic cycle start */
0 {; r  m+ J/ n, u) p, z5 M81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ h% Q  a. u# w3 e+ Y82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
+ _# N9 ]8 g) m' c83         sum -= delta;
( W( }( O+ z9 O* E- \84     }    /* end cycle */
9 U: ]/ s  M' Y' b3 t( q85     out[0] = ntoh(y); / r8 F# p- c0 `. ^
86     out[1] = ntoh(z);
# J4 r; Q. \9 w* A87 }
# l7 t% v4 t1 U: c3 _* I
* e3 t, a9 I: t需要说明的是TEA的构造函数: % k* r# \' V$ R  Y: @$ d' ^4 t
TEA(const byte *key, int round = 32, bool isNetByte = false); ) U7 v: O5 B# g0 q' T; ?7 O
1.key - 加密或解密用的128-bit(16byte)密钥。 * A6 }' T, n3 S
2.round - 加密或解密的轮数,常用的有64,32,16。 ( Z. e( k' M. d+ R) T* f) A
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
/ `7 ?' C7 B4 z" y; A* t' G8 j3 @
) V# j. n  V5 a& e. S2 u6 P最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
7 h- C2 ^- V- p5 R- U: b6 O, [8 j 2 #include "util.h"
- m. V! b' L! ~ 3 #include <iostream> + w' |5 P" S+ H4 O" h  `
4  
! L# x& }9 R$ K6 e 5 using namespace std; , P3 i3 _, M, ~* }
6  / `3 f, W& `7 p* {0 I
7 int main() {
9 @# n- e4 v1 k0 H# |1 k; d* X 8  
% J) {% a: w8 q( P, k: V+ t* j0 t' j 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
9 Y' t+ H- f/ L# I4 [3 D10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
; ^3 y+ `- ]- K5 x% H11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
0 U# _8 j5 c$ Q12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
9 E7 r1 J; }5 A2 ?( E& B8 |& D13  
; u8 {6 `9 S3 ^+ i& j. M& p+ E14     size_t size_in = hexStringToBytes(plainStr, plain); / D! t8 q+ D9 w/ K  l
15     size_t size_key = hexStringToBytes(keyStr, key); 7 b- u% d: H: H" p/ M
16  
3 |* T  O( \' H. E17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ! F, K# X; w" L& O5 V: h
18         return -1; ) o# X5 i: `; h7 p3 q/ v  D
19  
* R9 t2 v( K3 L  U8 S' c* q20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; & L' o( u$ C* a1 t% o
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 2 Q9 p8 D. w* d1 _7 ~
22  ! g4 o9 T  v7 v) L. ?# {6 q
23     TEA tea(key, 16, true); ! _5 _7 m$ m- N: ]4 b
24     tea.encrypt(plain, crypt);
) n$ P4 p9 }1 n( R4 R. X2 c: g25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; / h  f5 K2 N2 h' P8 r
26  - K5 s8 O9 d+ H% ]5 A. z
27     tea.decrypt(crypt, plain);   d2 r/ r9 ]! K7 _* w) F
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
3 j3 z1 d- G/ @+ T  N5 f0 x29     return 0;
9 H# s+ n6 B0 N" f30 }
- M8 F; c# h1 `! x9 H- L1 q( U! Z6 l) x; l; Y
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
6 L0 z4 f2 ]  p运行结果: 3 j* Q' S1 [8 M7 G4 O2 z  g$ h
Plain: AD DE E2 DB B3 E2 DB B3 " X, U* f2 w# @3 p# Z& @
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ! x8 L  G5 {9 Y: r4 D
Crypt: 3B 3B 4D 8C 24 3A FD F2   [; I0 k( z. d; m$ K4 s( Z8 {, r
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 04:45 , Processed in 0.020398 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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