找回密码
 注册
搜索
查看: 37885|回复: 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 G. L' K9 v+ M  h0 L) N微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ' B$ Y/ Q- a: B/ C0 ]& d
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
" o  N7 I9 P8 F4 b之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 8 w( C' v7 K' o. h& w' h
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 / f! |  ^* p* |# Y" _
在 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. $ X" L# J3 u( I( [0 }( v
  2. void encrypt(unsigned long *v, unsigned long *k) { 7 S& {2 g  z; _% W  U3 `
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ $ c$ {5 h& }" ^- ?$ f, S& \) `
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ " u- m7 T7 V! l' r* u
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ + ^9 _0 y5 G# b- V
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    3 v# f6 ?7 W: m9 X1 m8 m1 S
  7.          sum += delta;
    , k3 b5 w9 b* n3 M
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    $ g8 C# G* {( H' k  u
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ , o: z5 |; [, j7 X. U6 S2 _4 [/ N% q2 r
  10.      }
    0 R" q. c1 ?: H4 _9 p. g* g: X
  11.      v[0]=y;
    % I: O8 r0 ~. R, B2 J" Q" ]
  12.      v[1]=z;
    ! S& a0 T3 Y$ m2 Q4 D$ S5 D1 y
  13. } & X0 p& K( y5 [
  14.   , N  b3 o% R, U7 n7 P, |2 z
  15. void decrypt(unsigned long *v, unsigned long *k) { 2 J8 L7 |! T- ^: t' Z2 [
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    $ F! ~& u+ ]9 a/ ?4 K% O
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 4 r' J8 f( k0 M' o+ ~  r& D
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ' I9 u( {2 v" w8 v* y8 c: H# z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    5 i. p0 l7 U6 q. Z4 S' O3 x4 I
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ) {; M, A! ~2 a) x4 p) l+ ]
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); : I6 l; W9 @6 \0 X
  22.          sum -= delta;                                /* end cycle */
    6 U+ s2 L' I' O" t+ |
  23.      }
    ; }% ]" f. a. q$ O- T* }) _
  24.      v[0]=y; $ ~$ H6 l1 x0 P8 p
  25.      v[1]=z; # K& [$ [% S) c' {, {- Z
  26. }, i. f& w  V3 ^- R# S8 J- e
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H " N* S, x3 c8 m. s! M7 q$ d9 B
#define UTIL_H 8 E4 [0 q8 _8 ]6 C9 ?

& K/ {" y  W% ^' H/ F#include <string>
7 T# {6 g, j* q/ H: o' I6 O( d1 Z#include <cmath> % x5 y; }+ F5 J0 L! e
#include <cstdlib> 6 |3 l1 u- Q: S

+ m6 j3 a$ n3 l9 C( Stypedef unsigned char byte; 5 p9 H- D) y2 r1 `4 \
typedef unsigned long ulong; - [3 v+ @' U  W9 i9 h7 u& u+ P8 D
  T, w9 Z; {; v( Q5 T
inline double logbase(double base, double x) { ! k7 U: b$ p9 C5 N5 ~
    return log(x)/log(base); , @7 |# D; T# M. Z$ j
}
# n" ^5 c& ]$ K/ c$ ]9 w5 J4 n% } ( V1 V- k5 I+ y  V: o8 [
/*
: Q) Q7 X. t9 C+ P8 `. E8 `*convert int to hex char. $ I0 G' D* I" n8 Y+ L
*example:10 -> 'A',15 -> 'F'
8 e& I: O: D# _) ~*/
: t" ?" u$ A( B. Echar intToHexChar(int x); ( ~/ a6 s: l8 k, F" y5 a
8 ~" C7 B, F- c7 m6 o. q& T
/*
( R2 D# C$ @: F) m! B*convert hex char to int. 8 L! ]6 w- A  s1 T: |3 Q: F  N
*example:'A' -> 10,'F' -> 15   G4 [# @  \! P% t9 i9 g' ^) I
*/
/ P" s% h3 l1 yint hexCharToInt(char hex);
4 Z. z6 y9 F/ d3 U7 D   z  `, l: M' x
using std::string;
6 f0 `) A6 B) j0 d/* $ ^1 h' _4 T. r5 P
*convert a byte array to hex string. # @) M, q4 @5 F  F" U
*hex string format example:"AF B0 80 7D"
& J  T2 \$ U9 _8 m" U( d*/ 7 k) S5 K+ M% X8 \% ~% P
string bytesToHexString(const byte *in, size_t size);
5 f) J$ W9 t7 O9 @ + l, p# O: Q1 ]; y! e: Q" `
/* $ e& C  ~" U5 R# E
*convert a hex string to a byte array. " I+ `4 h3 p4 L) h: ^
*hex string format example:"AF B0 80 7D" ' @5 M5 U; H- h: \  u2 T
*/
) g, l7 h$ j3 O6 j! p4 L" csize_t hexStringToBytes(const string &str, byte *out); # p6 I9 G( S: B% [# c- w( _
+ x" @, d  T0 v( Q: v: E: X
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" + k5 H* S* s% b" j* b9 ?$ Y* ~
#include <vector>
0 n0 l0 S, B( i7 S 6 a  `7 ~' G; G0 T, l' C/ C
using namespace std; ) h& c0 v) z: k- j& y
& I% t, O, `" p9 o
char intToHexChar(int x) { / R  E9 y6 P, L4 D& @8 \
    static const char HEX[16] = { 0 P. H2 M, q' k1 B
        '0', '1', '2', '3', , f$ G$ q) J& _5 l
        '4', '5', '6', '7',
$ `' f2 _6 O- [/ T9 U: }        '8', '9', 'A', 'B', 7 W0 L- B, x3 B
        'C', 'D', 'E', 'F' ) @% y, p/ I* R5 L' L2 g9 b0 }( H
    }; $ |' b5 G0 r9 G. r3 Q+ x6 K
    return HEX[x]; ! ]9 }& x# x" f# `
} + k8 t$ m. T, y! H
) ]$ p4 b6 U" R% H! Z: Q
int hexCharToInt(char hex) {
9 x: [# k2 k" Q; O' e9 @    hex = toupper(hex);
: p; O6 P; i( x+ m: b    if (isdigit(hex))
! X' ~0 h: f( j# [, T        return (hex - '0'); 2 e! K8 |! B, S  K& t0 Y( a, C. F
    if (isalpha(hex))
1 m9 [2 ]0 M! L" s) F( s        return (hex - 'A' + 10); 5 X  L* J8 {" ?- j* c
    return 0; " H# t8 v* N% T
} 2 s+ C% p7 l7 K  I, s! `

! L, V% r( N. V4 j; Mstring bytesToHexString(const byte *in, size_t size) { 2 A; A: f/ R3 z/ n
    string str; # m! e' w- X) f+ u! u7 u
    for (size_t i = 0; i < size; ++i) {
$ E" h. F0 S) _9 U0 i        int t = in[i];
% c/ {5 K( \( w1 ~; d( N7 B6 Z        int a = t / 16; . J, s, O3 \" u8 E( @7 ?# l7 m! H
        int b = t % 16; - A8 N. j; f& D6 l0 |
        str.append(1, intToHexChar(a));
& R- _9 W. y1 f- _/ \& b        str.append(1, intToHexChar(b)); 1 L: |$ {8 h2 R! j  V1 r8 V; F- e
        if (i != size - 1)
6 F2 \& ~! n! a6 {0 N2 O! S; U            str.append(1, ' '); 4 t0 w0 o6 _, G8 P# m% f% Y- w
    }
+ w1 M. Q; u9 ^& \    return str; 7 d, I* l& p0 o9 r
}
/ O! h, E) h3 ?+ {) J, @) H& b ) T' D7 b5 J  i+ v" U
size_t hexStringToBytes(const string &str, byte *out) { + S3 C9 |1 ?7 x8 T. x6 X9 B( f
' _* p1 R* h2 G# M0 y" r
    vector<string> vec; 8 E+ V& U0 K9 G4 u6 Z
    string::size_type currPos = 0, prevPos = 0; $ j! s+ U2 t/ V# i
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
- W' b+ P/ P+ O: a        string b(str.substr(prevPos, currPos - prevPos)); ( V' c" x0 z, x9 x  K+ r: Q* v
        vec.push_back(b); ' W3 R) l6 Z. d8 n6 K' ], {$ Q
        prevPos = currPos + 1; ( i* k+ T( W7 E
    } 0 c) d; U: \. ~! v: k# j' f
    if (prevPos < str.size()) { $ W1 V$ X- _/ g2 e2 ?& _; a
        string b(str.substr(prevPos));
% n% g$ A2 C* x1 ~. C        vec.push_back(b); ; g- B1 b  B' J. x' y! e$ ]. s
    } * p, f8 e9 N- }8 ]2 p+ V
    typedef vector<string>::size_type sz_type;   Q/ X& q" v7 q# n
    sz_type size = vec.size(); - y- o5 W- A  f3 `7 ^$ \9 h
    for (sz_type i = 0; i < size; ++i) {
$ B' P: L0 D; P+ f. h        int a = hexCharToInt(vec[i][0]); 7 m8 Z" I, D( d! C- h! v( X
        int b = hexCharToInt(vec[i][1]);
% S* g" I. r/ F) u+ o7 e  \        out[i] = a * 16 + b;
& q2 u+ z2 M& x- v" A    } , |) f. u3 Y! k$ A4 a% J
    return size;
9 V, B* ]% T! N8 ?- E- r7 f; a6 M}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H - b# z. t5 D  i# {) H
#define TEA_H 1 i2 y4 m3 W: W; O) J4 e& ^+ u

* ^, k; f! g  _( [& o! A: W/*
, J; I; d( T+ a+ Q% c4 L*for htonl,htonl 0 n- t4 |4 C+ e- \
*do remember link "ws2_32.lib"
1 s5 j: s1 ?; B4 Q% C% D* Y% R* c*/ / T/ {" w7 L( a( h6 Z
#include <winsock2.h> 4 p+ J* }: O- q( H2 n! b
#include "util.h"
( E6 I- Y; K) w8 }$ j+ ^ ) T) n& k2 M2 y' ~, F  Z6 c
class TEA {
7 P, O9 e8 m' }4 l  g6 npublic:
% I: F. v. E9 }0 L    TEA(const byte *key, int round = 32, bool isNetByte = false); ; z0 F$ o  c. x
    TEA(const TEA &rhs); % p! u; a1 `; [8 Y9 l: l9 |; F
    TEA& operator=(const TEA &rhs);
7 a( i6 ^% g4 z$ Q$ B0 H6 M1 Y    void encrypt(const byte *in, byte *out);
& C/ C9 m, R; {  f& f( J# A  C    void decrypt(const byte *in, byte *out); % K7 {3 ]7 @. t- u
private:
6 S5 E2 j$ u* z; i/ E  }5 {, @    void encrypt(const ulong *in, ulong *out); 0 `6 s$ b  R/ \' `
    void decrypt(const ulong *in, ulong *out);
* x5 h2 ~- w- J; _+ k. B+ ~7 X    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
( e" i! x+ a- p; G5 a. [" j    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } & g" L* U) A: y7 V
private:
# m5 S3 j" ^) D) i- j! `0 Q/ ^    int _round; //iteration round to encrypt or decrypt
- M( o# Y* n! A    bool _isNetByte; //whether input bytes come from network % P( m2 p% [+ K
    byte _key[16]; //encrypt or decrypt key 5 F8 j& R3 N" I( d) X( Z3 t
};
1 y' r0 ]% t8 Y& [ ' v: z. @8 s2 [! V, X- G0 l( a% K
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"   _5 D2 U, g) {/ s
2 #include <cstring> //for memcpy,memset
6 y$ G+ Y. |4 D/ _( @ 3  
  I( s! _, y. S 4 using namespace std;
5 N: z" y8 D& `2 g) O 5  
6 N9 ^2 [& ]+ _" z: I 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) % n8 d8 s+ U* w7 j4 t! D
7 :_round(round)
/ p4 n+ S- K* @' E/ m9 v; ?9 G 8 ,_isNetByte(isNetByte) { 7 s; Z1 a1 _5 y$ k1 ]! X9 ^7 b
9     if (key != 0)
5 r# \: z7 F, y. \: \9 L! }10         memcpy(_key, key, 16); 3 x( J; ^8 n, K& R
11     else $ c' r" }9 U! @' ^6 B& c
12         memset(_key, 0, 16); ( a; M7 P  {* n" D! i8 C; Z8 A
13 }
) m  J1 v, ?5 u* D* X& {# E14  9 _& S8 N/ Y; R* A3 V
15 TEA::TEA(const TEA &rhs)
* e( }& J# V' h/ Z& C16 :_round(rhs._round)
2 J  |* u4 a1 Q0 R5 q, ?5 p# y& ]17 ,_isNetByte(rhs._isNetByte) {
  e( h- J) Y( X6 D18     memcpy(_key, rhs._key, 16);
% R; v( y5 F3 X/ p6 z; K19 } # e7 u) y% D, z8 o6 r" _0 K4 a7 Z
20  
+ C3 Q, M4 O' H0 v2 _* r21 TEA& TEA::operator=(const TEA &rhs) { ! i" Q! F' @" r8 R$ Y- r: O% \$ @' }
22     if (&rhs != this) { ' Y& T, q, B3 q% i# d. m( w: R
23         _round = rhs._round;
6 q& _* z5 U1 N9 J5 \; e$ ~2 I24         _isNetByte = rhs._isNetByte;
7 l% r! T! P) d% T( D25         memcpy(_key, rhs._key, 16);
$ ^# t/ H6 F; b8 g8 B4 Q& c26     } ( h1 ^: q: \# U2 }3 d  ?
27     return *this;
0 W4 f+ ]; b" k' x28 }
0 ]$ i( h0 @, N$ H3 y/ G29  " b# L; w* W) d$ Z
30 void TEA::encrypt(const byte *in, byte *out) {
' w4 Q  c) }  r( O  G. W31     encrypt((const ulong*)in, (ulong*)out);
0 B6 Y0 t& E. K- ~+ D32 }
- d  O6 U2 M" i8 _' d33  
: f9 [/ S: Z" }" x8 G' v34 void TEA::decrypt(const byte *in, byte *out) {
' a- R# J8 X* U35     decrypt((const ulong*)in, (ulong*)out); 8 y2 e$ N1 e& C+ h% k8 e" Q, D0 Y! Y
36 } $ |$ w+ R5 T, P: H: d& f$ m: f8 I
37  
$ k. s! g2 g$ k# K  ?- F: d; G( z38 void TEA::encrypt(const ulong *in, ulong *out) { 7 O" {1 z# @% a0 k2 g' R
39  # j1 P* \% x) ?7 P+ u
40     ulong *k = (ulong*)_key; 7 G; T# d" P) Z7 k; ~; B( ?/ K. Z
41     register ulong y = ntoh(in[0]); + m$ {, [7 S0 ~% C
42     register ulong z = ntoh(in[1]);
# a/ p: ?* J" w% k  J3 E% ^43     register ulong a = ntoh(k[0]); 1 w, f3 t4 x, W& h# @
44     register ulong b = ntoh(k[1]);
, A% [/ }5 H9 s  F$ {1 u45     register ulong c = ntoh(k[2]); 9 G# \/ q% S, B7 A" S0 s
46     register ulong d = ntoh(k[3]);
9 P  h" |, W. [47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 1 U' D, g6 `& J
48     register int round = _round; ! d$ v( p3 b3 b( A
49     register ulong sum = 0;
2 t; z0 Z& k- o4 f& q3 z' h50  + O/ s  j# y) d# E
51     while (round--) {    /* basic cycle start */
6 l, l+ M$ {2 `) ?" ~/ [- `52         sum += delta; / F, V. s) W- @7 i- T4 i' k5 a  q
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 2 K; Q3 x9 @: x4 K% p$ r! s8 U
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ' K: g0 S2 j9 O* f7 \# p
55     }    /* end cycle */ $ a: f- l+ G. o1 v- z% L
56     out[0] = ntoh(y);
' N' r& @, m( m0 ]/ w4 |- v57     out[1] = ntoh(z); " Y1 V6 y# Q4 ?  Y+ G
58 }
& I, n- D2 d7 u( C59  2 |2 t6 Q) b8 B! _0 p/ d! h) W' J
60 void TEA::decrypt(const ulong *in, ulong *out) {
* g3 v! }0 C- s$ R; _) B! n61  
7 h0 D6 ?3 [) E  Y( [# @62     ulong *k = (ulong*)_key; / H! Y7 J/ n0 l& Y8 U3 d' m. {  }
63     register ulong y = ntoh(in[0]); % w6 y) Y6 a' A8 i2 s) H0 n
64     register ulong z = ntoh(in[1]);
; ?7 V* x/ }+ ^! y) S$ _65     register ulong a = ntoh(k[0]); . x# j- G5 Q* u" A% S3 D
66     register ulong b = ntoh(k[1]); & s3 l% Y$ T" c1 T
67     register ulong c = ntoh(k[2]); + ]- W* `/ q* ^, X* v1 N! c/ A/ s& F
68     register ulong d = ntoh(k[3]); 9 s) ~9 G! a* f; h: G; A; J% G
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
- y& a+ U4 ]6 D% F6 m* U70     register int round = _round;
: p& X: f2 d7 }/ f" X7 n71     register ulong sum = 0; 6 W2 S# W- n0 S" y
72  
" C" }) J- I2 _% m73     if (round == 32)
# Z1 A( W9 u6 l! b' b6 Q  F74         sum = 0xC6EF3720; /* delta << 5*/ 5 X! w# u0 J/ k' B
75     else if (round == 16) / c; c3 Y1 o8 Q% G. q- X, F3 h
76         sum = 0xE3779B90; /* delta << 4*/
0 r$ n1 k( r: ^( u) |77     else
1 k) e. s7 t* N$ j78         sum = delta << static_cast<int>(logbase(2, round));
( Q5 `6 _( _# F7 W* i79  , A7 H8 U# f/ Q3 R. W5 |
80     while (round--) {    /* basic cycle start */ 2 \6 e: Q) e( }( l- O: I
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
  t7 ]7 O" [' V4 }9 {82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
: p& c  l. T7 I/ g3 N9 g83         sum -= delta;
# x5 A+ }- n* G84     }    /* end cycle */ ( W7 B9 v& k6 H  O0 W( {
85     out[0] = ntoh(y);
( k5 u3 D+ z  z7 N7 f/ n* y& N$ w86     out[1] = ntoh(z);
/ J; V+ t  \3 F3 S87 }
8 B- R) P1 ]9 f+ j) e' h! d2 x, N0 P- K3 ]2 C  J6 |, H# r
需要说明的是TEA的构造函数:
8 ~. H* |5 c) N+ v( fTEA(const byte *key, int round = 32, bool isNetByte = false); 7 i5 o4 K- x" I/ v: S
1.key - 加密或解密用的128-bit(16byte)密钥。
8 M' J6 M% a  L) ?0 x( F$ {2.round - 加密或解密的轮数,常用的有64,32,16。
& @2 H, |* F/ i3 s' q& J3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
( E0 u; `* p5 r0 f- I5 Z3 G* ^! w3 i: @$ @  w& n
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
3 s; I- J: r4 s4 k8 u 2 #include "util.h"
: Y$ h; Z9 Q3 X3 |3 c 3 #include <iostream>
7 i, _4 r6 |; l5 a/ R% i 4  
. E! H/ G# C% S 5 using namespace std;
1 j) B6 L& g; g/ w" ~ 6  ( Z% X% f5 \; t$ \) j
7 int main() {
1 _2 M5 u! H; v$ L# w2 @$ o9 q. I 8  
0 Y( w4 X+ a8 X' C8 Z7 `& n! V0 H( E 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
1 S8 P! p' u/ H! I" d% s9 g/ Q/ D10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
0 u* c6 Z2 H$ n$ W11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
5 @  P, Z2 M9 x/ J6 f7 p; ]4 H12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
8 O6 J5 a- O+ |$ d  \: D5 N( Y) {' T) t13  
( n7 a$ D; y$ `14     size_t size_in = hexStringToBytes(plainStr, plain); 1 c" P" _3 @% _* w6 N, m8 C( L
15     size_t size_key = hexStringToBytes(keyStr, key); : D1 l# {  i- L/ {1 T/ K; w
16  - i. @! }5 x6 g# i* P
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) + b1 S9 J. B3 w6 \0 i0 i% _! v
18         return -1; 7 `0 T9 H# o! u/ m' w7 L  E" P0 t
19  7 h) Q' M1 ]) }7 n+ Q7 H, I0 U, r7 }
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
4 R) o; v( ~5 W" p8 ^5 Q21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 1 h( u3 X  f( F
22  
+ P* V8 i) c8 G( v1 t% K3 c& N: n: B23     TEA tea(key, 16, true);
3 m. o! K- d: E0 O& f2 x0 q+ p  l24     tea.encrypt(plain, crypt); 4 p2 B$ B6 h2 A4 g7 S- M
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; * g9 j. L: D6 H, Z& x
26  
! C8 v' W9 w! y* n$ Q& \2 [27     tea.decrypt(crypt, plain); 1 B  A+ g; C4 _6 n# D3 d
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
5 I! R( m8 {5 h29     return 0;
' T" \& Q- n; Q% q3 H30 }
4 T, n% _: ], l; Q! L
: M6 g! u3 q- m8 Y本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx5 z/ Z6 s8 P0 M' A' C
运行结果: 0 J, a1 Z% ~4 \2 d
Plain: AD DE E2 DB B3 E2 DB B3 0 f) g5 d' ?: T( O* X6 [0 G6 U3 Q
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 % |7 A8 h0 `6 ?0 }/ r( h
Crypt: 3B 3B 4D 8C 24 3A FD F2
  j& w( ]/ K% z* W" cPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-5 15:21 , Processed in 0.019736 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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