找回密码
 注册
搜索
查看: 37751|回复: 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轮):
/ a) a4 H7 g1 v, s微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 4 \. H- l2 q  n, e: Z
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 0 b, v* N' f6 m: v3 ]
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 1 o; l/ l' Z0 \/ b/ d& `  W
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 6 B6 |( G8 R9 A  ]
在 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" O7 ]( b0 W% d  u$ D
  2. void encrypt(unsigned long *v, unsigned long *k) {
    1 D! W" i. S& z) [: a. ?4 {
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    2 ?2 h4 r; Z" y6 d5 E8 [
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ , r/ t% C* {- p4 P8 W" K
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    2 i+ B1 v5 n  S1 @
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 1 e: q. E+ |9 J. y! ~
  7.          sum += delta; ( H, N3 p) G; ~: Q: W
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ a# m5 c) I2 e7 Y3 r
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ! j( \+ X2 G- W* a/ C2 C7 M* P
  10.      }
    0 ^7 j# W8 b' `) k" j, M; x$ t4 u
  11.      v[0]=y;
    + g: [* ^# g) \7 d2 J( ?( q
  12.      v[1]=z;
    / Y9 |  R9 z* f, b" q( f6 H9 K
  13. }
    9 w, Y% y: Z# X
  14.   ) A% f8 @+ O1 w2 O* k6 d- c3 p- l! R
  15. void decrypt(unsigned long *v, unsigned long *k) { 2 N, l  d1 B/ ]2 A4 o) t5 W; i% S
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    & _) v9 [2 L, d) E
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ; {0 h  K% u- s  v
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    , \- _1 t" J- G+ v, F$ [
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    # C6 r" o0 \, t/ h, O: G" M
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); " T' E" m4 g" e/ L3 Y+ F
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ) ?% Y; H+ G7 h, _( g
  22.          sum -= delta;                                /* end cycle */ 4 T% S, \$ J% K; g$ I
  23.      }
    4 [& ?4 Y/ x# }/ j4 m
  24.      v[0]=y;
    % v! a' o1 p8 i3 f8 L: G1 G
  25.      v[1]=z;
    2 j8 @% w& b) w# U1 o) L' ^5 Y
  26. }9 B; e6 H; [) V, o' C5 B. {
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ; S. a$ M+ R0 \; C& d  U
#define UTIL_H
1 F( i# @, P( I* ~1 i; p
- f/ D6 g' ]- _/ A#include <string>
+ A. J* r. Z/ v" s- D$ R) X# v; v#include <cmath>
7 `3 }% }; A# G0 p#include <cstdlib>
/ ]! l* P& ?, t6 K9 R& e  j
, c1 \& H! u" ^2 v3 xtypedef unsigned char byte; 6 v' L+ {, G$ q
typedef unsigned long ulong; - U5 l6 ]% \' m+ e" i2 D: Z
4 y& m, j0 ^( L) o" b1 i8 E
inline double logbase(double base, double x) { - P4 m/ s) y" ?3 D8 n
    return log(x)/log(base); 8 J2 q; `4 F) v* t" z1 `+ v
} ) ?& _. |2 S+ q( P" x

3 E  Q; x, b, |8 p5 E' m6 \! u/* ! O8 t# i3 d1 F, c! H2 B
*convert int to hex char. * e6 g% A7 o7 c+ M' K7 v* x: W
*example:10 -> 'A',15 -> 'F' + I& {1 y2 A& \: c
*/ $ t% d; s, B/ K! o7 S
char intToHexChar(int x); 5 k: _/ j3 p. u7 F
! w6 M, k1 H4 G+ D8 ^1 `
/* ' E( k- K0 ~2 l; \1 {8 h$ ^
*convert hex char to int. + m$ d0 m4 G- T' G2 I( I" g+ z
*example:'A' -> 10,'F' -> 15 6 _  y1 S! M+ q7 v! E- ^! x' d
*/ 3 H7 S. P: U$ r1 {
int hexCharToInt(char hex);   |9 x4 C* p! B6 V/ e
3 K* ~& K0 M0 ~0 _
using std::string; 7 j: \( _3 z! T: t# u
/*
5 B* a0 ^/ C$ s9 v*convert a byte array to hex string.
3 H% G% h2 k! U" L" q# s% M*hex string format example:"AF B0 80 7D" 5 s$ B- S( z9 w, {5 \
*/ 4 t1 S- v: O/ n% C6 R1 E" {
string bytesToHexString(const byte *in, size_t size);
/ Z* Q9 e8 M! e: O  a0 c- X! d
% l# ?- E% J% N- x2 p; Z/*
# U7 ~+ K% u7 `; Z$ k*convert a hex string to a byte array.
' m6 S, @4 d0 Z$ V*hex string format example:"AF B0 80 7D" * i+ u, n4 T' e9 M9 P. f. B9 Q
*/   h2 W/ G% t, B* t, ?. Y) H
size_t hexStringToBytes(const string &str, byte *out);
/ v. o4 h( a# T1 X7 \ ( c! ?) Y, P4 @# M8 i2 S" Q& w
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 5 ]- [% R* T2 q- F
#include <vector>
, U. K/ K5 W+ D7 M1 [ $ n$ W* G7 T0 U  Y
using namespace std; - r! L- L2 C* p+ s/ o9 s

0 F( ^9 I! P6 E% n0 ]: Nchar intToHexChar(int x) { 4 S0 ]0 z, Q: G( U3 R" Y
    static const char HEX[16] = { 7 k/ X2 M0 n) P! t9 H& Q( Q  D
        '0', '1', '2', '3',
/ g: Z4 C8 I5 {+ P$ f) [        '4', '5', '6', '7', 8 C3 m- \& ?7 n* R4 ]
        '8', '9', 'A', 'B',
" L9 T, I/ O) S. t6 Z0 V        'C', 'D', 'E', 'F'
7 y) T( U8 V4 U6 J6 U* w    }; 2 j% m1 o/ x! m3 y. m
    return HEX[x];
# z! v  [3 W- d' u& i1 O$ O; g) D% j} 9 H. h* X" {0 j4 r
) A& y8 G3 w3 {, F# g
int hexCharToInt(char hex) { + p. m: h) A& v+ f2 C
    hex = toupper(hex);
7 R4 C" Y& ~  [( |. u: V( g    if (isdigit(hex))
% V' e/ R6 n/ J7 D& r1 i5 k1 P        return (hex - '0'); 7 ?& r# Y7 R; c- b
    if (isalpha(hex))
4 N3 l! {2 V* O- `        return (hex - 'A' + 10);
! X# e2 w3 i7 g9 D) G# e5 d    return 0;   a! i7 A3 \: a( Z8 E
} ; t, W( U. X* n& H
+ ^5 M- Z; S" T
string bytesToHexString(const byte *in, size_t size) { 8 B* J1 H: P& P
    string str;
4 x$ o& X: ]) X6 A: n! l& _2 G- [    for (size_t i = 0; i < size; ++i) {
5 h9 p, x+ I5 J4 T        int t = in[i]; ; e" F' r5 U" R/ _
        int a = t / 16;
+ t3 t0 ?7 r7 [1 i$ ]! ~- v8 w        int b = t % 16;
( P" _& b+ ?% a) v9 |4 C3 d/ X& z        str.append(1, intToHexChar(a)); . ~4 g7 ?( B: n
        str.append(1, intToHexChar(b)); 0 [2 f$ U9 ?" ^/ @+ d; |
        if (i != size - 1)
1 Y6 w( L! n1 O9 B* w8 u            str.append(1, ' '); " k# p' L7 \: ?7 H
    } 3 ?3 R: h2 j% g3 w+ ]& l: S
    return str;
+ b+ v3 ~5 R: b3 S( V. E9 N! L} 3 S# l! ^8 S7 i$ H
" O0 B1 ]! a2 \- _# q9 R" {
size_t hexStringToBytes(const string &str, byte *out) { 2 o/ X9 o: c+ c7 @
5 D4 U7 i& v! y, I" j
    vector<string> vec;
+ P8 f1 W8 k, W    string::size_type currPos = 0, prevPos = 0;
# I7 E; z" v9 @* ~$ l    while ((currPos = str.find(' ', prevPos)) != string::npos) { * j* \: O1 p/ {  P6 ?
        string b(str.substr(prevPos, currPos - prevPos)); 0 P7 O0 z9 s8 F0 W: O
        vec.push_back(b);
6 c/ ?: D- ?9 b8 X% N        prevPos = currPos + 1;
2 p# R9 j  v( ?0 B# e: x; z0 g! X    }
9 r1 ]( S& R% X% e6 x: ]& u/ d6 C    if (prevPos < str.size()) {
# ~' ~/ K1 f# L' I0 V: @        string b(str.substr(prevPos));
2 X0 ]- D' y9 F2 r4 g        vec.push_back(b);
4 G  L: X3 `% {5 r, m$ U    } " A$ U3 ^! X7 A2 C( I' [; c
    typedef vector<string>::size_type sz_type; / L' ]! Y3 ?9 w; t0 u
    sz_type size = vec.size();
0 o' y/ y0 ?) F; _    for (sz_type i = 0; i < size; ++i) {
; w; i& [- h5 V! V        int a = hexCharToInt(vec[i][0]);
! f( R, ^4 R$ R0 C        int b = hexCharToInt(vec[i][1]); ! J: F& @1 p8 t, f2 x. M  y6 j3 v( u
        out[i] = a * 16 + b; : ], l. S+ w1 Q. N5 x3 |' `5 ~+ u3 d
    } ' J: D; y( p6 L/ W
    return size;
/ a% A) k* q2 x% z}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 5 q* c8 Z9 t0 y8 ]
#define TEA_H
2 I& W. u$ A! _1 ^" s 6 Y! O6 |* O  D8 N0 T3 l( v
/* / Y, e4 O4 x( P- L- X
*for htonl,htonl
/ b  d5 h  d$ f*do remember link "ws2_32.lib"
* N( {  y- c3 c1 J: w*/
& n6 }+ l3 q  F3 ~#include <winsock2.h>
$ g$ }1 ?0 C. z9 C: m#include "util.h" 2 d4 ^, {# r# H, \4 ]2 w

: A; r( s7 O) D$ Zclass TEA { 4 K. G2 @/ a6 M/ l# r8 h5 B
public: 6 U2 C9 M3 a  F. D1 x6 f$ s) B
    TEA(const byte *key, int round = 32, bool isNetByte = false);
( x2 ]: M+ Y- s) j. h. E8 u7 p    TEA(const TEA &rhs); ( t5 z4 r# J7 n7 O
    TEA& operator=(const TEA &rhs);
1 Y2 F: X5 H. y, p0 n5 I    void encrypt(const byte *in, byte *out); ; H* b& q, i4 C+ L- g
    void decrypt(const byte *in, byte *out);
( [: k; d- y4 s, Cprivate: 9 j2 V8 Y! t. }
    void encrypt(const ulong *in, ulong *out);
- n  g# R) S* g- F1 k# I3 J    void decrypt(const ulong *in, ulong *out); ( V- r4 l" E* ]+ k
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 9 g2 [+ [  Q$ j% G
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
5 J: w  S' p1 Q4 {/ X5 Tprivate:
7 X# h/ x4 g  }. b    int _round; //iteration round to encrypt or decrypt
! ]. L3 h: r% D( n0 i    bool _isNetByte; //whether input bytes come from network
* l& U2 |0 u+ m& r    byte _key[16]; //encrypt or decrypt key
1 Y, Q, _! ]6 I- t0 B, Y5 p}; - r; P' W) z2 [- _
; y- f  P4 L* B* K5 o
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" # G" L; e7 I, C; A8 W, f: w' L
2 #include <cstring> //for memcpy,memset 9 e) x8 f. X8 W
3  3 a: O5 }1 O" u5 s
4 using namespace std;
. W: g( q. J; Q  q9 j. ` 5  
3 d  v4 t4 h) j$ k 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
: c( y7 M$ u- s/ @ 7 :_round(round)
' ]1 M; R. i& q8 y* y 8 ,_isNetByte(isNetByte) {
" ^# T! w7 e' j+ P 9     if (key != 0)
1 \& O. l' X/ g* q; K6 f10         memcpy(_key, key, 16); & p9 H2 ?6 ?( y$ a6 v
11     else " t2 W. y( D; @8 t# f; K# e, w* \
12         memset(_key, 0, 16); 2 C  }7 S2 B7 {4 x
13 }
% N+ L0 ?3 l+ J$ q! Q' j9 [& S8 h14  2 J9 O" K2 J- N2 l1 J5 t
15 TEA::TEA(const TEA &rhs)
6 P: d4 R! A, f7 ^& x: v& B16 :_round(rhs._round)
' J1 N1 R  \& W& A: w17 ,_isNetByte(rhs._isNetByte) { ) y; H8 M' v# @0 ?" O7 c. }- N
18     memcpy(_key, rhs._key, 16);
) O$ p7 m* n$ ~$ ^; z19 } , V- h" L  _& b" x7 n3 q. W
20  
! t7 z& Q# |+ u, B) e21 TEA& TEA::operator=(const TEA &rhs) { 2 w1 U% W# H1 k& c/ a
22     if (&rhs != this) { 7 X) C# A* d: Y" f8 n& Y
23         _round = rhs._round;
# }  S- m# s& m24         _isNetByte = rhs._isNetByte;
. }' L4 _0 d/ ^; \25         memcpy(_key, rhs._key, 16); ) e+ V7 z3 ]- J/ y
26     }
9 O9 ?1 e6 Z  S27     return *this;
$ D: D' {/ L5 E+ w. e9 Z28 }
6 u% `" E- x- Z4 S9 n29  
2 ?; Y& l9 R$ b4 M$ ^30 void TEA::encrypt(const byte *in, byte *out) { 9 s! w& h* F4 W7 E7 N3 y4 U
31     encrypt((const ulong*)in, (ulong*)out);
* J. |  J. J. X# I3 X2 m32 } . j! }# ^0 m& P) K9 E  E
33  
- |9 s) y: D3 a* R) ]' @. V34 void TEA::decrypt(const byte *in, byte *out) {
% J) f/ s3 D4 b8 {# A: {8 O35     decrypt((const ulong*)in, (ulong*)out);
8 |5 w4 C5 ~+ p8 i+ t36 } ; v* L# O% K, D1 j6 c5 H
37  
- X; k+ S& r- r$ k! w  i) y38 void TEA::encrypt(const ulong *in, ulong *out) {
5 K0 i/ N$ L# I, ~: W' ?, t39  ' \( p& ~& o, ~* l- \
40     ulong *k = (ulong*)_key;
$ a4 N( a5 m( q; K' _* J& i% Z% C41     register ulong y = ntoh(in[0]); 4 J; ?7 N# r; c" O6 {6 y4 w
42     register ulong z = ntoh(in[1]); 7 @) [3 a8 Y: i( B# X% C7 m$ s
43     register ulong a = ntoh(k[0]);
- v5 m. v/ T* `6 V8 d9 _# W1 B44     register ulong b = ntoh(k[1]);
: M; K' Q) K: E4 G& B45     register ulong c = ntoh(k[2]);
1 R& H: u: G! @. {' r46     register ulong d = ntoh(k[3]);
( `  K" A: b0 {7 C) r! K- p47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
; T- ]: |$ E3 @" @6 u48     register int round = _round; + ^7 u4 I" h7 Y$ a
49     register ulong sum = 0;
7 Y  N4 E$ ~/ q+ J( t" u7 {: z8 F50  2 ?/ ^2 Y/ \% `7 y
51     while (round--) {    /* basic cycle start */
  b+ |5 R! }! `! C3 S# \( P52         sum += delta; $ J2 `3 ?4 o! B* O, a$ ?) R
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); & t7 s$ H8 z( E" ], b
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
7 U9 s8 n7 t2 f4 U55     }    /* end cycle */
/ ]' v1 l+ d3 d0 m1 N. a56     out[0] = ntoh(y); 5 C* D5 t3 J- p& G. d! Q
57     out[1] = ntoh(z); 6 g; N! J+ C" L7 k4 f
58 } 8 _/ @( Y0 d  R1 s
59  
: ?% F7 M3 ~7 P( T1 a60 void TEA::decrypt(const ulong *in, ulong *out) {
( n) {/ d& k, x9 A9 T  t/ L61  ( p; C: o2 j  w, e: {- @" @
62     ulong *k = (ulong*)_key; 8 J) F( g9 s7 H# [4 s. u! I+ g
63     register ulong y = ntoh(in[0]);
" R* @$ O8 k* g! V: t; {64     register ulong z = ntoh(in[1]); 4 A& E4 s! I1 q# m" V
65     register ulong a = ntoh(k[0]); 0 Z5 \3 g( A" D' x4 ^: g
66     register ulong b = ntoh(k[1]); ; ^: G( |6 t$ \# u. C
67     register ulong c = ntoh(k[2]);
' _' h* e( p* T* T! u8 q68     register ulong d = ntoh(k[3]);
9 V: U$ O& o( Z& |* o5 p4 U6 L- j69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
  h* i: S+ I) q, A. p70     register int round = _round; ! |$ r1 @6 t: Q: j/ x
71     register ulong sum = 0;
! z/ L) o# N; ~7 ^72  / X6 q' p' H! h1 F  y  Q5 i$ f
73     if (round == 32)
' q- P& x! Y/ e. [+ D, g- c74         sum = 0xC6EF3720; /* delta << 5*/
% _* `! z+ Q+ Q; d2 M9 r75     else if (round == 16)
$ e- x5 c# F- |76         sum = 0xE3779B90; /* delta << 4*/ ; X7 A: Q  E( D' {+ R8 N3 K
77     else & v7 G3 t0 K* v' v" Q& H6 r
78         sum = delta << static_cast<int>(logbase(2, round)); 0 Q6 X- S: X/ O
79  
5 B6 s  {5 I: z) B3 i  K80     while (round--) {    /* basic cycle start */ $ O( A( }2 I5 v9 v  u  x
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
) r% M6 s- f- x! \. D  I1 \82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
. F! w1 m3 i  C  k. N+ n: O83         sum -= delta; 6 x4 U: F& K" D
84     }    /* end cycle */ 5 P$ O. r# A- ~' T% Y
85     out[0] = ntoh(y); 3 }4 ~  B8 q% U! Q( I
86     out[1] = ntoh(z);
1 D- T, X! l. l+ H7 c87 }
* L9 e. S2 I& m9 t+ i% v! ]
2 W) c% N/ F0 ^4 l6 H5 P! h2 G需要说明的是TEA的构造函数:
, u  q, a: x$ n8 \0 TTEA(const byte *key, int round = 32, bool isNetByte = false);
8 i# n8 h; Z# L! M% H1 B1.key - 加密或解密用的128-bit(16byte)密钥。 $ b/ d& X1 _* [. ^$ m
2.round - 加密或解密的轮数,常用的有64,32,16。
3 d+ z3 t$ N( f8 F# `7 s3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! : Y0 b6 Q, ]5 c6 |+ b
3 S9 f8 j. Q. {3 ?+ L6 j
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
" n/ S8 N9 J5 L: }! V 2 #include "util.h"
/ [; W* J: b) W6 {/ Y3 V 3 #include <iostream> + f& r, Q$ S. B5 l( a2 [1 Q
4  + \4 }6 n. |8 ^( @# F9 U
5 using namespace std; , q3 F) ?2 m+ x( K" U* W
6  # y+ e5 [. {; o# A0 h7 b
7 int main() { ! W" L) c9 X# l8 q, z, u
8  
1 X3 \/ R  |2 R, [' k% j  s6 Z% [- ^+ k 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
2 c) `: p- C. H9 |) G  \10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
: T7 R3 ^5 ]2 o5 ~: p11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 7 `0 K+ R6 {, ^$ a! j
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
# P3 O: Q1 ^' W  U' P* B' j13  - j5 G: |, U1 Q4 M
14     size_t size_in = hexStringToBytes(plainStr, plain); 8 D- t8 L9 O) c0 E& q3 ]
15     size_t size_key = hexStringToBytes(keyStr, key); ; k8 ^0 E/ [* F/ r
16  5 X1 {/ s) U3 d& `% D7 Y- j7 m8 }4 y
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
5 b& [* G% C. w6 ?8 g6 x18         return -1; 0 T: H% E) F! b7 W" I  d2 ]9 }5 ~
19  ! b& @0 @; i6 \8 r/ w
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; & I" I# t3 t( b, I# S+ u
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ; y; {- X9 J5 g9 Y
22  
: Z1 r/ ~" H& P! Q! U4 G23     TEA tea(key, 16, true);
9 h9 |! p# @% F24     tea.encrypt(plain, crypt); / v' n* K) i4 }2 a8 F/ }1 w
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 9 ^7 t* L& C% Y8 _7 [4 Z0 E$ n
26  
' e* L0 m3 P. R7 v) o27     tea.decrypt(crypt, plain); + w5 L' G, Q9 Y* W$ ]0 P& l
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ; L) H' ]+ @) X& X( W
29     return 0;
! ?) B  M7 [  i( S( U  e30 }/ j, G, v# ~% @8 n/ o

  Z) k3 ]$ Q) w' c! q3 p本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
/ u6 B* f  k; e' L运行结果: ) `2 _" C# n* t6 |
Plain: AD DE E2 DB B3 E2 DB B3 3 W" E' K1 U5 l2 W8 H5 `
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
, i' I# a& y+ H, TCrypt: 3B 3B 4D 8C 24 3A FD F2 - A" U1 Q2 U& \6 j. k1 s
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-20 15:04 , Processed in 0.023102 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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