找回密码
 注册
搜索
查看: 37523|回复: 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轮):
8 I, W# G0 I% P微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 - s2 K; A  A/ C( s  b) ^: l+ A
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
; n4 [2 X5 \; C3 C8 l之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ' D8 F# I: Z! N2 \+ K
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
$ Y0 X) {+ \+ e, g: i在 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. ; J4 X: {6 W0 g2 I* R3 ~
  2. void encrypt(unsigned long *v, unsigned long *k) { ' h. J6 e& d! I1 g2 }# f9 }
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    6 {, ^3 b$ v0 h" H# f
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ - e% d9 \) `2 h. q8 g  b* e& E
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 3 E$ K* E9 S) ^7 D  R* w/ x
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 4 [3 A6 I5 N1 z; G) I" C" f% P
  7.          sum += delta;
    , a. ]' J* W6 F/ n* \
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 3 l% w& [# T6 }/ S: q
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    7 I4 f% X; [2 m, c/ E
  10.      }
    3 N5 k$ a4 X! b. |, C/ c
  11.      v[0]=y;
    $ a' X/ j" z9 d0 m0 O4 L& D
  12.      v[1]=z; 5 b! V3 ^4 J- G7 f2 }
  13. }
    # s1 h, U$ |* E/ O+ H5 _5 `0 L  a3 H
  14.   & w5 T8 r; m: v/ P. b
  15. void decrypt(unsigned long *v, unsigned long *k) { . W6 ?# s* \( j
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 7 }) Z' w( }5 a
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ! V# Y$ M8 t. {# G! K
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    . C) z, ^- J& ]8 w' M- l+ v
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 8 g: {2 C  l( E: ^7 @- s! R
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # X9 z4 e% Q/ p2 Z$ e( R, g9 C
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); % E: R9 S4 T. d: j7 y2 W0 @: l( _
  22.          sum -= delta;                                /* end cycle */ 3 U+ q; a) J/ O6 @
  23.      }
    5 I* K2 O6 O4 E8 Z: h, \/ \5 s
  24.      v[0]=y; $ l  H) i  F0 w6 F1 |/ |4 O) [' G* n
  25.      v[1]=z;
    , t! ~8 n; N, p$ o$ \; R0 f
  26. }
    - H  @  ^! R6 P
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H $ A  h* }% M4 V7 @+ d
#define UTIL_H
# w" @: b5 K5 e8 N- u. i! ]5 y
/ _1 w, V1 X$ a9 c# _* J#include <string>
; C% r5 ]2 x, w% G2 K$ h, d0 J#include <cmath>
$ w3 a3 N% h! k1 W; A#include <cstdlib>
% E- ]! C- K: g$ C& O6 S3 Z' H   H$ Q3 h- ^4 |' J7 }! i
typedef unsigned char byte;
1 E# c3 |. M. z# ctypedef unsigned long ulong;
$ o: t# n( e2 F/ M9 r
' s' m& v% f0 V( K. tinline double logbase(double base, double x) {
  `* s6 ^( [* ^/ k/ j0 \  }    return log(x)/log(base); - i' f2 H2 O; Q& k
} 3 d! U' _7 b, y% O; Y% M" K
& a: V3 z5 X7 P
/*
- ^0 T9 _! ?! g+ ^% X3 B1 a*convert int to hex char. 7 ]/ X6 H1 B5 G" e! Q6 `
*example:10 -> 'A',15 -> 'F' 1 p+ C. p0 i# [! \" y9 M
*/ " k+ }$ Q6 \2 t' }0 \5 z  ^3 L
char intToHexChar(int x);
$ n6 e" @8 \% `( z# V$ W : b" r# P, A! g) q; j
/* 2 q: j0 y% S" U: X+ ^
*convert hex char to int. * ?  @$ a" Y8 e" c5 r
*example:'A' -> 10,'F' -> 15 % \1 x* O6 p6 j9 {
*/
6 z8 ?' N/ e4 h5 I7 Q" V5 sint hexCharToInt(char hex);
4 T6 H! @- H% F/ g 1 {% |' z8 O- }  y
using std::string; : _3 i# R* W4 {. W! q
/* ) m  R- w; E* `( c7 h5 `
*convert a byte array to hex string. 6 u. |9 H+ `' Q1 M/ z8 N
*hex string format example:"AF B0 80 7D" $ J: f7 O$ x7 \6 ], l( Q3 O
*/ 6 M# h' k( e. _0 B5 R
string bytesToHexString(const byte *in, size_t size); 0 V- M- E% M: O, {, W

: _; ^% j$ F- c# _2 j6 k" L/* ; D# B" U8 U# C/ w4 w
*convert a hex string to a byte array.
! a0 v" S. {' X  y+ p: t0 |2 M*hex string format example:"AF B0 80 7D"
; I- q2 X* m, e, l" H5 |5 h7 ]*/
8 M+ h% X' I' W* Y6 K) ]size_t hexStringToBytes(const string &str, byte *out);
  ^8 [' z" U7 f& l 7 G& \* x; s  s7 ~# |
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
( n+ ^, a5 S5 h. c- S. E# w#include <vector> 8 p" R9 U- W* }3 u" }  R, ~

  Z, b% C- M, C2 M% f. @, F. h( qusing namespace std;
0 D# M  N4 X" B
) x% [% n6 m$ V( ^8 X' c' Achar intToHexChar(int x) {
' P$ t1 U! P7 k# T& p    static const char HEX[16] = { 2 I% Z8 X5 z' R" G0 i% d% M
        '0', '1', '2', '3',
- F) G8 K( e' v' {) `  S$ Q        '4', '5', '6', '7', & y# w$ R: M8 f+ r. X2 x' Q
        '8', '9', 'A', 'B',
6 \9 B' h* H2 v0 l8 H1 ^- \; x5 [        'C', 'D', 'E', 'F'
' a6 |6 [( M) s5 u$ D; f    };
* T: d/ R( m! T    return HEX[x];   `, y1 [- ]$ ^; ?1 R
} 9 I5 l3 F' d" _1 U9 B( u

; |2 U9 |8 @  @5 Uint hexCharToInt(char hex) {
2 h7 v: `& I' D! X( c8 S    hex = toupper(hex); 7 v( J2 h) b& I$ s' n
    if (isdigit(hex)) 8 h, `! F0 E5 _( P* g
        return (hex - '0');
- L$ n# g2 G# \) A) I* M    if (isalpha(hex)) - J( d2 _* q: g, G6 H
        return (hex - 'A' + 10); / Z  h7 l" Q- b3 X
    return 0; , t0 T2 \) Y" z; T
}
! X% |7 j& g7 M9 ]  a) k# N . g( @* x: l* Y1 g! p/ D. i
string bytesToHexString(const byte *in, size_t size) {
' J8 i5 @* ^8 c3 n    string str;
0 v/ s; B* Y$ F9 h, c( H- A    for (size_t i = 0; i < size; ++i) {
; Q8 }5 J, B/ o) }) w, U+ W1 g        int t = in[i]; % m3 T" Z! E7 D& k) X9 H
        int a = t / 16;
' T2 O$ e4 [6 H8 \2 m        int b = t % 16; ) r6 `% `& J5 O8 ]- |' j
        str.append(1, intToHexChar(a));
$ \" f* v0 x9 s/ E- n: g3 j. [) m( J/ I        str.append(1, intToHexChar(b));
2 v$ k" r1 ?% h1 c' Q; X        if (i != size - 1) : W1 S8 u2 {$ O' H( y% S
            str.append(1, ' ');
! ~9 X8 G0 }5 T% E7 E. u, ], D    }
! W4 h* T# z( {0 Z, Y% L: W% p    return str;
) w& @' x( T  O+ R7 y% ]* `: j} 6 _7 Q( \! H% J: e) _4 `

( n/ ~! x) z- z+ k4 g- E, w, rsize_t hexStringToBytes(const string &str, byte *out) {
  q; L9 E: n& z6 {/ D
# v9 `: a# V# d& a0 }    vector<string> vec;
! ?( B, t3 f! _6 b& o. u/ I    string::size_type currPos = 0, prevPos = 0; : z& P1 G# t& V- V/ N3 s+ K
    while ((currPos = str.find(' ', prevPos)) != string::npos) { # ~. W" g$ {5 Y2 G/ S
        string b(str.substr(prevPos, currPos - prevPos));
3 o# ~; X/ f" i! m/ \        vec.push_back(b);
4 W# w& E* F, e! O# O/ e7 B' e. \        prevPos = currPos + 1; 4 v7 w  Q0 E7 d+ z. D; r/ f2 @
    }
8 X$ R1 T/ N% U/ J    if (prevPos < str.size()) { 4 `; g: m1 V1 Q: _- l$ k% k+ L; Q
        string b(str.substr(prevPos));
- Y5 C0 h. m' y/ l        vec.push_back(b);
" B( T9 q$ m$ C1 ]' e6 p    } 4 B. }& b$ t# ?' n5 x
    typedef vector<string>::size_type sz_type; / j2 O2 `( |: P5 D, B# c9 l! v
    sz_type size = vec.size(); ' M1 p  L) C3 ]/ ?/ O
    for (sz_type i = 0; i < size; ++i) { 2 T, B) v) k9 _% {( [6 t# D
        int a = hexCharToInt(vec[i][0]);
& G1 P4 q9 g3 j        int b = hexCharToInt(vec[i][1]); 4 }/ Z7 c2 H- f
        out[i] = a * 16 + b;
- ^) o, S6 e, U5 ?, P# E    } ) o& s$ d" y' B: W& S7 s  {
    return size; 3 u5 x. E8 S: a" H- w( q, \7 ^
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ( G3 e/ S6 W9 m
#define TEA_H
4 M+ e" o* ^% l; R( a- [: ]0 u
$ r5 O5 I* \1 z/*
+ T% n  i1 l8 J*for htonl,htonl # |" P9 {) F& |0 i
*do remember link "ws2_32.lib" / l8 z! j% \7 l% z
*/ 8 w( b) V2 ^) V2 z
#include <winsock2.h> ; q! T1 n; i; e. k" w) i. V
#include "util.h" ' ], _/ E3 ^4 _! n

  Q2 d- G* b1 k! T2 z+ x3 Mclass TEA { , y$ j/ A& w3 y4 v0 u. K# d
public: 9 c9 E" N# g- g8 T# y% V
    TEA(const byte *key, int round = 32, bool isNetByte = false); . ?' B! D+ m3 d; q# @, f& M
    TEA(const TEA &rhs); 3 {$ W. i/ Q0 H, I
    TEA& operator=(const TEA &rhs);
: N, Z# l  w1 j) Z2 |    void encrypt(const byte *in, byte *out);
" S# {( Z) |, R    void decrypt(const byte *in, byte *out);
. }; N3 v! L" U- _, V- J3 [  y, eprivate: 5 S" |- Q( m  L/ s
    void encrypt(const ulong *in, ulong *out);
; I$ \+ r) n, H/ y8 V) I' t, E    void decrypt(const ulong *in, ulong *out); ) w9 o$ \4 Y3 k4 g& o; n0 S8 o6 a
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
# H, v# Q  X3 X" S! f1 R9 R7 M1 N    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 0 U, N+ M5 K0 \, O8 V5 F
private: . }9 V% f' L3 r3 \
    int _round; //iteration round to encrypt or decrypt & x1 J1 p1 Y5 q  T0 @% {& R
    bool _isNetByte; //whether input bytes come from network 5 |9 T# d; ^! k2 w3 K6 |
    byte _key[16]; //encrypt or decrypt key 4 E6 Y+ s- M! N5 k
};
) p" i2 }# z; p$ _, t- D ! ~6 i: ?# W9 W. z5 v
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" * l. d' ^6 |5 [/ ?
2 #include <cstring> //for memcpy,memset
4 p) T. C& U; U) I- c" Y( F 3  # a* K! Z) P5 P1 j3 g2 V
4 using namespace std; - x' G/ G  G# T% K
5  
: i4 }, y7 R/ i* g( Y! t6 e9 @1 L 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
$ l) D  `1 x5 p: E5 C) ^) [) t 7 :_round(round)
. [% N3 n7 |6 r/ N 8 ,_isNetByte(isNetByte) { 5 j, X+ P+ W6 m
9     if (key != 0) 8 P" _8 G& R8 K* l5 v; T2 P
10         memcpy(_key, key, 16);
! u2 J7 o! ~# S11     else
0 R( S# o7 p& p) G$ k12         memset(_key, 0, 16); 2 W3 B1 h% L3 e0 t
13 } & B+ P) l+ X, J- i4 Z+ H, W
14  : j3 F% @  R/ e
15 TEA::TEA(const TEA &rhs)
$ P( c4 B) ^8 ]" @& {; ?0 U9 ?8 y" M16 :_round(rhs._round)
! s2 V+ [" [5 g; J17 ,_isNetByte(rhs._isNetByte) {
" ~: F; Q- }* l1 O, U) E18     memcpy(_key, rhs._key, 16);
- C4 \! U7 u* i2 V19 }
, m& }, ]# X3 l+ Y3 s5 Y2 j; F5 n20  
5 Z# d+ `! ~; r. K& ^21 TEA& TEA::operator=(const TEA &rhs) { % u7 j3 A" D+ S" G! M& |) F& V
22     if (&rhs != this) {
, G1 y: W% o& Q' R1 b  b+ }$ f23         _round = rhs._round;
4 B5 Q3 `4 A9 a* L24         _isNetByte = rhs._isNetByte;
7 r7 R6 Z1 l6 v5 N( s* T25         memcpy(_key, rhs._key, 16);
; T4 Z" j' A! c1 H9 @26     } 4 Q7 \( {0 q- Y7 }; U1 h5 ~) _
27     return *this;
4 D9 p0 K& n' y# i+ Y28 }
3 T  m' u- P) _  G' `29  
; b0 A6 d/ ~: u  t9 W8 L3 `. ?30 void TEA::encrypt(const byte *in, byte *out) { 2 Q( \( p( X* Q. F0 [& h* ]
31     encrypt((const ulong*)in, (ulong*)out); , R# C$ y- T6 h/ l4 ~5 ~7 T& c
32 } % t, I& a0 n8 u/ {: V; c
33  , n8 x, L& ?1 r) e1 z
34 void TEA::decrypt(const byte *in, byte *out) {
+ t( I0 y  P' u* L& \6 H35     decrypt((const ulong*)in, (ulong*)out);
$ }7 m; r6 o. T$ p& J9 Z2 b- t36 } / D; i: _+ y9 \+ B9 v
37  5 s! I7 Z) i9 C5 a
38 void TEA::encrypt(const ulong *in, ulong *out) {
- h5 E( O' i& v5 p2 S; z! f39  
9 b7 v8 h* p7 T* r+ X9 {- a40     ulong *k = (ulong*)_key; ) P+ I+ ^4 g) w  |
41     register ulong y = ntoh(in[0]); . B& A( O1 V& `4 V- |
42     register ulong z = ntoh(in[1]);
6 ~2 A; b6 j6 ^# a% g' `' M43     register ulong a = ntoh(k[0]); : t# t3 S  E1 O7 F+ U: }
44     register ulong b = ntoh(k[1]);
0 I+ W/ J6 T1 i- T8 R45     register ulong c = ntoh(k[2]);
" W, w2 q1 u# W" A9 G: z46     register ulong d = ntoh(k[3]);
2 f7 O+ ]0 X- K1 A* ~- G; {" j47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ / J5 d* y+ O; Q
48     register int round = _round;   J; P, r. h+ C3 w# L% j
49     register ulong sum = 0; ' f2 _, a. J2 w$ q8 f% }2 L& i1 i' @
50  8 z8 {: f8 \9 O' [& C- X2 H; F
51     while (round--) {    /* basic cycle start */ - g9 x. R6 X: c! t
52         sum += delta; * w. W: R/ _9 I7 o: U9 D
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
3 n0 f5 q' w) ?54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); * V! m: T  F; b5 r% a. S
55     }    /* end cycle */
( m0 r9 @7 {2 W, r6 V+ r* n8 t56     out[0] = ntoh(y); ) R) Z- ~5 S( m  Y5 b+ }$ ?
57     out[1] = ntoh(z);
) Q& O4 n( m% ~) S" v# m+ b$ [58 }
, |% v: L# O! s1 t( f59  ! \5 x( x- _9 X- \6 V& J% Z
60 void TEA::decrypt(const ulong *in, ulong *out) {   j* E- W( F& x& J2 A5 ]+ p
61  
2 G7 j' B1 a' E: s' ?: {* g62     ulong *k = (ulong*)_key; / u6 P$ v5 q% S" g
63     register ulong y = ntoh(in[0]);
6 O, `' t7 ^# g/ V5 {64     register ulong z = ntoh(in[1]); ; {2 S0 U! W" W8 @  C! W
65     register ulong a = ntoh(k[0]); ; W8 n( T; g. X: c
66     register ulong b = ntoh(k[1]); - N( J: ]. `" S6 Q2 U% ^5 \* j
67     register ulong c = ntoh(k[2]); ' \9 p% x6 I8 t8 r" M# r
68     register ulong d = ntoh(k[3]);
/ p' R2 }6 E1 b$ ~69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ( x! d, I& I2 Z5 j, [
70     register int round = _round;
8 S' }' {# Q" ~71     register ulong sum = 0;
7 Z7 E6 Z; [* \72  
! d; o5 v) E. N2 q' b+ ?0 G73     if (round == 32)
6 e. I  P: K: e4 r74         sum = 0xC6EF3720; /* delta << 5*/
  C+ s* t: U8 b- y+ _$ ^( _! x75     else if (round == 16)   b' R" W/ p3 d: w/ w" M
76         sum = 0xE3779B90; /* delta << 4*/ , z3 i3 w3 a3 H! D* @
77     else
0 t. q8 T! x, s0 X3 O78         sum = delta << static_cast<int>(logbase(2, round));
7 {7 U  {- w0 A* h. l) b  M79  
+ A" a6 M( K3 \) H" U1 B8 E80     while (round--) {    /* basic cycle start */
$ T: z! x; x9 j- q# B# ]1 Q81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); " ]+ c' O3 a- }& z+ V6 l1 H
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 0 n* g: o" S3 B
83         sum -= delta; ( m4 m1 D; O! h, y+ x
84     }    /* end cycle */ % y& d1 Q$ x8 D" J8 _+ y- w8 D' A0 g0 \
85     out[0] = ntoh(y); / W$ N: X* [: R; t5 k5 |
86     out[1] = ntoh(z);
, R' K0 O( j3 @4 N+ [* R87 }+ C- n/ t, g6 d: s: d( w

5 \* s  [0 {+ t- |- f( _# T# n需要说明的是TEA的构造函数: + H/ A, ^, u" @$ H3 x: Q
TEA(const byte *key, int round = 32, bool isNetByte = false);
) G0 P; t7 h3 E6 d; B$ h1.key - 加密或解密用的128-bit(16byte)密钥。
: V: a: O5 c) q2.round - 加密或解密的轮数,常用的有64,32,16。
5 v) `- z& f8 J- o0 B+ g! F3 D3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
7 h/ y- `% c% q8 P# N7 Y8 V- o+ `
; r9 Z& w1 m+ F最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
+ ]4 r, ]7 v. J9 S3 \+ g6 `0 L 2 #include "util.h"
# K0 {$ e' J" V* C, }7 k 3 #include <iostream>
5 w. O2 X1 R; N3 T 4  
0 t: M: P* D' w. R2 h* K. b: e 5 using namespace std; 5 p) v$ U3 ]1 [; I, Q6 ^8 U
6  
6 W2 }$ O& s! v# o/ w8 q 7 int main() { ' t, A6 D9 r  ~7 U
8  
; L$ M  z! l+ C+ j% Q 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
3 Z" w: q- Q+ c8 T& L5 g. A& X10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); . a' f7 W( o4 r$ m  c
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 4 X  k9 x8 _" w% B- ]4 _  o9 z# a
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 0 p2 N" Q/ {/ [& I1 R7 P0 }( ]
13    M5 n9 p6 r2 B
14     size_t size_in = hexStringToBytes(plainStr, plain); : [  m2 e/ k7 s( `( q6 R6 A! |
15     size_t size_key = hexStringToBytes(keyStr, key);
# S0 y9 ~/ P7 Q* a: a16  ; {7 R) ?: O% H4 `. G9 m
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) + D7 R" u/ K2 g, K3 a& x
18         return -1; 8 k3 n, r$ T* `' a# Q8 M: q$ _
19  / U( ]# @* P7 ~% r& }, I, i* Z
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; / Q, D; X# a; Q. z* v4 G
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
" ]: C0 z9 g; O" [! ~22  5 i: v9 r8 b6 C) {8 }* E
23     TEA tea(key, 16, true); 6 f6 [" ^5 Q% U9 D% m! Q& u
24     tea.encrypt(plain, crypt);
+ A* W9 [$ f7 T- j% J: K  g/ O25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; . u" U' ^4 R+ I2 X, k  I2 S
26  
- S" r5 |6 m. w* @27     tea.decrypt(crypt, plain); * B+ {9 r. O" I9 \/ k5 ?" S
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ) H1 h0 E* e% k! s& B
29     return 0;
$ c) N% s0 ^8 K( _/ w: L30 }% `" Y8 h! A! Y, a7 ?
  ?7 T& V: u. G& e
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx" N5 i$ p4 ^& e7 n; ~3 e& ~, [9 I
运行结果: + z( d% e) q8 ~
Plain: AD DE E2 DB B3 E2 DB B3 : x4 L% ^5 @" S& I1 b) Z4 B; I
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ( p/ }- Z1 B" V2 }! w/ G( Z
Crypt: 3B 3B 4D 8C 24 3A FD F2 ! o$ Y% Q2 y* E
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-30 02:54 , Processed in 0.024639 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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