找回密码
 注册
搜索
查看: 37457|回复: 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 Z' q$ W- t2 q- R微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
& q. ^+ {- j$ ?$ OTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
! T) \: |7 O) ?: Z/ f" l" o7 x4 O; g之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 - d" j2 x) d  t
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - P$ T* b2 S( ^0 M/ T
在 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. ' o0 I6 o) K* _6 _+ \0 u
  2. void encrypt(unsigned long *v, unsigned long *k) {
    - N; j* w& y# e1 c4 J+ @. z
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ " h9 L& v. ]* c' s2 n0 E% \& ]
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ , e2 Y% |, I0 \: I6 s; b
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 7 j- A/ b5 Z' Z' J
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) @* e6 |, k+ L2 c
  7.          sum += delta; & M2 n) A& Q; \
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    8 n2 v! \5 H+ _
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    6 w( T( z! L) n: _
  10.      } 3 h2 E3 {2 z2 x: X" @- E  B6 E
  11.      v[0]=y;
    + e8 E0 s9 f3 O* O2 c
  12.      v[1]=z;
    ' ~& b4 z0 Q! Z8 j& [2 t$ M: a( D
  13. }
      ~* U% w: d$ x( R! F
  14.   
    2 N  T6 P3 G7 f/ K9 b+ W
  15. void decrypt(unsigned long *v, unsigned long *k) {
    8 g, ~) O' m% N; L
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    + T2 V. g) \( q3 b  E
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    , j6 `4 B0 B; J
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    % C; {3 P* c  k0 i0 D, b, M9 e
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    9 u% K5 P" H5 s' u" W( M% A  L: K; X
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 5 y( d$ h+ M# X$ j! l5 `/ l
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    + H2 x6 p! [2 A4 v9 D. I+ z" s
  22.          sum -= delta;                                /* end cycle */
    4 ?0 m$ Y8 d( `. y
  23.      }
    , l, j% y, e2 l" ]8 p; k0 H
  24.      v[0]=y;
    8 s, F  h  X# C. u* X
  25.      v[1]=z;
    . S9 p( c/ U+ Y
  26. }
    2 x$ @) L  W, l) F
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
) g5 n+ i, v* B! Y0 ^# g" }; }#define UTIL_H ( s" y2 H& S4 t

6 m8 O3 a3 v4 G+ o#include <string> 6 ]8 O7 v: J# N0 [' b
#include <cmath>
$ `4 K  P$ f) m0 c4 j#include <cstdlib>
5 ]) a; p7 ~2 b: V& ~& s& W/ n 7 V/ x3 C# M& k$ F* q- c! \8 c
typedef unsigned char byte;
1 d' n& c( z6 z( |* Wtypedef unsigned long ulong; 1 @8 k% e; T8 f" {( j
4 N# P! Y- M1 A) L7 {
inline double logbase(double base, double x) { 7 C1 t- [! T4 h! r
    return log(x)/log(base);
: I) s9 h! m$ u6 I$ n! ~3 m" Z$ I. b} ! w' X+ I: g& N6 [: o. w; k
0 J1 j8 N$ N1 W. z. Z: M
/*
3 }  L5 F( e* b( u% r*convert int to hex char. " Y6 j7 a5 ^6 [# T( g
*example:10 -> 'A',15 -> 'F'
5 u9 O2 E5 K. ?, e  J. R*/
/ v  X, D- w3 Z9 m( ychar intToHexChar(int x);
* F6 E4 [7 J/ Q6 b9 b! i* C# K ) Z" o0 {8 I2 y" I9 b9 W7 n5 W
/* 7 Q5 P* W  ~+ j
*convert hex char to int. 0 m0 F* d/ {' `4 p/ F" T
*example:'A' -> 10,'F' -> 15 2 _# g) i, p+ D& u) x6 {
*/ 9 D, d: `0 x. }. L4 F. h1 g
int hexCharToInt(char hex); + b/ X. t! a1 q- `6 ]
' v* a6 ^9 Q/ d6 g& z* ^- I
using std::string; " [9 O6 y# O1 R/ J" A
/* 4 o% B& q+ `. R+ Y
*convert a byte array to hex string. , {* v, \- K- O( K$ X  E
*hex string format example:"AF B0 80 7D"
, j8 I' U: l; ?' r1 N& M/ U8 M*/
! z/ |8 G6 X3 }7 m: k/ Vstring bytesToHexString(const byte *in, size_t size); ) c6 [5 C  s% H2 p6 Q9 q% J

: s5 M" ?4 |, s7 d. M/*
5 {3 ~* E, U; Q; Q2 I*convert a hex string to a byte array. ( m5 J  _, m; c% q2 x8 f
*hex string format example:"AF B0 80 7D" ; d- T% v+ T8 V
*/
! h. m# k$ b) e% E; p- Jsize_t hexStringToBytes(const string &str, byte *out); - L  V2 J/ E, V5 x+ B: w
# T7 K3 ~. D/ o  u$ P
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" % @: G1 x  V. k2 T' c  L( x- Y2 ?
#include <vector> ) t1 A9 @, ~8 \" m& c& i8 m

3 v2 _# f, o9 S) V- z3 K9 eusing namespace std; : b1 s. C' r# y) Y
: J( v! {. w' q+ Q. [
char intToHexChar(int x) { 1 K8 q- o  D: S( ]1 ~
    static const char HEX[16] = {
- n6 p2 g0 ^) k        '0', '1', '2', '3',
. T% a8 m7 l- T4 |        '4', '5', '6', '7',
6 `& [5 n# B/ Y- L% f* g        '8', '9', 'A', 'B', . j8 H% l) A2 ?7 w1 m
        'C', 'D', 'E', 'F'
: M) m# v; P4 l8 ^& @, U    }; # ^+ \2 G# q* w7 U$ Q
    return HEX[x]; 7 ^2 u& {* v) q" j/ G* i
} ) h! ~; w- d) x* K! o: H2 Y

* k0 F% ]5 E' ^7 wint hexCharToInt(char hex) { $ s- B3 q' {2 M* C8 k
    hex = toupper(hex);
# J6 I9 y' E0 Z+ g' k, Y& {2 _7 D    if (isdigit(hex))
. w2 d1 a0 n9 ^1 E' [        return (hex - '0');
7 Q3 _( a) L1 K, F    if (isalpha(hex))
5 L4 x$ x8 A; P2 w        return (hex - 'A' + 10); " u& P' ]4 p; h1 `( q# P1 n
    return 0; 3 I7 i0 d" o' \$ {1 Z, c1 h# K
}
0 U4 E( J/ e; e4 P) \7 ]* f
6 I; H8 S+ ^/ h, Dstring bytesToHexString(const byte *in, size_t size) {
; U& d2 l- u+ N, o0 U' f$ v    string str;
1 u! K6 _2 B2 p, {  O    for (size_t i = 0; i < size; ++i) { / `8 h" [; @2 E5 O! {; w* h0 w
        int t = in[i]; 7 D% W1 J: i7 |+ x; m+ P$ G6 L
        int a = t / 16;
/ V. w* I& L* z3 v/ j        int b = t % 16;
5 W& M( B* |) l( E        str.append(1, intToHexChar(a)); 7 s  A$ B4 g9 @# J
        str.append(1, intToHexChar(b));
- {- w' L* X+ A: [        if (i != size - 1) ; i3 E' C+ b2 l7 l, k
            str.append(1, ' ');
" u( \4 V+ y5 q! h& L    }
9 L% a4 ~# D' @- G1 K  D    return str;
( R& C# }2 ]( r}
" y: C$ g, ^! x$ O0 D+ ]% D/ o
: j) x4 V4 g  ]: w- Z% T/ w( k' ~size_t hexStringToBytes(const string &str, byte *out) {
" e6 }0 B6 g/ @9 j 9 U; |! W% w: j: v2 o2 h
    vector<string> vec;
: e9 {  h4 a, {3 b$ ]    string::size_type currPos = 0, prevPos = 0; 9 U6 Q  w; h0 V/ ]: P
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
" ~& ~/ `/ `, ]# H1 ~3 v% J        string b(str.substr(prevPos, currPos - prevPos));   u. ~0 ^9 _; a, @
        vec.push_back(b); / o$ {; j' i) x0 c9 ?; ~) x
        prevPos = currPos + 1;
. o8 j; J/ R6 f, [- ~    }
6 y. R$ y) x! G) B+ @9 m    if (prevPos < str.size()) { $ ?+ H& l1 N9 B! E6 R- F
        string b(str.substr(prevPos)); 6 v9 ~+ h. F, @! G" o
        vec.push_back(b); + @1 m1 A7 k+ f  V( @' k. B+ O
    }
& y& R% T: A1 S7 L0 `, y    typedef vector<string>::size_type sz_type;
; \3 O7 A! ^, K/ ~9 A    sz_type size = vec.size(); ' q/ a: s; K. }# y# O. J! e! d
    for (sz_type i = 0; i < size; ++i) {
+ y9 E2 b* i$ Q        int a = hexCharToInt(vec[i][0]);
% a2 u$ f4 Q4 d1 G4 A        int b = hexCharToInt(vec[i][1]);
* Z7 |; O$ F; h; |6 J& v        out[i] = a * 16 + b; % e  ~  `: l0 s9 X
    }
& W% J, N3 d2 v2 A1 s0 u    return size; ; l3 \1 J! E; f+ r
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 0 G1 h0 J8 o" D6 K" n5 s
#define TEA_H
7 r6 ]9 E% S$ p; r% _ 9 u( s6 S7 D- K! S: U# \
/* 5 {, A2 w4 @5 d5 c" X  X" b
*for htonl,htonl " X3 s4 G1 m! \
*do remember link "ws2_32.lib" : q6 k/ C4 s% f% O' _0 t2 T
*/
. q2 B% X# q( w6 }& J& C#include <winsock2.h> : Q6 l# f, L5 o5 }3 W
#include "util.h"
: Q5 b" M( ~  `' J  `0 w* N $ q( U& G5 d  O0 U0 k, U- @
class TEA { + p1 G+ E1 m8 o! ?8 v
public: $ h3 R+ H5 K* s+ K. N
    TEA(const byte *key, int round = 32, bool isNetByte = false);
  D1 M) G( `4 o' b0 U& @8 v0 S- o    TEA(const TEA &rhs);
4 }0 u. }# s/ ~2 z- |    TEA& operator=(const TEA &rhs);
' B% f3 U# G; d! @1 X2 O: A; U    void encrypt(const byte *in, byte *out);
4 C* Q6 }, [0 D+ N3 q0 e4 m0 g( |    void decrypt(const byte *in, byte *out);   W9 k6 P' [; B+ l2 y
private: : p% y+ p4 E( ~
    void encrypt(const ulong *in, ulong *out); ) H2 l' n+ V& \* l- A1 L
    void decrypt(const ulong *in, ulong *out);
  |( r" b5 \; T; `$ w/ G    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } / S! B, B8 h7 S) f  Y9 }5 U
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
3 {( _8 c5 E9 V* X  H. lprivate: , S/ I1 f( f3 m$ }
    int _round; //iteration round to encrypt or decrypt
, K; f2 ~" U. w, Q    bool _isNetByte; //whether input bytes come from network
4 `9 W4 ], g. a& |" O+ b7 d    byte _key[16]; //encrypt or decrypt key + j" w' d3 \; O
};
6 ]# ]& a/ A9 L
: d0 ^# K& o$ g#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 1 W6 ?6 e9 q1 @1 _5 I. `7 E7 C
2 #include <cstring> //for memcpy,memset
. [' s# S) g6 ]: E( T  E; A! \ 3  0 |" B% C/ N" S+ i* l5 o3 p$ A+ g
4 using namespace std; % }8 Q, }5 p( S! q7 d4 G: D1 ?
5  ( X, c3 U+ b0 t7 K% l; m/ F1 p9 o
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
" h( J+ {3 q6 `' Q& ^ 7 :_round(round) 1 z1 B# G! S, d$ w
8 ,_isNetByte(isNetByte) {
/ x) M$ \3 I. U! i5 o) M: n 9     if (key != 0)
" c" Q2 P+ I9 N4 M/ ^2 G10         memcpy(_key, key, 16);
9 Y. N, L. \% ^: R11     else 0 V, Q& M" Q6 [3 a
12         memset(_key, 0, 16);
& f5 d2 _6 K- o13 } 1 O! Z2 `( P0 j
14  
- x1 g- Q% }% F+ @* M15 TEA::TEA(const TEA &rhs)
- e* m$ U% J$ G1 b) y% G16 :_round(rhs._round) : ~6 A5 X5 ^7 b3 h6 W  a3 I2 d& E+ x6 ~
17 ,_isNetByte(rhs._isNetByte) { $ [# s! R" v6 I% M
18     memcpy(_key, rhs._key, 16);
4 f5 w. b+ G' P2 C) ~3 @19 } " H5 ^1 \6 F* P- s
20  - z4 ^1 `. U& p2 O& c9 N5 X
21 TEA& TEA::operator=(const TEA &rhs) {
  c5 l* X. [9 d0 C4 x22     if (&rhs != this) {
7 {% \/ r0 Z2 c' b23         _round = rhs._round; * b' t* m8 m! x& W
24         _isNetByte = rhs._isNetByte;
% S* F$ O& m4 J7 d$ P4 R' L4 P25         memcpy(_key, rhs._key, 16);
/ a9 C/ ?# E6 y- D26     } . B: X- o- h/ _# @- y7 S
27     return *this; # b/ E& |- R* a$ d; A- g' I6 o
28 } 1 ~" X9 M& v, b! B- O& f! T
29  
; A/ D6 r5 e0 Z; H3 t5 R30 void TEA::encrypt(const byte *in, byte *out) {
: w$ p' N; n3 |) z/ p% h/ V31     encrypt((const ulong*)in, (ulong*)out); $ i/ \3 H5 `( ~/ ~/ V1 _" y. [
32 } ( b/ G& e: r2 c5 c. [9 e
33  
- `8 M1 t/ B3 q9 U& S34 void TEA::decrypt(const byte *in, byte *out) {
7 f7 O2 _1 F5 E$ G35     decrypt((const ulong*)in, (ulong*)out);
, z' N9 V3 w+ P& M36 }
: H3 u% A- Z! `  Q37  
( a$ e" b: ]0 k9 i- I. y38 void TEA::encrypt(const ulong *in, ulong *out) {
+ s+ d; ^$ M: j& [39  7 V7 w5 T( K% b3 a% r
40     ulong *k = (ulong*)_key;
0 M7 q" R# N  F& R$ o* f  }6 R41     register ulong y = ntoh(in[0]); 0 n) ?- [- G) H* O" `
42     register ulong z = ntoh(in[1]); / a& j; z/ `9 M( {1 \* j) H
43     register ulong a = ntoh(k[0]); 0 z9 W) o! C6 Z
44     register ulong b = ntoh(k[1]);
" |, N7 Y# v7 N& i45     register ulong c = ntoh(k[2]); : l2 ~/ o8 j# e) r
46     register ulong d = ntoh(k[3]);
  E( v: Q0 U# S5 B7 w: n47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
2 O( S; z" k, d8 Y7 {0 c48     register int round = _round;
& h( B* o/ n; P8 S/ C6 E" P49     register ulong sum = 0; . x( \7 R+ F" o" a, |1 r' P1 J
50  
' }' A7 p+ Y, D# ~( R1 Q' j51     while (round--) {    /* basic cycle start */
9 j4 D* u; i$ @* p- X( w6 \52         sum += delta;
6 N, I( T& K0 Z5 G$ F/ M53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
, W* A, h0 x% N% U* ?9 C9 W54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
, h# D5 Y3 E  E55     }    /* end cycle */ 9 \+ V# B* L) J1 Z# U
56     out[0] = ntoh(y);
( P( `7 z8 R3 X7 u57     out[1] = ntoh(z); . h9 h  S1 V0 C! @
58 }
: s0 ]0 ?& H( D2 A2 ?  S* Q59  ! n0 x" T& s& O; t: m/ o2 W
60 void TEA::decrypt(const ulong *in, ulong *out) {
9 S- N" L& D7 X# s61  
9 y- k. j8 p' h" f' ^62     ulong *k = (ulong*)_key;
* M3 d" y( ]3 V5 T( K/ _' {63     register ulong y = ntoh(in[0]); ; R$ ?5 Y/ ]3 a+ a: a
64     register ulong z = ntoh(in[1]);
3 Z2 d( o( q6 S" C% k65     register ulong a = ntoh(k[0]);
/ k& q# d; w( L# Y+ @! B* ^66     register ulong b = ntoh(k[1]);
/ p# ]8 x$ Z' n; D6 N; n. B+ k67     register ulong c = ntoh(k[2]); * F5 F# D' I$ }. E% v' n5 N
68     register ulong d = ntoh(k[3]); . c5 F9 Q) o/ h/ i+ h1 ]
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
3 ^' J6 p: A6 Z1 a* d8 n70     register int round = _round;
) U% q; Y" z  p71     register ulong sum = 0; 8 }$ |5 Z( Y" a$ Y! ]5 d4 f
72  
9 f; \( d! U# q  l% a2 ^4 c73     if (round == 32)
# T) _, }- T( J% F3 w2 k74         sum = 0xC6EF3720; /* delta << 5*/ . C6 V' c: S3 k/ _8 n$ k0 y& _. ]1 h" f
75     else if (round == 16) 6 B' T" P. |6 ^  Z8 {0 T. v
76         sum = 0xE3779B90; /* delta << 4*/
% C4 H" @1 r) z% k3 m4 ?5 I77     else 1 ]1 h: N, W4 @1 d6 [& \& o
78         sum = delta << static_cast<int>(logbase(2, round)); ! ]" S! d1 L3 G) O4 H
79  - F3 B; B& n+ \
80     while (round--) {    /* basic cycle start */ # ?4 S3 r; V* q& J( ~
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
4 K9 K5 p: G. X* y' t82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
# d" A# W# o* K1 v: r83         sum -= delta; ( L7 o6 g( l; L
84     }    /* end cycle */ ( O$ H- I+ [, Q5 c3 v- @1 a- Y
85     out[0] = ntoh(y); : C$ e. @( O2 I* _# [% x0 R
86     out[1] = ntoh(z);
0 z8 |0 K: R" Z7 M+ r' }87 }
9 Z% F6 ~5 u5 i6 l! o5 M- C4 ^" y5 B4 H
需要说明的是TEA的构造函数: ( V+ X* o+ F6 |5 A
TEA(const byte *key, int round = 32, bool isNetByte = false); / N3 o4 P( q0 o$ H, J( H$ U6 c% [, @
1.key - 加密或解密用的128-bit(16byte)密钥。
! E8 s0 h' W$ f! A1 ]1 N7 W2.round - 加密或解密的轮数,常用的有64,32,16。
+ a) \7 `% @6 N+ t3 b2 y9 H2 u3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ) p1 G, n) G  }9 A8 x  m) |

2 Z4 p  M9 F% m( C  J5 z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ( X. G' H; a- g+ c2 o. B
2 #include "util.h" $ W/ `( k7 i$ x7 I1 u
3 #include <iostream> $ _& e- N( T+ v0 h4 p/ c4 q
4  
' A. `8 ]  @# U0 @' y) Y, X& z4 F 5 using namespace std; 1 M. T8 [7 b) K- l3 w6 K8 E; t
6  7 c" z5 d! N5 S- C* e" m/ @+ @' ^
7 int main() {
( U0 t3 c4 g  f' n( s& q1 G 8  & A1 ]- V' N* N9 \! J" o/ ?
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); * ]; }0 e0 A% p) g8 V1 X4 M
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 6 }/ \# y1 S2 W8 Z3 r1 W
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ) M9 \; o, B/ k2 T$ q: a! @
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
8 e2 ^# f: e8 C5 J# M, g0 e0 L13  
! {( t6 W+ R0 k1 [9 `$ q3 s# t14     size_t size_in = hexStringToBytes(plainStr, plain);
* v7 i- s. e0 l( t* U. I15     size_t size_key = hexStringToBytes(keyStr, key);
3 r6 \. i" L& {16  
+ V3 A- t4 z( Y5 B4 {" ?# C17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
) `& n8 r3 C* C2 k3 c/ o5 J18         return -1; : ?& Z% j4 I- W7 N4 C+ |( z
19  
6 E! F7 w4 H6 I+ X20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 1 j! P) @+ h( {3 J  M" {: Z: R
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; " r* q& I$ N% [
22  4 T0 u3 ~* K( G+ {6 J7 H( Y
23     TEA tea(key, 16, true);
) I8 F7 c, N. R3 k# h$ k2 j8 A24     tea.encrypt(plain, crypt);
6 q; G5 z1 U: p  s" M25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; % q- ^4 I! ?, r& r# o
26  
8 @  A" z' d. `- w, h" s27     tea.decrypt(crypt, plain); # N8 \3 F8 s. _8 k& m+ P1 N
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
: ?! Q& ^- b( R) d8 K* c+ _29     return 0;
9 z! Q2 Z. n  t30 }  O/ e( C7 @0 [% P: v: U  w
, ~. p* k2 R6 X1 B" R5 `3 x1 }. D. d
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
4 l$ d3 r% i6 b3 h7 k$ |- D运行结果:
' S/ t! I( x) a9 {2 ~- ~2 f% N) dPlain: AD DE E2 DB B3 E2 DB B3
1 ?4 T7 N& J$ p, N; @( J/ ]; mKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 7 ~6 m! Y' [4 E: O( U; I
Crypt: 3B 3B 4D 8C 24 3A FD F2   k6 ^2 R- {4 P& u1 ~. P
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 09:05 , Processed in 0.024595 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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