找回密码
 注册
搜索
查看: 37568|回复: 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$ u; Y/ q' O3 ]" f: T3 S
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
# L/ q* K% B8 n- [7 NTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
9 i. W& N- u$ Z) v* v! @之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 , @- S* w/ e4 }' B! d2 H4 a
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - n3 ]- p; L# [
在 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. , w! c- N# y6 r, ~7 ~9 i  k! w
  2. void encrypt(unsigned long *v, unsigned long *k) { 5 [4 u7 C& k/ a# w; M3 s" S
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ " {" ^& L) t; n' @3 _, O  Y4 {
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 8 t% T* t; p0 p/ P6 L1 Z
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 4 [8 j2 a& Q$ f
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */   D2 Y, J0 _+ o$ A: B, |3 t& j
  7.          sum += delta;
    , v+ ]- x: s, W& ^
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 1 f, F) Y$ N( O1 A% y7 M$ h
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    * x) r0 `, n! G  r# f, t& P/ D. b* B" J
  10.      }   R3 K4 V0 D% U2 w+ a% D* C
  11.      v[0]=y;
    9 e. r2 p+ q! J9 t8 p& O: D) x
  12.      v[1]=z;
    1 v( _3 C8 x; P/ K3 C: G
  13. }
    , n; P# m. U: |3 v1 E
  14.   
    & `' l+ P$ I* q, L( i
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ! d1 e3 p2 S* F7 A, X: G
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 9 V0 i# \6 y1 k1 _( F3 n1 s2 [
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ & F# w- D8 L* M
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    3 o# X4 Y/ I# c; N% Y. `1 f9 @0 w
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 1 g5 P; t+ g- E: h, f3 }) s2 w  ^4 O
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    , o0 ]4 r1 h# [, v* n9 T: A
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    0 K3 S7 _- k0 R: H: x* \
  22.          sum -= delta;                                /* end cycle */
    . P. B* C% W& P" l2 t6 p, u
  23.      }
    & q& F" i7 b) ?9 R5 N& q
  24.      v[0]=y;
    9 a$ z+ W- w8 t8 ~" J( V
  25.      v[1]=z;
    + U# n# v& o3 J5 ~# N* L# r8 ]
  26. }" Y& A9 x7 @- ]8 m+ a
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
4 U0 }+ S5 C% i7 q9 t) F- n* ?#define UTIL_H 6 [  U& F& t3 {4 f0 {5 {) k
  x6 q: Y8 S, r& X8 {' _
#include <string> & T1 q8 A4 T0 a0 }- j; [# h: P3 d( |
#include <cmath>
+ T( t2 X  o7 m8 ^$ R#include <cstdlib>
  T& o1 \, t7 P- ^ . a  p* e: |! L7 @2 f8 v3 n! X4 ?
typedef unsigned char byte; ! r& e! c& Z( z7 W. Q/ H+ m
typedef unsigned long ulong; # [; v# C! n" C

/ \% ~) b% O- ]% Finline double logbase(double base, double x) { 5 Y) g+ u0 ^1 V' {9 i
    return log(x)/log(base);
6 x% f$ i# V9 t# s( C1 X} & X9 k9 H' C5 P% p  X4 Z/ [6 P

1 c0 n" Y  E: z! k9 t! K/* 3 T, i2 t; Z% V% ?" A0 n. N) j
*convert int to hex char. 4 r2 ~' T% o$ E
*example:10 -> 'A',15 -> 'F'
- d- C+ q' f3 y/ @# }2 A*/
" \) `7 T( q7 J. m" Pchar intToHexChar(int x); ; }$ ^5 w! \" r! I  c

2 h/ F5 }% O# s6 f+ o1 _4 N1 {/* 0 X2 e# [* }; n# y
*convert hex char to int. 5 R% @* R7 u; G
*example:'A' -> 10,'F' -> 15
6 S5 g8 M* H! U8 [; J*/ ) E" O7 E  c1 q) F% c: H9 s! T3 z
int hexCharToInt(char hex); ! }( a' o6 {7 A

2 n/ ~- N$ q1 p9 I5 G* vusing std::string; 0 }# N( }, l/ `8 m- \
/*
# ], j: F+ }& h% b  e4 [4 B5 C*convert a byte array to hex string.
( x% H1 l; K" ]$ U2 `- H: p*hex string format example:"AF B0 80 7D" ( i& K9 m! @0 c
*/
- P- q5 `5 {9 M2 f0 y- Qstring bytesToHexString(const byte *in, size_t size);
5 ?1 x0 L# W; k3 @; Q  O) D
5 J! d+ F/ k7 C  ~2 T1 t- H+ N/*
" o. T& L1 k' |( v*convert a hex string to a byte array. $ l; I% Q. k* @' q; _
*hex string format example:"AF B0 80 7D" ; Q) l8 w1 m$ }- Z+ K8 s  M, u& n. d/ }
*/ 6 y# F% g) `& }7 H
size_t hexStringToBytes(const string &str, byte *out); ( C( y5 [! e% d2 Y/ j* f( M( b1 x

3 K8 X* M# Y( J* [# o* {4 S( h#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
7 z% J; @/ A/ M6 d  {#include <vector>
3 d1 n! V( `6 {- O) \2 N( Y  R " M" r" G$ a1 T
using namespace std; 4 u4 y9 I# Q/ ~3 ?# ?2 |
* x& Y- o* q+ s0 n" ~
char intToHexChar(int x) { ' h* q( j' h3 E2 v9 h& Q. |6 o( m: z3 b
    static const char HEX[16] = {
' {  \8 C4 r: n+ U2 E5 V/ I0 Q        '0', '1', '2', '3',
0 K  F8 w- n/ Z& D        '4', '5', '6', '7', 6 y' S  n. N+ Z0 O: B' ]
        '8', '9', 'A', 'B',
# c2 n( F2 h! H  `- O; c        'C', 'D', 'E', 'F'
% `" E0 l) ~1 V    }; 6 H4 c' u3 P, D8 ^+ h
    return HEX[x];
) V- _0 R, k* }% {& x; R} $ Z( C' s/ z7 R

$ P6 F3 t0 K  X$ H# ]( Wint hexCharToInt(char hex) { 2 y$ U8 `9 a  v5 D" D& u+ K
    hex = toupper(hex);
: F% m2 k) w4 A    if (isdigit(hex))
" \0 J- s4 }8 H9 O8 f, L        return (hex - '0');
4 j9 k. J6 [/ p; g    if (isalpha(hex)) % K9 M3 s; {$ d2 A! U1 o, j6 H
        return (hex - 'A' + 10); ; M7 x5 @+ S, D* u7 n
    return 0;
' k: i3 M! I# R% p} ! H3 j) v  _7 K4 @% F

% j) L' e: H& r- ^" K0 x, cstring bytesToHexString(const byte *in, size_t size) { " n/ I; k' E/ C* D4 R
    string str;
; o- M& b5 A( u5 N* N- J9 t8 J, U    for (size_t i = 0; i < size; ++i) { ! m( ~4 ]9 H: m4 S
        int t = in[i]; & [' Z$ S7 Q  V, ]$ i8 M3 p" E
        int a = t / 16;
5 I+ j; j2 V$ H        int b = t % 16; , c& R' l8 w! E1 n
        str.append(1, intToHexChar(a));
) }& J- g7 e; e: a6 s4 @6 d, X; a; Q        str.append(1, intToHexChar(b)); , w9 }3 f4 Q3 w" ^; N5 L8 r) g
        if (i != size - 1) ( W5 k$ t7 M* K$ r! b
            str.append(1, ' '); ' g( x& T. a" A5 ?% k
    }
8 v$ C- \; q8 k    return str;
9 r  W5 Q6 I8 G; N  t} / c2 y1 B: n/ {2 M4 g

" N2 W% N& D2 x. l/ Msize_t hexStringToBytes(const string &str, byte *out) { : f/ ~3 S. D0 _- L
0 G4 U- p7 z. W# N
    vector<string> vec;
" ^5 m' d+ L4 X3 ~4 x    string::size_type currPos = 0, prevPos = 0; # y8 r) `5 }0 i' |0 c% |2 k
    while ((currPos = str.find(' ', prevPos)) != string::npos) { , l/ k- Q: S0 x9 A
        string b(str.substr(prevPos, currPos - prevPos)); ( S1 V% |3 j; L: A: W
        vec.push_back(b); - C2 r  F+ J7 G  S8 E. P
        prevPos = currPos + 1; " m$ D. h# w6 x$ w7 y* r
    } 7 k% r! o  \; {- A
    if (prevPos < str.size()) { " U- {- s; u1 q
        string b(str.substr(prevPos));
; t0 }$ Z  X8 M        vec.push_back(b);
, M" a" ^4 p+ f  S$ D    } ( X- x7 n, O( ]2 O. }2 N
    typedef vector<string>::size_type sz_type; ( z# n1 K. |4 C) {
    sz_type size = vec.size(); # c! r2 p; @3 O1 ?5 \8 [
    for (sz_type i = 0; i < size; ++i) {
2 y+ D" T; V7 F5 o5 W: P7 c        int a = hexCharToInt(vec[i][0]);
& j6 A; O0 g) ?0 Q        int b = hexCharToInt(vec[i][1]);
3 J/ b# s$ O3 L. s, }5 O        out[i] = a * 16 + b;
5 M$ e5 U2 K. H* m$ D    } $ _' W% L8 x$ b* f, p
    return size; - j6 i1 C8 \& {5 e  B2 U
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
) H# k* ]) v3 A+ x- y: ]#define TEA_H + r, H( R  E% y9 D. g% T0 x4 T4 p

' u( f3 U: ?5 B" q2 j6 Z/* " k+ P( T. ]4 P, Z/ ]
*for htonl,htonl $ |" i7 h, s& R; G; \; }
*do remember link "ws2_32.lib" 2 b1 i& U6 L* R; V
*/ " Z5 X0 U2 l% U% S  u7 A- {
#include <winsock2.h> ! H1 b- z" ]% `4 \) z& U7 G: y
#include "util.h" / q+ ~, w, ]: \) F9 @- p1 L
$ O+ }, l- }, v; @& E4 b
class TEA {
% ^3 j- s- u/ Npublic:
  ~! u& w- [. n- Y% A. o. D9 S    TEA(const byte *key, int round = 32, bool isNetByte = false);
; f2 F: k3 D8 X8 H: L7 j( g% \5 _    TEA(const TEA &rhs); ( l* n8 _- G/ H( W; B4 S
    TEA& operator=(const TEA &rhs);
9 e% Y2 ]4 t* l$ {2 k" P% W3 l1 Z    void encrypt(const byte *in, byte *out); + _5 L2 I3 O$ b  F
    void decrypt(const byte *in, byte *out); 9 l9 k& w, G6 a8 }* W& Z
private: 6 b. o: v3 X! |2 G+ R
    void encrypt(const ulong *in, ulong *out);
0 w9 Z; d# K2 u# n2 {    void decrypt(const ulong *in, ulong *out);
& E% \! c, H1 v    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } $ K+ H8 [( O3 x, s
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
0 C; O1 ~) w" F2 Iprivate: 9 d7 W5 `& W$ D6 ^3 [& O9 |
    int _round; //iteration round to encrypt or decrypt
2 M9 d1 ]* O' Y8 d    bool _isNetByte; //whether input bytes come from network " h+ N1 g- B. K% ~
    byte _key[16]; //encrypt or decrypt key 9 h: M2 i% ?1 L3 k
};
, ^' Q" d. E  t- L5 z  Y0 t
& U4 T/ U  {) l2 y( R0 A* O+ E#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
: {/ d3 c9 m. N. j8 \& i, }3 n' U' r 2 #include <cstring> //for memcpy,memset
9 Y* E- b/ |7 |& ~  w+ v* X 3  
; m4 L) p' G+ N: J: V 4 using namespace std; : u+ x& Q4 F# }( J: `
5  . Y  e( W9 W+ h
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
! S# w: J4 I4 ^8 D/ i) S 7 :_round(round) / U+ J# y! a3 h/ K( }
8 ,_isNetByte(isNetByte) { 1 b& m8 [0 c  `9 J
9     if (key != 0) ' `! q4 q9 _' H. U4 Q
10         memcpy(_key, key, 16);
2 g1 Q! M3 h( V. G11     else
- J5 V! k% @- j- @12         memset(_key, 0, 16); 3 L' d8 s, U$ d6 O, Y
13 }
& V9 y" ~# j# f6 F9 j14  
7 }8 M6 j: `5 u1 F* ?15 TEA::TEA(const TEA &rhs) 2 d. F! n9 K. R1 j- y8 L: |- ?
16 :_round(rhs._round) - k0 I& y" r) u0 s
17 ,_isNetByte(rhs._isNetByte) { , U; z2 {( P% i0 Z2 h5 x
18     memcpy(_key, rhs._key, 16); / D0 b% V% b- g  B/ B( ~
19 } " y: v6 a% j" Y* n4 p
20  
. w1 p1 U' g+ U8 x4 B" W* i21 TEA& TEA::operator=(const TEA &rhs) { 5 R  t- l+ ~/ f; u' x
22     if (&rhs != this) {
9 d1 f# N2 y/ f* Q; G! g23         _round = rhs._round; ! [( x* q1 P9 x, b
24         _isNetByte = rhs._isNetByte;
! D! J  q* S& y25         memcpy(_key, rhs._key, 16); $ k7 c% ?  P! d0 i0 c
26     } * o7 U6 u8 s# x, a9 ]$ I# L4 O- a4 Y
27     return *this; + @& m( [8 d+ T
28 }
8 {! ~2 \, p, W. X& g' F29  9 [" h! w7 G8 o# b2 z" Z0 d
30 void TEA::encrypt(const byte *in, byte *out) {
" e4 V, J% d3 P, U0 G1 \31     encrypt((const ulong*)in, (ulong*)out); : K1 ]& z2 v" ^. E0 F1 {
32 }
: D. X7 S  N: T* G6 Z33  
6 b$ S% s3 \, O  s- l2 i9 i34 void TEA::decrypt(const byte *in, byte *out) { 9 S" Z' e/ h7 e, y9 z
35     decrypt((const ulong*)in, (ulong*)out);
2 _5 ~8 q  Q1 A/ d# ]- H4 A36 } # n3 |, \/ Y2 j& @8 m/ ]* A* ]
37  
) D1 ?- ?5 n+ S+ }9 P38 void TEA::encrypt(const ulong *in, ulong *out) {
5 g) ^7 O5 @+ U: x+ U( H1 d39  
" m5 J8 d3 z5 q' c40     ulong *k = (ulong*)_key; - t8 ~& _( o% G- D9 K9 Z
41     register ulong y = ntoh(in[0]);
1 S+ z% x- H+ M/ D6 F42     register ulong z = ntoh(in[1]);
/ q9 ~% Z4 b8 U( `" c9 V- \43     register ulong a = ntoh(k[0]);
" j2 k4 J. z7 T* a5 E44     register ulong b = ntoh(k[1]); : R5 Y# y) [; n9 f! y. I2 [8 x  O
45     register ulong c = ntoh(k[2]); ' O$ U3 L# x1 J1 K3 E
46     register ulong d = ntoh(k[3]);
6 Q$ z, u/ Y% S' \& g0 r/ t47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 6 ?+ d; @+ v- y8 |. ^% j" @
48     register int round = _round; $ J0 z! k+ w9 u3 C' D
49     register ulong sum = 0;
* |; z, d9 K( \* y50  - K% N2 s' g8 o- G
51     while (round--) {    /* basic cycle start */ " g6 Q- H9 c: B2 S1 W
52         sum += delta;
2 i3 H' ?9 M0 Y53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); & I* u9 _/ u: U* d" ]
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! R5 E. _8 ?: m4 x8 f+ H3 \: L9 K4 a55     }    /* end cycle */
& |  m' w, L6 W0 X+ {' f56     out[0] = ntoh(y);
) f# E3 ?* x4 P: A3 U! R7 k57     out[1] = ntoh(z);
9 c6 p/ v; s" p- Y$ P3 x" s( L7 m58 } ' K2 b' ~/ e' e
59  5 ]1 b1 h6 P' |% f  I
60 void TEA::decrypt(const ulong *in, ulong *out) {   J, }  ]. C# b6 }* l( P
61  1 S4 V+ {7 R5 O  a& a8 H# n
62     ulong *k = (ulong*)_key; 1 r8 r5 Y% D# R2 u" P( W
63     register ulong y = ntoh(in[0]); ; j* M3 I* d, r* M, @
64     register ulong z = ntoh(in[1]);
; U" m- l, \6 X5 _+ i65     register ulong a = ntoh(k[0]);
8 b' o% j8 F' p0 q( m. C66     register ulong b = ntoh(k[1]);
6 L4 H6 o1 }; j2 R9 q1 ~# y8 |67     register ulong c = ntoh(k[2]);
' R2 E- \( l9 V+ {5 P* ]+ h& [9 v" ^68     register ulong d = ntoh(k[3]); . q3 q+ f+ p& S" L, U5 I# i7 }
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
$ |6 A+ s8 N  \$ t! V. ^6 {70     register int round = _round; & N" [  X5 {4 Y; i
71     register ulong sum = 0; + O* r! ^0 B" m5 q5 g7 v5 P; P
72  
+ }6 P7 e- X0 X4 U: j$ Q  n, z  g6 d8 e' Z73     if (round == 32) - _, E; M! j& p! r: E6 Y* G
74         sum = 0xC6EF3720; /* delta << 5*/
& i$ A( C8 M) ?  |. z) M75     else if (round == 16)
  i7 n. y# G6 c& s; q9 H76         sum = 0xE3779B90; /* delta << 4*/ ; q4 o% ~) n( c1 j' y
77     else 6 Z( |" }. s* T' ^& _( i) K
78         sum = delta << static_cast<int>(logbase(2, round)); * P$ O' x' B8 x: x
79  9 v- ~' x  y0 [+ h- ~/ y
80     while (round--) {    /* basic cycle start */
  j4 E2 u9 Y& g* W81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! @0 q; k9 N& \3 A- y8 N82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ! A4 N& N! e2 B3 g6 \6 O0 g
83         sum -= delta; 2 q$ s. x& W1 M8 y5 Y) A
84     }    /* end cycle */ 4 O; `7 e9 [" Y4 h/ T' }
85     out[0] = ntoh(y); ! R& W0 f; C3 A
86     out[1] = ntoh(z);
, X( Z/ K1 ^+ T0 x- f/ s! O8 H87 }$ E3 n7 t- y- s& f

& A! ~2 L. ^" c4 x6 Q" _需要说明的是TEA的构造函数:
% C- @! _0 Q+ H0 _TEA(const byte *key, int round = 32, bool isNetByte = false);
9 a% M: n7 A+ h$ n. G, F8 a$ Z# B/ h1.key - 加密或解密用的128-bit(16byte)密钥。
( G/ ~. P3 X$ I' d7 w; M. E8 ^2.round - 加密或解密的轮数,常用的有64,32,16。
0 c, M+ a: I  f( x3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
  i/ L4 M+ y6 H5 W3 h2 z
' \6 A) F  r- \+ ~, h* f4 N最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" - y1 b, f1 `, f$ v6 p
2 #include "util.h"
7 ]& J1 _+ p: J7 N- w; S- m1 d 3 #include <iostream> ! u6 y1 O' ~2 r& N  i7 _; W" k* `$ i! B
4  ! k  M  J! M  ]1 j4 n, I( S. N, H. d, B
5 using namespace std;
# I) C0 L# {0 y9 `0 D6 Y8 o% K 6  
% |$ V2 F2 r9 H 7 int main() { ( Q4 G! a4 y+ D, H
8  
4 i/ C1 {; x4 V1 c7 J( l 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 8 B" {. ]' D5 o$ \. m5 ?& E6 y
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); , M1 t+ G2 x3 g; D/ U
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 3 ], U7 ]8 H, s+ e! U
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
" U/ b9 Y+ `" \( d4 A; m) u13  
* o2 `# o% i0 I# U& f3 _14     size_t size_in = hexStringToBytes(plainStr, plain);
7 i9 w4 {# P5 t( J# q" P3 o% d, Q. T8 _15     size_t size_key = hexStringToBytes(keyStr, key);
7 n+ b5 d3 l4 ]16  - E4 K, Z$ }; s: B
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
- G. X; k; M' L0 X18         return -1; 7 b  O0 \" ?6 x
19  ) b- F9 w9 t  @- m
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
5 J: D" ]4 ~2 L# B9 N$ @% z21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
! `. @2 w& ~% E3 @- i! ?! k* i. S22  ; e) T( Z% S1 D0 A* n
23     TEA tea(key, 16, true);
; Z4 e  `* x* z; W5 I24     tea.encrypt(plain, crypt); 1 i. c7 o9 U* F' u* `
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
: Q+ D6 A/ d7 N8 W' i( d26  
6 r# G2 C* C: ?27     tea.decrypt(crypt, plain);
4 N# V; R: l; t9 s28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 4 p+ n; n6 L4 G7 k
29     return 0; 1 a9 R% S5 d1 [2 Y
30 }7 }. u. k: G0 u" M: @9 |+ l
2 }3 w' l" Q( n& P( G: S
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx* [% A% e6 G/ [/ Z$ a
运行结果:
+ u3 k) z- g$ m. a% o. z1 VPlain: AD DE E2 DB B3 E2 DB B3
- S) U5 r1 R5 u% ]* V5 u) X" kKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ) ~  g7 |: J9 E) C
Crypt: 3B 3B 4D 8C 24 3A FD F2   T- @2 Z3 x3 ^9 E& E% r7 ~; Q. o
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 21:00 , Processed in 0.021489 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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