找回密码
 注册
搜索
查看: 37664|回复: 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轮):& E$ r6 f4 ^  f* z3 F
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 4 s0 O0 K! C! F% m
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
# X- S" |2 m" k' D3 g  z. Y之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 - s7 Z! f& w( @; x" r
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 2 Z* T1 c. ]; Z/ d
在 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. 8 n9 g6 k. i) ~# O: N5 v7 B
  2. void encrypt(unsigned long *v, unsigned long *k) { % B; D3 Q% e  ^" Z
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ' q4 y. h( h/ f5 `1 R
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ , N& ^- n8 m: r, O# |9 z) `
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */   J5 S7 n6 {3 c3 U" ~: h5 R
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    9 s/ p, ~- i- m. I+ Q$ [# u
  7.          sum += delta;
    1 a! P$ L" v$ \0 Z# C
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ) [5 {& _  D0 G5 k# ?% P
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 1 K# J  N; e: ^- G
  10.      } - o, E+ m' B& l' u; x  K4 ?& a7 L
  11.      v[0]=y;
    ; Z! V! R  h$ c& q/ h) o5 Y) i3 y
  12.      v[1]=z;
    $ |! V, }% x9 W% i& p
  13. } 9 g! D! i# P6 U
  14.   + _7 m2 h7 i- ?/ n* i( w- k
  15. void decrypt(unsigned long *v, unsigned long *k) {
    3 S# Q5 ^9 B& l. V6 b8 I
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    . f( y, c) D% x4 k3 L. ~# L1 J8 w# T
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ . `& f. T( H9 @6 `. X2 _
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    6 [6 a9 v7 j. X; r$ g. o' y
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    9 W. Z1 k. p4 |, Y$ J; Z' \
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    5 M8 g2 x  R/ F2 x# B+ o
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    + l% d6 @' B9 D" D
  22.          sum -= delta;                                /* end cycle */ # u  O( t" Y$ f. I; G9 q# H# p
  23.      } # N7 V" s/ d  C  ^) `. y0 y: i) V
  24.      v[0]=y;
      e" U( `* j; w$ j9 z& z
  25.      v[1]=z;
    % c1 U. u' o- I8 {
  26. }
    2 m& d7 M* }$ E; w) j
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 6 h3 b: S4 q2 ^2 W6 V/ l
#define UTIL_H
! ^2 J% |% Z# @3 H
) j- \' ~- ^& k0 s$ d( i#include <string>
# t# z" z% _3 ^0 ~2 Q9 T#include <cmath>
0 d7 d1 E" z8 d% ]#include <cstdlib> : n: h) a" r7 }; A) U, r3 G0 V

/ d" r8 c' l$ G1 Z$ ktypedef unsigned char byte; 4 z. f  i9 |9 k& Y1 X( P3 Y
typedef unsigned long ulong;
, S7 ~6 M. P$ w& _: }4 J* k7 V  a & J' L/ t2 l4 v( o# c$ O0 P
inline double logbase(double base, double x) { / N* g0 K8 Z) C: g9 g- k0 c
    return log(x)/log(base); % K" i0 Y* Q5 C
}
  W( B# p" i- D; s' J6 D 3 g# o$ k6 K7 I* D& M
/*   ~* Y3 d$ R7 j" t( y. r* U
*convert int to hex char.
- s4 ?+ y: _' S7 Y7 m*example:10 -> 'A',15 -> 'F'
; _+ A6 `. O& m0 g. a*/
6 O* q3 T" P2 c0 a5 n& A" C6 m1 R* rchar intToHexChar(int x);
5 h6 I4 _4 h4 T' a9 E! C/ |
. ]( Y& `. G- q6 T/* ) y9 a' ~* r2 `9 P8 K( m
*convert hex char to int.
9 V9 a* X- L) Y1 v# ]2 z; ?*example:'A' -> 10,'F' -> 15
5 b. w( {6 J8 E& N, e( a' d*/
8 d2 ]3 k. E# J( w# m. _int hexCharToInt(char hex); / {3 o! u3 j' @+ z( W% }

" i" `: S- q+ ?; f- ^using std::string;
" T- M. h/ O7 t5 |, M/*
# K3 D0 A/ T% {, K; q*convert a byte array to hex string. * c) a3 O" @- N  e7 Q  |  r
*hex string format example:"AF B0 80 7D" 3 }# r. n. n, f6 X
*/
3 K+ e1 q( d8 r$ N5 s; {' s$ D3 m& [string bytesToHexString(const byte *in, size_t size); - E! ?) ?2 }, g4 A
8 d$ X# Z8 I! g! g
/* " Q! A- R9 g: ~5 a$ k
*convert a hex string to a byte array.
9 k" a, e# d/ w9 r  H! N*hex string format example:"AF B0 80 7D" % X" C+ E( _7 n: I; y' {) B
*/ 7 t: @" O$ n9 W/ I6 |
size_t hexStringToBytes(const string &str, byte *out);
6 p% z" D- @; Z9 K1 t. h$ o
" C: I9 Z2 o: i1 h5 g#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
5 P! |4 V+ e; H1 W7 Q#include <vector>
. W% [; @: m8 s, i* r $ D5 P$ X! Y1 ^; V; D' Y
using namespace std; . L- a+ K, r  S1 f3 D" g9 ?( r, [
! R! I' h5 y4 n. Q- `4 i
char intToHexChar(int x) {
2 d2 X$ Q0 _" M; h    static const char HEX[16] = {
- S& L# ~9 v/ i' F- V1 c( b4 {        '0', '1', '2', '3',
1 C8 B( B" N" h! B4 |* ^9 D        '4', '5', '6', '7',
) ~/ u; \5 m2 p4 l        '8', '9', 'A', 'B',
/ k! S: o( Z0 v1 w# v# u        'C', 'D', 'E', 'F'
- Z! Y3 O  U- p" o# L    }; , W' p7 x# y5 z
    return HEX[x];
% d  n, X: x9 {& Z}
/ g! N2 }! t, i, N# s  t
& x$ O, L; E( a+ _- S2 Oint hexCharToInt(char hex) { ; a! e' \% R4 [4 L  q: r7 d
    hex = toupper(hex); 1 I( O. N" s( h, e4 p1 a
    if (isdigit(hex)) & e) ~$ E  c) }8 j* ]2 i! Y
        return (hex - '0');
- D& c( j% f, `+ c! G* X    if (isalpha(hex)) 5 M3 S4 T* i3 X2 B* [$ N
        return (hex - 'A' + 10); 2 D  J! K. X( e# P! ^
    return 0; # M, c/ k. Y- G2 u( ~/ t+ `
} 0 g7 T4 C( Q- x1 Z- h8 d3 A* J

4 B5 P3 G: r! o$ Y. Kstring bytesToHexString(const byte *in, size_t size) {
% o0 Q8 o3 R7 |% t3 m" ]3 T    string str;
7 s2 Q9 \7 y; s8 ?4 m, H    for (size_t i = 0; i < size; ++i) {
4 i! v  c6 V$ ~& B& M        int t = in[i];
: W; z- P) p( `6 \) l7 j) x& O        int a = t / 16; * X2 f# X1 O9 K2 V3 G4 F
        int b = t % 16; 4 L+ m4 t; `, a
        str.append(1, intToHexChar(a));
* T( M6 [+ ]+ u4 G. |5 t; }        str.append(1, intToHexChar(b)); 6 [' K: Y; ~, i0 `6 L: Q
        if (i != size - 1)
1 F  D( R. M7 C7 L            str.append(1, ' '); 0 V! j' ~' o3 C( `1 j
    } 5 M3 O/ j2 y" p: e* V% ]7 f
    return str; 7 A0 k5 e( k1 i  x* _
}
4 i1 I2 Z# ^+ i$ f3 Y* E $ A! R, ]+ X+ o. o3 X* C
size_t hexStringToBytes(const string &str, byte *out) {
6 r& A; `1 x6 P$ G" G6 T! z , p# t4 L$ F. b, z7 _- ?* K* s
    vector<string> vec; ( o, E7 v4 H& q+ |) B+ s
    string::size_type currPos = 0, prevPos = 0;
3 m8 H3 h, h. v# E; i' \    while ((currPos = str.find(' ', prevPos)) != string::npos) {
0 j5 M0 i; y# H) X9 d' u1 y        string b(str.substr(prevPos, currPos - prevPos));
4 @& O7 A% u; b+ B3 B% N1 @9 N        vec.push_back(b);
: H1 {6 B0 A4 A. A3 T. E- ?        prevPos = currPos + 1;   I; x% G) ?- i
    }
/ w) c7 X& r+ w# j, j& a, @    if (prevPos < str.size()) { / l  N" Z7 G0 f) P9 a2 X( t
        string b(str.substr(prevPos));
5 t& Z! g' ~7 K2 O& F        vec.push_back(b); ) u3 m+ e8 Y" \1 m; ]/ o6 u
    }
. o; }8 T/ T, \9 O; c3 ]  `- x    typedef vector<string>::size_type sz_type;
, k: {. r9 i1 p6 C; z" B0 B    sz_type size = vec.size(); $ [. U# ]2 u9 o3 }" _. q( {! z- I
    for (sz_type i = 0; i < size; ++i) { 4 F# k7 p$ b' B
        int a = hexCharToInt(vec[i][0]);
( l9 f* Q2 W+ i3 I# }        int b = hexCharToInt(vec[i][1]);
- r9 K# X4 q* A! ?2 ]( X+ @        out[i] = a * 16 + b;
! I; |. w6 j; [; {: z2 T! l# R    } ; K7 i0 C/ O- L& r  `, L; z. f8 F
    return size; & H+ ]7 e- T8 y/ M5 a6 M
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
+ O( Y! d0 C6 O+ b5 W. x% b#define TEA_H 4 b; j) \& c6 }
7 l8 S; q1 I/ o! m% f
/* 5 H( w; W. y3 {
*for htonl,htonl
3 g3 _. q% P% M( [*do remember link "ws2_32.lib" ; J% N+ J) ]) A
*/
* b5 O0 X# @: o' B* T( ^8 ]#include <winsock2.h> # c6 p( K3 G& ~
#include "util.h"
2 c% B& L0 G4 x6 w' _1 c
0 P) y. ?4 Y# G* B" j3 Mclass TEA {
4 k: e3 i5 v) q, J7 Gpublic: % f  H8 y) V& {9 ]: h0 Y4 D
    TEA(const byte *key, int round = 32, bool isNetByte = false);
% b; p5 p- A1 q, f& e3 H: V: o    TEA(const TEA &rhs);
8 z4 t' e* C4 ^4 m    TEA& operator=(const TEA &rhs);
; Q6 M& ?+ P6 `1 r9 Z: |; D    void encrypt(const byte *in, byte *out);
3 a! }* ?: d. k) l" `) ?% n    void decrypt(const byte *in, byte *out); 3 h% Y! e% p9 n+ E2 X9 ]
private: : A' I7 S  m% B4 f
    void encrypt(const ulong *in, ulong *out);
8 r0 }% ], z; X, L$ L    void decrypt(const ulong *in, ulong *out); ( D2 F& ~* z$ J6 a
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
# _& P' k8 N, w# M    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } / j/ `& ]+ m# w3 p; l  h
private:
+ v  Q  a8 s: `! r+ j    int _round; //iteration round to encrypt or decrypt ( w* P- i' X0 f/ N; d
    bool _isNetByte; //whether input bytes come from network . m! W; O/ L) _6 b: H1 [& U% ~
    byte _key[16]; //encrypt or decrypt key : \' e% Y9 j' y% m5 v5 q& d
};
' x  A/ u- [" V2 d6 X
; j0 q* x+ n+ z$ X/ S1 \#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
: M6 E' _4 g, T% W* R5 N 2 #include <cstring> //for memcpy,memset
1 r- q& ]0 Y- o# d/ O 3  
# _; F; j2 o) M0 X) [ 4 using namespace std;
% F0 M6 M1 Z, {! {) }; t- L 5  7 B0 a2 ?; j8 [, D; Z# T
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) / G8 e5 ^: v' P9 T- E9 A+ w
7 :_round(round) , V7 j7 Q& W7 H. b8 J% T
8 ,_isNetByte(isNetByte) { ) B$ F. }- w' v4 Z
9     if (key != 0) # D7 B9 D  C! ?4 ~; ]
10         memcpy(_key, key, 16); * |6 k) [% f( p9 ^
11     else
8 `! D6 r3 ~# X& z) x( V, G12         memset(_key, 0, 16);
4 N$ i) {2 C5 ?5 g! ~: |; d- P13 }
4 X5 s) l8 h1 a# c14  
% A+ q0 \, t7 G/ G15 TEA::TEA(const TEA &rhs)
5 I& M; E& E7 a7 R/ g: a16 :_round(rhs._round)
; m" k) `8 Q" Q: m/ A* [$ y, k$ _9 e17 ,_isNetByte(rhs._isNetByte) {
' j- Z# e( I9 y) ^7 N. ?" N7 a1 W18     memcpy(_key, rhs._key, 16);
/ x! s: W/ A% G5 ]19 }   t' A& G% _8 n9 z% \& `
20  1 c8 r0 J! c* S7 e" C) g. U
21 TEA& TEA::operator=(const TEA &rhs) { 2 L7 F1 N4 @* P/ P2 w
22     if (&rhs != this) {
) P+ a, S. W  G- H23         _round = rhs._round;
9 \' _6 z$ O& e* E! @. ^8 Q. \24         _isNetByte = rhs._isNetByte;
  n9 r+ y  ^* D  \; r# d9 u& u25         memcpy(_key, rhs._key, 16); 7 f$ r! T( T& c. @, y
26     }
$ s; y( b; j1 |& l1 ]27     return *this;
/ I& I. t/ ?3 z: ]1 }% E' L28 }
) N" ]( {  d6 ~% I' e29  
3 \" W: w. }" p30 void TEA::encrypt(const byte *in, byte *out) { / R8 D2 U$ Q' ]4 c8 o
31     encrypt((const ulong*)in, (ulong*)out); ) c' |) v* U9 G* i
32 }
4 d- ]' ^) _! m1 E/ e33  8 J% v. {4 i. ]: F) b( f& M2 n
34 void TEA::decrypt(const byte *in, byte *out) {
2 G$ Z% A& C$ A% A, V35     decrypt((const ulong*)in, (ulong*)out);
* W% l; d0 |& u4 ~. Q  S' f36 } 9 g$ L' `' `* Z, i. J( _, M
37  
& {: r  c3 e5 g/ O( q1 m38 void TEA::encrypt(const ulong *in, ulong *out) { % E, }7 C9 [; Z& p- @. E
39  2 U1 Y( z6 w5 Q: B+ c1 M
40     ulong *k = (ulong*)_key;
  m2 P4 `5 q; `3 r8 b3 x0 L4 O6 o41     register ulong y = ntoh(in[0]);
- Y0 I) J; o6 j1 C42     register ulong z = ntoh(in[1]); 9 \2 E0 z% v& e, ^# ?# u0 q- \0 E. S: s
43     register ulong a = ntoh(k[0]); 9 ^) O! Z9 `) i. o0 l3 F6 ~
44     register ulong b = ntoh(k[1]);
/ P0 z5 k' _! b/ z! Z45     register ulong c = ntoh(k[2]); 5 B6 |( K+ Y2 K" c
46     register ulong d = ntoh(k[3]);
  }& [" R, o* J" C47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
0 v6 Y5 r' }" N7 \5 ~  w% s0 d: q48     register int round = _round;
0 q3 W0 q5 L0 W5 n! W49     register ulong sum = 0;
$ y9 |9 ]7 z# m; U1 N# ~8 e50  ( O6 e- W- K+ Z) a& W0 j! g
51     while (round--) {    /* basic cycle start */
6 D, N7 y1 b- E% o, ?52         sum += delta; & Q/ d$ c* t) B6 b* D3 a' u) F" H
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 4 l9 b5 r5 n* t- }8 \& @- n: v
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
( t) V8 C5 h* P& {5 l55     }    /* end cycle */
/ Q7 a+ y& L! s# L' M3 F56     out[0] = ntoh(y);
( L% ~5 s/ W5 n0 @5 l7 e0 ~& w57     out[1] = ntoh(z);
/ i* n% ]) R. A3 k3 ~7 S58 }
8 ^, G$ d' t1 B. F5 W59  * B) T8 ^3 l+ G: o3 D2 d5 Z
60 void TEA::decrypt(const ulong *in, ulong *out) { - ]+ d# Y; A  ]
61  / N6 B  a- n: w+ A2 s; H4 w
62     ulong *k = (ulong*)_key; , `6 R9 j& O0 g7 w% M$ m
63     register ulong y = ntoh(in[0]); / j1 j) o* M  I. x. C2 |, Z
64     register ulong z = ntoh(in[1]); 7 O) X, R( m- c/ a. V
65     register ulong a = ntoh(k[0]); " A; b5 H% C' H8 u* ?# G* ^
66     register ulong b = ntoh(k[1]); " s/ s1 {* `1 N# _4 E
67     register ulong c = ntoh(k[2]);
6 G/ ~: s2 m5 h: l, ~. Z" m' _1 _68     register ulong d = ntoh(k[3]); 7 o' e. I* \- B8 g; ?4 e7 t
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 3 l% o# T" d$ Q( e5 {
70     register int round = _round;
; g3 j. L5 B& s# i5 I! g71     register ulong sum = 0; * W% l7 s- F7 l6 l0 }
72  
& q. l. J; l) A3 L+ Q3 Q; |73     if (round == 32)
2 E7 d8 n5 z6 W6 c6 N% T: J7 p' c74         sum = 0xC6EF3720; /* delta << 5*/
8 w. b2 `- O% n  w& g. T* l: Z75     else if (round == 16) / a* T& o# o( g: @, c/ t! N  w# o
76         sum = 0xE3779B90; /* delta << 4*/ + i8 ^% U1 d8 T
77     else % r; @4 |# _! O8 x. V7 X
78         sum = delta << static_cast<int>(logbase(2, round)); 3 |) y3 S" A3 V
79  
9 V; `/ }6 _  ]+ M' B6 F80     while (round--) {    /* basic cycle start */
$ w. l) I- T! O) N( O$ J' @81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
- }2 d% J( T2 D2 w/ u82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ) D. [) K1 L' r6 ?* o" s
83         sum -= delta; / Z% j# {" _1 R" |
84     }    /* end cycle */
. ?- \* ~+ H6 {+ g; @5 m; k85     out[0] = ntoh(y); + ?8 T# c3 H: ^' ^
86     out[1] = ntoh(z);
6 ^( m4 e2 T7 R0 T% w87 }6 y9 h) k! c: l; i4 D4 X" I

. O* F; @2 B' |) I0 r需要说明的是TEA的构造函数: - L% ]- I' q- [! ~
TEA(const byte *key, int round = 32, bool isNetByte = false); ) e7 I  j" n% e$ L: z
1.key - 加密或解密用的128-bit(16byte)密钥。 ; P7 X1 W' E2 f, M
2.round - 加密或解密的轮数,常用的有64,32,16。 % d, U9 v, w; ~5 g
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 8 W8 V5 T- L' i7 q' ]" x$ k
! q8 |$ g. ^. b& q
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
+ W+ @. W0 I' v# i# h" S 2 #include "util.h"
) H  P8 L) l6 H( b& B1 a 3 #include <iostream> , S, @4 f0 h0 R+ h8 G: i  b
4  8 [2 K1 q( e9 ]
5 using namespace std;
2 n( n2 P  g: k1 H4 h  z 6  ' e7 T+ x: m$ f9 b% }3 C
7 int main() {
) M/ F" u7 b+ N 8  
' Y, ^. n: y+ |! O7 i$ j4 \5 G* m 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ) [; f9 H8 @7 f4 B0 l
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
, L$ b3 P9 m6 P11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 8 E' B" M% [" X2 ?7 e# N3 `# p! Z
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
. s, O/ H* I& q( ]9 B! [13  
  f( J4 {; L  n  n14     size_t size_in = hexStringToBytes(plainStr, plain); 6 C, R/ j, e' C2 p
15     size_t size_key = hexStringToBytes(keyStr, key); * |4 v% P8 y; I. A5 D/ ^9 ~
16  & _9 \# e. w, x) z
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
3 T, O* r- a; m0 n3 o3 b. h* y18         return -1;
6 m& ~2 L& Z' w6 X6 R; i# [/ k19  
. ~/ E  h* I. p0 b. H! m0 u% t( l6 K20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
3 G- \8 n! X  x0 r: r" N  |21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ; d2 a2 [: x7 h/ f' v4 R, s
22  
+ w7 d! m+ t- J; X) V2 s2 ]' [23     TEA tea(key, 16, true);
- j0 M% y6 w+ N+ A  q; ~24     tea.encrypt(plain, crypt); . L. e% t' `$ Z
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
  M2 m3 Y. _9 Q1 V% l26  
& v% K  r- w6 L) S4 X27     tea.decrypt(crypt, plain); 4 x9 A, I4 y8 ~6 i7 {0 g2 ]3 A
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
, D( I; W% e0 J+ K% \$ H- w; J& f29     return 0; ( ]  k! p) Q& l( @+ N) L2 W
30 }, o% g$ f/ r/ ?* R5 l7 m

/ W  j  {, {8 k本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx% D2 E9 q1 k' l; {8 y# [! N
运行结果: $ a9 o) Y2 Y+ @" y1 y9 |
Plain: AD DE E2 DB B3 E2 DB B3 + C- t* i# _2 n0 m' z& ]3 i; I
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 0 R) I+ @9 h+ w3 F+ c# d
Crypt: 3B 3B 4D 8C 24 3A FD F2 0 d4 z  x+ U4 y! E
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 09:10 , Processed in 0.026587 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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