找回密码
 注册
搜索
查看: 37812|回复: 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轮):2 n  W. i- @8 p  n, N+ J- i) f
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 # L. E, ]% ]0 L" F* o. P9 S& r
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
+ b- {) k( B: s% u; H' H- T3 O/ u. R之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ) _6 j- U$ u# e3 O2 Y3 j; d2 \6 T
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
8 r6 q, T+ q' B6 A4 z& z1 r, r4 W2 P在 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. 0 u% L1 j: e* |9 D! {* G' D4 v
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ) a7 V- c, f& G6 e& X1 V
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    " c( E) n4 o" {- f$ B1 w, p
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 5 ^" b" C* w# H  V
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 7 R$ f9 k+ J: ?# C: M( H4 d/ }. |
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ % J- \" D+ ?5 U  |
  7.          sum += delta;
    : k6 j8 F7 s% e8 {+ m6 T
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & e0 a( M. N' H* Q" f5 W$ w# G/ u# `
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    9 o0 K+ I# }; d2 K6 `4 \* a
  10.      }
    1 R" z9 o1 z& t1 o+ ?
  11.      v[0]=y; * I! H9 Y# H) Y
  12.      v[1]=z;
    . L7 Z" x5 U7 i
  13. }
    $ P! @5 ?2 k* ]- E. J
  14.   4 V9 R0 m; N$ b$ r! E3 z
  15. void decrypt(unsigned long *v, unsigned long *k) { 7 K8 P/ b' M: F
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ " K8 A- P: X* c1 P: y
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ , H, s5 g7 |! n* z$ l
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    8 u" h; H' s* G, h7 @
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ! q* u) s3 f$ O1 F0 [7 i+ C, v
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    % p3 G7 S* b6 J
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    # O# J  p) L/ k+ E4 [
  22.          sum -= delta;                                /* end cycle */   X! ^0 F3 j( @1 J% Y: }
  23.      }
    * i+ f& x" X4 U/ D4 i" U  L) d
  24.      v[0]=y;
    % d2 E' X* h. X. l& G2 m: `
  25.      v[1]=z; * L- o3 F( U7 I" Q
  26. }
    . Z1 j1 i( P! Y) m  q# a3 a
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
0 r4 @9 R' y& O' `3 R" K#define UTIL_H 5 k0 V9 a0 B' [, r
4 S. I8 ]+ n$ W6 J6 Z8 s
#include <string> 7 W1 K$ i* H# k
#include <cmath> 8 g( j  b) R# I- J* y, T) U
#include <cstdlib>
, U' n+ u# k8 E9 s; Z" [2 |
9 l  m1 R4 a5 g- `: r4 g, o4 xtypedef unsigned char byte;
7 y* p9 n9 v, H" c- `# T* z; itypedef unsigned long ulong;
  D5 ~* \7 F: m+ t7 `
" h! F1 ]; u- {9 xinline double logbase(double base, double x) {
  Z" L) l. Y4 }7 f* u  e7 m    return log(x)/log(base); : U# n' ^3 G( J& w  {9 M
} : W, G) a; ?/ d8 t" @3 E

  H  V3 ]& t. Q* }7 w/ `+ r/* / A* ?5 G: @2 \: G- \
*convert int to hex char.
6 E: e+ U" h0 Z8 w5 o*example:10 -> 'A',15 -> 'F'
' t* A/ o$ A+ k*/
0 ^* w6 H& U: {) l( h9 t+ Uchar intToHexChar(int x);
$ p# U2 I$ @2 Y% e$ H
" N& u( I7 Y1 f5 Q3 V/*
* E$ ~" j, B3 c2 U7 }*convert hex char to int.
+ R2 m' S: J7 R+ M3 I: r' u& |# s*example:'A' -> 10,'F' -> 15 7 @; W: u- K$ ~5 x- Q* W
*/
7 B/ T. b8 L2 X. B3 R% A* r& eint hexCharToInt(char hex); " }0 ~/ a1 ~) A5 K# a" f
, ~  [8 ?* a+ p9 d5 W
using std::string; 0 f  U& @" h2 Z! R& K2 \
/*
, i& u( k; d5 b9 T- R: G% T' g*convert a byte array to hex string. : X9 t6 Q& X0 c5 P' z' m
*hex string format example:"AF B0 80 7D" * ^2 G0 H+ |' h8 r3 g* x
*/
) \3 w: j1 p" u+ @, vstring bytesToHexString(const byte *in, size_t size);
# n' M) x1 J( x9 D! g! }& g# ^3 F% F  Y/ w
* Z$ |2 G+ \+ ]/*
9 R# y+ `$ f0 w* W' A, N" |" m# Z*convert a hex string to a byte array.
, Q. O9 N1 T, V) i*hex string format example:"AF B0 80 7D" : m0 P7 n5 |6 t  J& u  c
*/
( @& r, @7 w, a. csize_t hexStringToBytes(const string &str, byte *out);
/ O" D) ^7 j( X/ b( ?9 B! \
: D. X% [0 P8 V! ?0 ~8 H# K) y#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
2 P8 ^( ^2 ^3 S7 p% B" H: ^#include <vector>
/ p" v- \8 Y3 U7 p1 S! Q! E6 Q3 N
+ x% T3 j  \0 Cusing namespace std;
1 a, d5 T6 B9 E ( y* P5 X! g0 A
char intToHexChar(int x) {
# E* ?- Q% I3 V    static const char HEX[16] = {
9 P  }$ P/ P! C- s        '0', '1', '2', '3',
  m" K. M$ U" }$ R* M; }% P        '4', '5', '6', '7',
; f) d0 J+ I" V" a+ E0 a* y: h        '8', '9', 'A', 'B', . x2 c$ ~9 F+ R0 H; ]/ {. W* v
        'C', 'D', 'E', 'F' 5 w( z4 J4 J5 [+ H) ^/ U+ o
    };
" R; E4 M7 B$ C! r    return HEX[x];
" d! `2 f) T8 h1 \: h}
/ H  R9 [# w) @0 \2 m) ~# J& F8 _ 9 L1 d7 t9 h' Y
int hexCharToInt(char hex) {   f- _. h9 ^6 u  H
    hex = toupper(hex);
% W% z* J- c0 Q! m; y    if (isdigit(hex)) - i/ B# Y/ ^+ _+ K1 I0 |
        return (hex - '0');
/ D, s2 M- D7 o6 F# z- m, \    if (isalpha(hex)) 5 {: j1 g. s$ H
        return (hex - 'A' + 10);
5 I- b4 I* t/ `& T) @; g# z    return 0;
2 ]' H' o8 b  r" ^. B5 P} . K' o5 a5 l* G5 ]: x
4 G( i6 x; ]  R. o3 B  v
string bytesToHexString(const byte *in, size_t size) {   b' i9 ]+ ?" }# t
    string str; - k; E! X8 C% {+ `2 q
    for (size_t i = 0; i < size; ++i) { 2 r. |1 p3 m. k
        int t = in[i];
1 w' u" V' W6 m        int a = t / 16; " ?1 F. d3 Q. X2 V" P  d
        int b = t % 16; ; C8 X) s; U" X# ]/ a# E
        str.append(1, intToHexChar(a));
/ @/ v" y  n2 m! s$ U' `        str.append(1, intToHexChar(b));   j% s! j9 I. P6 A$ g% r6 W. U# v
        if (i != size - 1) ( i1 m, k) F' p
            str.append(1, ' ');
2 K: {8 _# d8 b0 B+ \: H& u    }
  |: B6 H& f$ V) l9 R1 z% H! t$ ^    return str; 0 p' f7 M" r- B9 d/ G# _( R
} 5 @5 b7 p% }8 k: \: o

8 L* L- }* N  \3 X1 u9 {; F) i" Csize_t hexStringToBytes(const string &str, byte *out) {
; V% L6 ^+ n' C& P , d/ {* @& x3 Z6 t$ S
    vector<string> vec; 5 J1 I) w" y# v. A
    string::size_type currPos = 0, prevPos = 0;
4 T3 g) `, Y. g* p0 s/ ^1 \    while ((currPos = str.find(' ', prevPos)) != string::npos) {
" I4 W" d, `" |2 t0 |        string b(str.substr(prevPos, currPos - prevPos));
5 ~. d6 o9 B; B! a: l0 J# N& b& Q6 }        vec.push_back(b);
) d- [$ Z& x3 r' C0 h( V        prevPos = currPos + 1;
: r/ h) ?% _* l( k# Q    }
. m' n" k# n! i3 L    if (prevPos < str.size()) { ! D" k8 p2 Q2 ^& q- _- j  G
        string b(str.substr(prevPos));
. x' n7 Q& z! k" z( u9 g        vec.push_back(b); + S2 O) C" D/ z/ o
    }
1 U% t: u6 c8 f3 }8 |+ E/ F& k    typedef vector<string>::size_type sz_type;
# x# a6 f, I  B    sz_type size = vec.size(); & z' N+ e- A4 K* b
    for (sz_type i = 0; i < size; ++i) { 9 j+ ^: x) g8 o  y
        int a = hexCharToInt(vec[i][0]);
; d/ x% X* L' E3 D0 m; p; k4 e. _        int b = hexCharToInt(vec[i][1]); ' G* u7 |% W2 c9 N/ N$ I+ Q
        out[i] = a * 16 + b; # S( |$ K7 {( R- r
    }
, Z; k; `; W$ x! ^  E# P' Y    return size;
2 H4 [  r7 w( e3 {}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
% |2 F( q5 @  v/ F+ @& o, l0 o2 m#define TEA_H 2 ~' W+ {, ^7 `+ P5 v( U

5 G/ {6 D' D" D; I/ m/* 9 p& n, P+ B$ l
*for htonl,htonl 0 E( U% c0 p+ S
*do remember link "ws2_32.lib"
5 E3 ?- U0 q+ F! A( c# @*/
; k* B1 |, b% Z3 m) V; O) ]( z) h9 b#include <winsock2.h> " T! M/ W, _, m+ m/ @* r% B, g
#include "util.h"
* l+ v  V$ D" G( f* |+ `5 m
+ F3 b" J' e3 \class TEA { $ C, L5 I, F' W$ ~" y
public: / R$ r8 v/ ]. P! a
    TEA(const byte *key, int round = 32, bool isNetByte = false);
7 e% G/ k! C6 M/ y& I% O6 g    TEA(const TEA &rhs);
, n/ \7 R% p8 a- H  ?8 T2 T    TEA& operator=(const TEA &rhs); * C4 f1 k! m0 J8 B& ^. W
    void encrypt(const byte *in, byte *out); 5 O- F1 V6 z: V, t! O% V7 N
    void decrypt(const byte *in, byte *out); . D+ z' p9 v  G; Q. {
private: ) f% D9 S5 w* f' Y
    void encrypt(const ulong *in, ulong *out);
$ h/ E% y" }8 E: u$ W    void decrypt(const ulong *in, ulong *out); 6 X5 q3 K( S2 @' P* F# O' {/ G
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
! @5 {6 N( E- d    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } , c2 {& L: l! s: p3 x- @
private: 4 t; ?* N& t1 ^) G0 o! S* c6 s* S1 ?
    int _round; //iteration round to encrypt or decrypt . W/ F( m; L! }9 M- h( b9 H
    bool _isNetByte; //whether input bytes come from network 6 v  V: _/ I1 J- N) e( b8 i
    byte _key[16]; //encrypt or decrypt key
5 j  `2 P4 P5 k  ~5 o}; * y3 |# i) {$ t0 X/ L( g

# `) g/ [2 X2 b6 k7 i& R#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
5 F# K: E7 u9 D. Q! y. M8 h 2 #include <cstring> //for memcpy,memset + r7 \7 z7 `2 j: a
3  # m* O, [3 M+ O3 J' w- B
4 using namespace std; " L. {: I7 q  H. Y
5  
% ]2 j" d& }4 C 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) / |/ F" r/ |8 ]4 u: p3 @9 {
7 :_round(round)
2 M# I( W' r( ^6 Q0 J 8 ,_isNetByte(isNetByte) {
# e1 b7 [. P% E. s! w 9     if (key != 0) 5 R0 @, ^4 c3 R" X' }
10         memcpy(_key, key, 16);
4 h* y& f$ n" N  J+ G11     else 0 K/ l3 u* U( g/ t' P
12         memset(_key, 0, 16);
4 Z. V+ t: m0 d  F! ~13 } 8 J9 z3 k- A% x8 K; g
14  7 `9 r" p7 ^9 t' G% w7 ^  }& t
15 TEA::TEA(const TEA &rhs)
1 Z/ D- |: h, U9 l+ a3 I* M16 :_round(rhs._round)
( \) L7 D0 Z& z( z( _# D17 ,_isNetByte(rhs._isNetByte) { ) b% D* ^" j) j  o6 U. z
18     memcpy(_key, rhs._key, 16);
2 B$ D2 S" C% }" x19 } 9 p4 F, u/ H0 V1 k6 L' O2 V
20  
1 {2 w4 _: N6 w/ v$ n21 TEA& TEA::operator=(const TEA &rhs) { 0 J$ _  ^" y: G; R* `1 g8 t
22     if (&rhs != this) {
0 Q8 F$ o# C5 `' q, R23         _round = rhs._round;
. |) p5 G# J* c0 n5 U24         _isNetByte = rhs._isNetByte;
; @) E) f# Z( `6 i7 P6 c* w25         memcpy(_key, rhs._key, 16); 4 z( F. U; ]% v  j6 ~/ h8 J
26     } 2 w  l; i7 R) y3 a& f6 y) D
27     return *this; 3 E  l/ F( F' Z5 N6 E
28 } . C$ \$ O) r, J, F- b% }
29  9 N% c: t; o% I( w  Z/ @( b5 }8 z
30 void TEA::encrypt(const byte *in, byte *out) {
7 U3 f4 a3 ]( y, D/ e31     encrypt((const ulong*)in, (ulong*)out); 3 c9 k. L5 T* \( U* R9 i% [$ _$ {3 d
32 }   E! Q3 U. y9 l# }9 J( H5 O
33  
6 e- T, w# n" ^2 q1 r34 void TEA::decrypt(const byte *in, byte *out) {
4 y8 O* J- r( s' `35     decrypt((const ulong*)in, (ulong*)out);
; K/ z! E% p( B2 `9 {1 y36 } * k6 P$ a( \/ _+ U$ O9 b8 z
37  
6 R. @% y+ {  Q, F2 }6 y38 void TEA::encrypt(const ulong *in, ulong *out) {
* ?5 n9 W) I4 w7 x/ V1 X6 n7 \* H39  
6 c5 {5 [. F7 e, U) {3 |2 I+ n5 d40     ulong *k = (ulong*)_key; " V& d" G# {0 u: S# k
41     register ulong y = ntoh(in[0]); + H7 c8 l6 h; u( J
42     register ulong z = ntoh(in[1]);
% T$ N- P& h5 u: ]! Q43     register ulong a = ntoh(k[0]); . Q' |2 Y5 ~( ^2 o9 k8 B4 ^6 u" E7 V5 e
44     register ulong b = ntoh(k[1]);
5 E- U; F, z: \* Z: x45     register ulong c = ntoh(k[2]);
; G, G6 S4 ]% x% a46     register ulong d = ntoh(k[3]); 0 l$ q; D- ?) @1 z! i' |, ~% F
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ - T9 l8 H% n7 @$ I
48     register int round = _round; 0 l1 h7 j4 _' O8 r' C
49     register ulong sum = 0; ! q8 o4 T% l) A4 t; ^1 m
50  
- L! D" J0 {' o* R! K1 P! \; N51     while (round--) {    /* basic cycle start */ 5 A2 A0 Z( d( M8 _1 z
52         sum += delta; 3 o: X* }# R! G
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( l, l: y8 x' Q- a/ }$ r- R& A54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);   s: K1 \9 H) l0 i7 s" n
55     }    /* end cycle */ & i! X1 ]3 Y( i3 A0 c2 I
56     out[0] = ntoh(y);
6 g3 `+ V% r# p0 K6 r+ y8 q1 H& m57     out[1] = ntoh(z);
' j' N' Y% j* {+ W# M' P2 l' m58 } / G1 ]( I3 ?0 T% T( f# @
59  
7 Z5 K% K: [4 d# o+ d% d60 void TEA::decrypt(const ulong *in, ulong *out) {
0 Y; o2 U9 X, d% w61  1 |7 g$ D" b+ k
62     ulong *k = (ulong*)_key; 9 r/ L: q+ M. R1 j' Z8 ?6 F+ Y
63     register ulong y = ntoh(in[0]);
9 D' g% \. b, p1 O; I3 L  i0 W1 d4 D64     register ulong z = ntoh(in[1]);
2 |& I7 D# d) M6 H- ^$ s65     register ulong a = ntoh(k[0]);
, n- \( K6 u) [3 w$ w& s66     register ulong b = ntoh(k[1]);
9 d" C. K9 ?$ w2 a8 `/ p67     register ulong c = ntoh(k[2]);
/ s' b' o  ~1 Q% c, C68     register ulong d = ntoh(k[3]); 6 Y) Q; a3 u8 b) j; w9 t
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . z0 y3 e! a" H" s
70     register int round = _round; / c. A, }6 u% p  |! G. [
71     register ulong sum = 0;
  L5 h+ [; w# U4 W1 Z& [# i72  , f0 v" }. O+ K2 x# `; G% G6 x
73     if (round == 32) ( F; A. I6 x  M8 [. F
74         sum = 0xC6EF3720; /* delta << 5*/
+ k" c/ y% [, G75     else if (round == 16) + ~3 H7 A2 s. C2 f) u3 g9 S
76         sum = 0xE3779B90; /* delta << 4*/ + `. Q5 Q; d# G) a" z
77     else " [' E- M  u8 m4 j0 q9 o2 o
78         sum = delta << static_cast<int>(logbase(2, round)); ( R* j3 K2 T2 T( Y4 X0 X
79  & `8 S! b! q, b! o( s3 o
80     while (round--) {    /* basic cycle start */ ' Y* [- G' L& F" f# [- P
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
$ D1 w) p/ m' H, L: {82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ( W6 e2 h4 t8 b. |  P; f. |
83         sum -= delta; . ?6 g' O1 e3 K, T
84     }    /* end cycle */
6 Z8 \) b; d7 K/ f85     out[0] = ntoh(y); * D6 _' Z0 f# G- w1 ]. O- G
86     out[1] = ntoh(z);
1 x' S4 Z" D% X2 t, }) e! w87 }
6 l& g( j! s. R# H: z0 b* A% @3 \4 C3 g% M* e) @) W
需要说明的是TEA的构造函数:
4 P( ^& F0 ^, y0 N- _7 k6 n. D9 cTEA(const byte *key, int round = 32, bool isNetByte = false); # ?7 e5 p* j$ ?5 M' B0 B/ ?- U
1.key - 加密或解密用的128-bit(16byte)密钥。 + g9 v/ v, P4 I, O/ ~' d
2.round - 加密或解密的轮数,常用的有64,32,16。
2 O) B( W4 T$ h# m4 M0 b3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
' _: _  W. @" _! z
1 [1 G- z9 U' K" Y最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" , `( \, \: H( w. f/ J7 E+ P" R
2 #include "util.h"
& A% Q9 Y$ c$ [0 F% t& y/ D- e 3 #include <iostream>
; H6 x; T: p5 T. d" a* o, j* L 4  
6 i# H% D8 D+ ^( m( ` 5 using namespace std; " c4 C" r- g8 L2 Q" [& n, A
6  
% Y3 s5 c- o& M% b 7 int main() {
+ x. P+ Z* X- Z3 y; ? 8  
8 T) z1 k* j5 t0 K# |, W 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
7 E: q9 \- V, d4 J& m6 D+ m10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 8 p/ u# a. Z+ h) f- D! k, M$ \
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
6 Z5 O# Y0 W3 Q/ l, X, D' ~% L7 @12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 3 a. c6 q" p" s3 p; d8 A6 m
13  * i8 E6 z! v+ v* w2 Z) F' M
14     size_t size_in = hexStringToBytes(plainStr, plain);
3 c) D* n6 M( E  k15     size_t size_key = hexStringToBytes(keyStr, key);
- y7 o! q9 b8 W16  
, Y% R6 |6 n$ r" j" ]# l17     if (size_in != SIZE_IN || size_key != SIZE_KEY) * I" d6 _9 ^  g+ a7 c
18         return -1;
: ?% I/ S0 G* T19  - y0 a, j$ {9 L  f8 I/ m" R
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
! d" C  `' y' o( w: H, o3 X! }21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
& Z$ P" ]5 R9 o22  
# y0 E2 J. p7 g; N: w23     TEA tea(key, 16, true); 0 j. X& u+ x9 Q* o9 _# {! S
24     tea.encrypt(plain, crypt); 6 ~( U) n0 H: D7 Y* S
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ' ?" D% f3 z2 J0 p( a5 N
26  ' I( q  A; S  B2 w2 ?& c. @' z
27     tea.decrypt(crypt, plain); 3 H, v" M7 [0 C& D) G0 w
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) ?" R) B5 q; _29     return 0;
+ }+ I* ]0 d0 j( `. p30 }$ C9 ?$ g: @( S0 Z; ~8 K
+ O' r% i! a3 o% t
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
( m" `0 u9 L. \1 J( h运行结果: ( c% G" V" y" z& e  N/ Z
Plain: AD DE E2 DB B3 E2 DB B3 ! P; X% `% [- `( |% D6 B' ^
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 . N( p  @' A+ |7 U- F6 Q) s% o8 @
Crypt: 3B 3B 4D 8C 24 3A FD F2 6 m6 X# q) X" o! c! X, k) ~9 Z
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-28 02:40 , Processed in 0.021334 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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