找回密码
 注册
搜索
查看: 37446|回复: 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轮):& m% q) [7 ~9 E. u' c0 f+ t7 [
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ; K$ v2 ?* M$ S. Z& u: k
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
; j) v; \1 }0 A0 y& Z7 J( ^之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 3 P9 K1 J2 f7 v3 y5 Z4 F
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
' n: F- ^/ p( s$ W' ]( C在 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. ( @- w0 t2 L/ q3 y. u% C
  2. void encrypt(unsigned long *v, unsigned long *k) {
    + c) D$ u! g* R. f
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ * L" d# z( {$ J! f4 p: z# U$ x
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    # c0 t+ i* t: z* B: b# D' `, k8 l% w6 U- E
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ # B! R5 d/ O2 u
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) V+ \  K4 U! ]" j. a
  7.          sum += delta;
    0 |7 U# l, X8 l# e- j* s, }
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    $ ~. S$ S! m7 H: V! F$ x1 \
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    4 v- J2 l+ u! a
  10.      } 3 m8 b( q: {- K0 ~% A/ ?2 \
  11.      v[0]=y; 3 Y. g1 P' e8 O" a4 J
  12.      v[1]=z; , q: {) W0 v0 h* |# l
  13. } * E( U7 u6 T8 N- o2 \' R: W
  14.   - u( }0 M6 `6 i8 g  ?
  15. void decrypt(unsigned long *v, unsigned long *k) { ! E' x7 G8 ]1 D
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    $ B' ^5 W  ]% f4 n& \
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    + u5 a8 T0 @+ ?9 r2 y, d& d
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    & [) S+ x  t, w; N. i6 e
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ " J. n* ?+ ]# A9 L9 X& ~- _
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); * W% D4 K! a! F5 ^
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); : {6 I; n1 L  {8 e6 Y) E
  22.          sum -= delta;                                /* end cycle */ . X# z( Z( |# s$ R
  23.      } 6 Y0 V6 b& f/ m: f9 M  p$ Y+ p
  24.      v[0]=y;
    0 z; l. b- a1 y/ d! J( p
  25.      v[1]=z; ( t# q2 n5 G& r! }8 a1 L2 U3 N
  26. }- G* J" V" U- @% e5 H$ ]/ i- u, k
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 3 ]  w1 H) K1 s
#define UTIL_H / |& G" P+ G; G$ l# V8 j7 P
: H; }8 H  i1 L# }- w
#include <string> , D0 {& \+ d. U! J8 K* r
#include <cmath>
3 E% k- o; l6 l/ h1 X: K#include <cstdlib> - p2 W3 V1 ~& A

# p9 R* q! c5 r, Y2 v7 Mtypedef unsigned char byte;
* A* v2 C5 m2 e1 u4 L$ _* Otypedef unsigned long ulong;
) `7 i& i1 G8 D/ ?  R& ^/ y% | / j" h3 o: F4 K7 N
inline double logbase(double base, double x) {
5 ?4 H; H0 |5 O0 D: A. t2 Z$ l8 ]    return log(x)/log(base); . P8 @/ b$ X  P! T# K# }
}   A" g7 M; N, K

8 h4 V) I. u2 j2 f/*
/ H0 R7 C5 D6 d6 j*convert int to hex char.
: E7 p( Y. A9 @  U*example:10 -> 'A',15 -> 'F'
1 n) b2 \! W# n& V5 S" B* a$ X* @*/ 7 @! X6 [4 _9 X) m7 ?( q7 f+ [
char intToHexChar(int x);
  `0 J+ @, `# F7 t7 U
( u6 Q! c" [" n# P6 F- P# p8 r& f/* ' A& }# I4 ?9 n; E+ z. j
*convert hex char to int. % S5 F: ?. U; I
*example:'A' -> 10,'F' -> 15
, u1 d  G# r2 U2 \4 t*/
# V. h4 i; z3 Zint hexCharToInt(char hex);
' k* m  W( m; f, T  t/ M & j* p' c. }: w) E" ]* l
using std::string; ) W2 ?3 \: G4 [
/* , d# r+ ~- y2 e$ w& P# C
*convert a byte array to hex string. - _2 I9 i+ a. U8 s0 j7 f
*hex string format example:"AF B0 80 7D"
+ ?1 x7 p% c/ g6 k; l% G) R' M% E*/
0 N* }% ?. b% v, g! C6 Y' fstring bytesToHexString(const byte *in, size_t size);
0 m2 ~' I+ n9 o$ R
# Z  t+ `, W4 q7 G6 H. u( a/* + w7 c: M7 R3 g) x% b7 f( d. D
*convert a hex string to a byte array. ! y6 E( @+ o' H9 i
*hex string format example:"AF B0 80 7D"
: X- i$ o9 X, A# L0 F0 o4 a*/ ! u6 p. G: a$ M& G7 Y1 ]  r8 b1 B
size_t hexStringToBytes(const string &str, byte *out);
: C# i8 l8 i0 G4 i0 `; Q " T2 y* u' q. `5 [7 X
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" * \  B3 m( K' ]& F7 h5 h( M8 O
#include <vector> $ N/ J/ ^3 X3 U9 q' d# g

, Z6 g9 l( T) u) ausing namespace std;
+ j' l+ j' {6 a8 z1 Y ; J" `; f2 A$ w4 B2 R+ w9 c
char intToHexChar(int x) { - C( ]; o7 \7 e( r) @3 a
    static const char HEX[16] = {
6 Q4 v8 R. W; ~* ?% z$ T        '0', '1', '2', '3',
* O, t; ^: \" l/ O8 T        '4', '5', '6', '7', : A0 ]0 A4 i8 ?/ A1 y* y" s3 W
        '8', '9', 'A', 'B', ' V) q0 Q, _0 E" i: \/ d
        'C', 'D', 'E', 'F'
& [# n4 E: Q( k; n    };
1 z/ Q. y" }. N$ v+ r9 d    return HEX[x];
3 z  E, @, C5 v2 @. g' I# S1 ]9 o} 5 P$ E7 o+ y2 h% Z

( t. C  J. @0 z8 d9 g0 D) h# cint hexCharToInt(char hex) {
& F9 G$ `" Q6 I  |: A, v    hex = toupper(hex);
6 e. q7 A; a* `. o0 a    if (isdigit(hex))
# p* z6 W5 ^. v- Y( A        return (hex - '0');
3 N5 h$ c4 j. |' [  i) p  K' s4 V    if (isalpha(hex)) * h, w9 ^% l( P- h$ V8 x
        return (hex - 'A' + 10); ' f9 w1 v( v2 b: v6 {! B1 S6 k
    return 0;
, n3 V) {6 g& @! }1 h: y* q' i} , t9 D) c' W* X7 o/ N
- M* g; s8 Y! ?8 J! k
string bytesToHexString(const byte *in, size_t size) {
( _& g8 [! o6 M1 u- v) q/ a. l    string str;
; F# D( e+ N4 E/ w  F    for (size_t i = 0; i < size; ++i) { . G( j8 `% M1 L: ^
        int t = in[i];
2 b4 m9 i9 R$ j! Z        int a = t / 16; 1 `$ D' X3 H( q3 w5 T. @6 L& ]
        int b = t % 16;
7 _( l/ I% C/ h6 X4 d2 z6 D# P7 D        str.append(1, intToHexChar(a)); . q. {* K, q; B1 a7 g
        str.append(1, intToHexChar(b)); ' R% x# T0 k: E
        if (i != size - 1) 7 {2 M; W) g2 [  G: S5 P2 B
            str.append(1, ' '); / A, v; u5 {" O$ A
    } / }6 l! ^; H! j0 g
    return str; , S- K" ~8 L! }- @: A1 A1 a" ^+ O
} 4 l" E5 R1 b! E% @' H) N+ \

+ K7 l" A: }1 T, R7 lsize_t hexStringToBytes(const string &str, byte *out) { % R. {" f  j8 Q1 J. y5 r, U, Q+ |
1 T, e( ]. A+ l# m. g
    vector<string> vec; 2 s; }) P) B2 D  I' D$ {8 o. d+ f7 ~
    string::size_type currPos = 0, prevPos = 0;
  S3 o6 Z& G0 D. i  v    while ((currPos = str.find(' ', prevPos)) != string::npos) {
! Y7 u& o6 A' V$ @        string b(str.substr(prevPos, currPos - prevPos));
0 M1 k- M) a9 q- z        vec.push_back(b);
& y  W- v9 q# {1 C        prevPos = currPos + 1; " E1 G! ~1 W, `# @) Y
    }
" a6 o6 @/ P+ ?" c9 R7 z' N9 x    if (prevPos < str.size()) { + q1 C, ^' |9 J* ?* y( v
        string b(str.substr(prevPos)); 1 ~2 c3 R' d) X7 p' a. Z0 @, t# p4 \
        vec.push_back(b); ' o5 a& B% k% t( b& P0 Y
    }
% ]7 p6 M7 @# t5 n    typedef vector<string>::size_type sz_type;
" }; a0 ]) W; f    sz_type size = vec.size(); ; K* p7 J+ F5 K, ]) Y
    for (sz_type i = 0; i < size; ++i) { 6 g8 w7 X/ N0 \8 V
        int a = hexCharToInt(vec[i][0]); ' K. ^, M: Z4 @3 z
        int b = hexCharToInt(vec[i][1]); . ~0 y' }$ e5 n) f
        out[i] = a * 16 + b;
2 q" s4 L0 V9 `) R* w9 c1 f& w    } ! ]5 D' W) i6 q) p( O( @$ T
    return size;
$ H( _7 {: R! w}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H   I* m- _$ x$ R* P* a& j6 g
#define TEA_H
: Q* }& T3 E( [. l' z, ` " w3 X2 i8 a9 T+ P
/* - ^+ ]" Z) l, y, _7 g/ Z# ~" L: L
*for htonl,htonl
1 w: {3 _0 R' g*do remember link "ws2_32.lib"
" i; i0 K$ b' Y( B$ Z0 H0 U*/ " l( Q0 W2 p0 E5 g& L9 T
#include <winsock2.h> 5 b1 X5 x7 w. S. X
#include "util.h"
- H! p& K9 }8 e7 K8 e $ m% ?1 _5 ~& ~/ x" F* x
class TEA {
) }- a. [- _$ X. w" d5 a' Bpublic: # a" w, w; W, {9 P+ g7 ?+ b4 a
    TEA(const byte *key, int round = 32, bool isNetByte = false);
$ R6 T& g3 P9 e    TEA(const TEA &rhs);
$ ]; f7 [$ q' K; h; Q) m, B    TEA& operator=(const TEA &rhs);
* y( p$ F/ s! Z0 m$ p7 M+ }    void encrypt(const byte *in, byte *out); * C6 A# ^1 X1 M/ c. i; Y! b1 a8 \% {
    void decrypt(const byte *in, byte *out); - ^; P9 q- P- b. B' R. @/ N5 \  \
private:
  G7 |4 `1 ?9 O, t7 R3 [8 F1 J    void encrypt(const ulong *in, ulong *out);
* Y" p) @0 {. ]; U    void decrypt(const ulong *in, ulong *out); $ ?8 ~4 t4 O5 D6 w( d
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 4 t+ Q+ a" e6 z
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
- h" O1 v+ q0 Qprivate: % g" x$ ?) c8 \$ f2 y8 P4 F
    int _round; //iteration round to encrypt or decrypt / ]( }( ]# p  w" F6 {
    bool _isNetByte; //whether input bytes come from network
" V# b- C+ q" v, P/ f    byte _key[16]; //encrypt or decrypt key ) z$ j( v8 L7 d, v6 ^6 h
};
  ?- t5 v3 j3 G5 z) }  g ; N* U& j& ^$ [- F5 p
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" , F$ P2 p# X1 |$ X
2 #include <cstring> //for memcpy,memset
  ]% N  P, a' W 3  ! @4 t: ]. ~6 s) x9 f
4 using namespace std;
) `. ]3 ~+ L/ Q9 V 5  
$ p( N/ q$ R/ R5 y% a# } 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) " \, ^5 B% u" q/ i5 M
7 :_round(round) , {0 k# w3 @* w' `9 {
8 ,_isNetByte(isNetByte) {
/ F& z/ a1 ]1 [' m1 O( ? 9     if (key != 0)
3 `7 b: E7 ^3 y. n/ G* S10         memcpy(_key, key, 16);
+ ^5 l5 w5 r/ T% L: v11     else
6 o" Y7 b: f  I% Y) {; ^12         memset(_key, 0, 16);
! z) ^( A+ g% `* {2 n, e+ s) ?13 } " C& K( v2 w4 k8 l
14  
/ R/ b1 C% S, Q- e5 s  E2 n15 TEA::TEA(const TEA &rhs) / Q# e; z& g' h# M, X4 q( L
16 :_round(rhs._round) / v/ C4 l$ T: f- {
17 ,_isNetByte(rhs._isNetByte) {
* x: U& M: d; T! y4 _  C% d18     memcpy(_key, rhs._key, 16); 9 s8 k% r% V3 r! J- p; K- p; x
19 }
+ O0 }% H: w9 X20  , n# I" D$ h' m) d6 b
21 TEA& TEA::operator=(const TEA &rhs) {
% z4 X$ `  m& B' q; ~6 n5 M. {# F8 o22     if (&rhs != this) { . d) Y; I/ s# V) X' e; S, r
23         _round = rhs._round; 1 `) x/ U: V6 T' s4 i8 i5 N
24         _isNetByte = rhs._isNetByte;
8 g# y9 q" T* l/ |9 D; y+ e25         memcpy(_key, rhs._key, 16);
2 @0 X" f! U" }0 [2 w26     } 2 d" o0 p# D8 k
27     return *this; " c  |0 Q/ N! |$ w/ H- E* }9 g
28 } : k7 o  Z4 e+ g3 y! s- A  M% ~& w
29  
' j; f! G' P( I1 Q. i, j7 k30 void TEA::encrypt(const byte *in, byte *out) { 9 R) X: i3 ?, D, z" W8 D- F
31     encrypt((const ulong*)in, (ulong*)out);
8 ?! E. C5 p$ n% A/ F1 b32 }
- j1 K3 q: u; ]33  
( N0 y- `7 z# H9 {8 _34 void TEA::decrypt(const byte *in, byte *out) {
* S- y( Z# q5 f- w  c; I35     decrypt((const ulong*)in, (ulong*)out);
' ]: f4 E4 L1 r$ ?36 } ' I6 p* S% q/ m8 x
37  0 Q( k0 b1 Q' k6 Q6 f8 P
38 void TEA::encrypt(const ulong *in, ulong *out) {
! B- l. f; q1 C8 O7 d  N( u39  
1 T* {  Q4 Z* \0 X) \0 _40     ulong *k = (ulong*)_key; 9 u+ Q) L0 |* ^4 }# U1 u
41     register ulong y = ntoh(in[0]);
$ b) c# @/ V9 M1 L) Q) O; o42     register ulong z = ntoh(in[1]); * l" [  K" k" u8 @* k
43     register ulong a = ntoh(k[0]); 5 ?  E+ H! x. S! V0 i9 R2 Z
44     register ulong b = ntoh(k[1]);
8 c$ x+ f3 R9 q; g* z8 [45     register ulong c = ntoh(k[2]);
& \: u/ E" x& m! h5 A9 E8 I. H* i: p46     register ulong d = ntoh(k[3]);
; D# G: p" Y* r; _47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
) o" F) ]3 O' s5 h% q! ]0 t  e48     register int round = _round; 1 I3 M& c( @0 j' }( w
49     register ulong sum = 0; 5 S5 j9 n/ b8 z; G3 O  _
50  2 V" X/ n) E! ]9 m- |7 A: p2 D
51     while (round--) {    /* basic cycle start */
- y$ ?" K4 m, D$ s; H/ w& f52         sum += delta; ! H: B# ~: ?$ o
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 5 j1 y' Y: r' U+ L! s" Z5 |+ D9 P* h7 r7 E
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! C7 Y5 J1 B( S1 _2 g; V55     }    /* end cycle */ - s3 o. l; E: Q7 M
56     out[0] = ntoh(y); 8 X4 k5 q# L6 X1 V7 ]
57     out[1] = ntoh(z); 7 O+ m) `6 S. v
58 } * r3 b8 G* K. g# q0 }9 _
59  
" e4 X- g# T. Y60 void TEA::decrypt(const ulong *in, ulong *out) {
5 S! `7 ~- y# [- J( c61  2 a, U+ A5 T5 w& f  Y5 q6 c" V% c) Z
62     ulong *k = (ulong*)_key;
3 s" K4 Q( M$ d( B! L" `- A* X3 g& O63     register ulong y = ntoh(in[0]);
4 R" W, v) U0 Y; S! k64     register ulong z = ntoh(in[1]); ' [' @% J* ^6 L1 D" j
65     register ulong a = ntoh(k[0]); 3 R' l) H3 X5 t: R8 N5 }' ]
66     register ulong b = ntoh(k[1]); . c+ V) f2 L+ A) L) T8 @/ r' \: K! w4 G( `
67     register ulong c = ntoh(k[2]);
' @. f% P& Z) R* X4 [68     register ulong d = ntoh(k[3]); " |6 R, W: o: J/ ^' l% L
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 0 m  F+ |7 O7 \  a
70     register int round = _round; * U6 m8 h$ N- T6 _, d2 ~
71     register ulong sum = 0;
$ b5 Q, x9 r7 L; n$ P# k* s% Q72  6 O# h. q1 C& o
73     if (round == 32)
) e2 p" n* C  [" v74         sum = 0xC6EF3720; /* delta << 5*/   c. y, D- l' E' V$ _5 d* [% \
75     else if (round == 16)   B( e7 e7 t+ l: a3 s; \
76         sum = 0xE3779B90; /* delta << 4*/
  Q: k* q8 y9 T7 M/ U77     else 5 D. S: k- N) \8 U! V
78         sum = delta << static_cast<int>(logbase(2, round));
6 }' ~% h/ J5 S3 T0 q' |79  
( d+ _4 H" r7 ]: j" G80     while (round--) {    /* basic cycle start */
7 x% s* p/ |! e: L& {1 W# t6 U' j81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);   B# d8 d) @  u. v* }
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
0 S: Q  y: U, b/ e83         sum -= delta; * U5 t( K% I6 ]7 }
84     }    /* end cycle */ % t/ n& h" z  J  H: X, P! E
85     out[0] = ntoh(y); 9 I, [' v+ V( o0 z$ X0 W
86     out[1] = ntoh(z); 3 _5 D  `9 c$ p* X: h" I
87 }& j" g- S# S- `
- ?  @+ z& K3 a
需要说明的是TEA的构造函数:
+ U# k- g& ~, Z+ STEA(const byte *key, int round = 32, bool isNetByte = false); 0 ~) l) {9 x$ F" T# L' |
1.key - 加密或解密用的128-bit(16byte)密钥。
  @" h$ ]) U" ^8 O9 p- L9 y! T: X2.round - 加密或解密的轮数,常用的有64,32,16。
/ v1 f5 @' g( b, h0 r: n3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
9 J5 y& P, e. y- }. P! P+ ]/ m$ i9 w* Z( E2 a
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 8 e9 H6 M: y3 w' v( C! \
2 #include "util.h"
5 n6 k& K( L3 l: L! ]. V3 g 3 #include <iostream>
# Q% k: S" |5 \/ `5 ^7 H( i' g 4  # A% U2 H; n# @
5 using namespace std; 6 F3 W6 B% ?0 F
6  
7 t6 U! ~  e1 D- v* C" |7 { 7 int main() {
- b" z) }; }2 h  Y 8  7 k7 i0 u* E8 V
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
; g* U, q3 R$ J: I# i8 P( t0 R3 F10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); % i* n4 W  d: A* N  n
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; & }4 a2 n' B. U
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; $ h5 J/ {  _2 x4 B
13  % w+ I9 ?- t% ^/ |
14     size_t size_in = hexStringToBytes(plainStr, plain);
/ W; v3 a' T2 y) K: d1 p15     size_t size_key = hexStringToBytes(keyStr, key); . H7 f, z$ |' d- m5 P1 o% u5 f
16  $ `7 H2 ^/ I; G5 F9 l1 Y
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 8 G7 v# c$ n; ~* H
18         return -1;
& _/ {9 @" f) S' s19  : K4 D4 d0 x1 x3 Q
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
) n) ]8 v7 b" z) b7 w. k21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
5 C7 ^8 V+ k" g& A6 F; s: E22  
: [' O* R  }" h2 A23     TEA tea(key, 16, true);
8 A0 [) X" ?9 z4 S24     tea.encrypt(plain, crypt);
+ w: M5 j  A( S2 @25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
) R; g' a  n' ^' O& n1 O3 b26  % p  p3 z5 N0 `) f; f% j
27     tea.decrypt(crypt, plain);
. S7 c/ h& {# x# @28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ) o5 i5 u: K8 L- U. e
29     return 0; 0 J2 J0 V- N% E& l
30 }
- b" [" M+ F$ h/ R( I2 _9 Z; c$ y  T8 L8 S' q* w9 O, Y
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
% L# Q& ?) m& f. F) n2 A运行结果:
# L0 I5 H' x1 I: r$ V& OPlain: AD DE E2 DB B3 E2 DB B3 0 R) x1 ?0 x% T2 m3 F
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
+ H4 e' x7 d( q8 v$ f: aCrypt: 3B 3B 4D 8C 24 3A FD F2
% Q/ S. L4 u& M4 u5 k, V9 hPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-17 21:42 , Processed in 0.019849 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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