找回密码
 注册
搜索
查看: 37534|回复: 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轮):
* @1 z* h8 I4 s: d* G+ h% o微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
3 e$ g/ S! @$ g1 O5 ZTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 6 \, M0 M' J4 i
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 0 E$ z$ m9 K7 W$ i
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
' q& M) l7 r& 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. : _; I' ?0 D' _( Z" I& j# g5 R
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ' |5 e9 C. r3 g! @$ @5 K6 J
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    6 W' C, u; _  c2 C# Y5 _3 I9 O
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 0 r. y5 a, c( Q" f! a; l
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ( o% e! ~: b! ~* y, B- L: w
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ : I2 ]  C/ J  J. B7 o: g) I3 X
  7.          sum += delta;
    - K( e  n+ }) ~
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 9 q* f& y6 d& F2 F* y. I% I
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ; F9 f- Q' }' |+ x( ]' C' ?
  10.      }
    + o! S" p7 ]4 Q. N$ w! a2 d" g
  11.      v[0]=y;
    $ z0 U0 @' F8 i0 Q. m
  12.      v[1]=z; : H  I% C2 P! t2 \
  13. } 5 \2 C+ l  V1 G
  14.   
    / F$ e& ?( R* ?
  15. void decrypt(unsigned long *v, unsigned long *k) { % F- ^9 W$ U: V# t; }) j1 o
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    0 f+ y! u, ^2 G6 H
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    8 k; }2 v  n8 e* q4 r- B  A, i
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 6 R8 x& q+ ^: `+ e! W2 z+ }
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 9 s5 l, P2 B# T) H7 W4 ]9 O' U+ v
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # k+ n/ A0 d& d; h! u, R# ~; a2 u
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & O' I2 R! L, p2 B
  22.          sum -= delta;                                /* end cycle */ ; a5 j9 T, S1 i; c3 m
  23.      } / R+ d& h1 I7 e7 {% s
  24.      v[0]=y; ; Z0 y# o% E! p
  25.      v[1]=z;
    ; l. M" ]0 L- k, v# F, T
  26. }
    0 A4 L# Z/ P, p, T+ L# D
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
: o' a( t8 _& `2 m#define UTIL_H 7 p; B: _$ q( B* D4 j) O/ ~% S  d

$ k& h3 T! S1 j% @% K8 B" f#include <string> - v1 B+ S3 s/ m) w  d4 d
#include <cmath> ) I' d( ]& A+ Y6 ^- w, |
#include <cstdlib> 8 q( W' n' W" U- e; w) Y
& J2 _8 v2 @4 o7 a
typedef unsigned char byte; & X7 y$ {( J1 |& E! V0 q
typedef unsigned long ulong; , d' @4 K. u0 x6 I

/ a. I$ S% q2 a" a0 p2 e; Pinline double logbase(double base, double x) {
+ U/ ]3 k; W: m& U- Z4 O    return log(x)/log(base);
' N0 k. h) b) H8 L: _( e- k}
! t. N/ b1 ]( i! e : y$ Q4 d6 y8 F1 n9 w; D
/*
; \% I# w$ ~; X*convert int to hex char.
" u0 [' _' T7 [% N*example:10 -> 'A',15 -> 'F'
0 s% B9 B3 w! f( U( m2 F*/
& ?% w3 i/ J4 dchar intToHexChar(int x);
6 D1 n$ O2 ]% C, W, g) K 0 t' L6 d6 ^0 `- `5 ~
/* . |0 T" }, V: Y  e+ X
*convert hex char to int. & i# {$ l/ A9 r" L; q: ?, z$ u5 y
*example:'A' -> 10,'F' -> 15 + b9 g% R5 p; J2 n2 H
*/
% u# T6 E$ t; ?) k0 Zint hexCharToInt(char hex);
/ Z/ F" H' m9 m" E8 m1 R 5 L2 r" ?. Y, b6 J0 M9 S9 E
using std::string; " M) ^7 I0 S& W
/* 6 d1 s. P2 _7 Q/ B4 M9 K5 T! u% R
*convert a byte array to hex string. 2 h* J. p( g  ?% J
*hex string format example:"AF B0 80 7D"
/ c; f# J, s: m- }! k*/
" H5 `) f9 g( |4 z. U- r3 vstring bytesToHexString(const byte *in, size_t size);
$ K) d/ H: J; _6 s' T 4 M$ X. M+ v1 n7 A
/* 1 u$ D$ R: {- G" O, p8 m  T. m
*convert a hex string to a byte array.
5 K" t- P0 w* `1 K' N1 s  Y* w*hex string format example:"AF B0 80 7D"
0 x" v& X  A" M; Y) d/ E; {*/ 8 e. n) V; ?2 N7 N' s
size_t hexStringToBytes(const string &str, byte *out);
  m% J* z+ |" ~$ c- q
: |5 a: N2 a8 A& t0 z#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 8 r* ^- I$ P' c: C" `  C
#include <vector>
2 o* H; `5 c* M
; l# k; x6 T. }9 n) Z, |7 z1 Pusing namespace std; ( d9 O' m- e$ D- J3 p

! v  n% S2 E* A( nchar intToHexChar(int x) { : c+ @& `/ y8 @$ f# Q* a
    static const char HEX[16] = {
5 Q0 I9 R; W1 _, f, p1 S3 [& ?3 I        '0', '1', '2', '3', ) z8 c" c% J! B! N2 ^9 w2 }  C# a
        '4', '5', '6', '7', / w# _' F5 T& r6 r  K
        '8', '9', 'A', 'B', - w0 p" O! ^5 J5 H% ?
        'C', 'D', 'E', 'F'   o5 ^$ |  T8 e: x# Z
    }; $ y0 w+ D2 S- p
    return HEX[x]; $ s# {) S  L5 M1 h  }5 X
}
( y2 V- n1 g" s2 ~ % C; _; j; _$ [# \
int hexCharToInt(char hex) { 7 M, Z- Q8 d0 l1 T# ]2 y
    hex = toupper(hex);
6 X; D- f. P; _* f    if (isdigit(hex))
  m* O6 h5 T" H/ N  _        return (hex - '0'); . o2 m: L& Q' k
    if (isalpha(hex))
' s- C; s, |+ }: q/ F4 z        return (hex - 'A' + 10); 9 C2 O2 ?: @7 i- i3 \1 ^4 C- T
    return 0; ; ~" `$ q6 _" D9 S% a$ e
} + O4 Z0 l# c' t. c

; d, s7 s7 ]0 \3 F: W) E5 j5 Wstring bytesToHexString(const byte *in, size_t size) { " x4 ?5 |9 y/ M9 y
    string str;
: i- n; l6 N. e8 W% e, I. _4 y    for (size_t i = 0; i < size; ++i) { * d" q5 t6 r- `
        int t = in[i];
1 M5 z1 s& Z2 U9 n+ X! |9 v        int a = t / 16;
5 a  T: _; m9 q" f# Y        int b = t % 16;
  t3 x& z  p1 K6 O9 d. s/ J        str.append(1, intToHexChar(a));
5 l6 G  }' g: l- R        str.append(1, intToHexChar(b));   F5 t5 ?0 [, ]
        if (i != size - 1) , w6 d. w# u3 S/ C( i2 W& @
            str.append(1, ' ');
, w- q. j( H! J. I    }
" o, I8 E7 ]. J1 M: p# n5 |    return str;
, Y8 P/ B5 y3 B7 P}
+ [' ?/ o, V3 G% z' ?: u
% O' E2 I2 q$ x8 D/ Asize_t hexStringToBytes(const string &str, byte *out) {
' J  v# z9 @1 X2 y- m6 Q1 [9 Q & G2 J8 R: ~0 O0 x
    vector<string> vec;
+ ?: Y+ [% k( }4 S* `# p3 H    string::size_type currPos = 0, prevPos = 0;
, b& y2 g5 u+ e( s: {- h    while ((currPos = str.find(' ', prevPos)) != string::npos) {
' w+ x4 W2 n, F/ G/ b# K        string b(str.substr(prevPos, currPos - prevPos)); - S3 B( z+ D6 q4 q+ h" Z3 V
        vec.push_back(b); & i: C" d/ j& w& L+ h4 O' K3 T
        prevPos = currPos + 1;
( A& }' A$ ]& U- t- p# S    }
0 S0 ^7 i1 {  o+ K# ^    if (prevPos < str.size()) { + C# w' l$ K& q0 w8 A% k
        string b(str.substr(prevPos));
3 ?* \4 u% U/ \; B0 G        vec.push_back(b);
: M4 k9 b" m9 a; y" x8 ?  S' ?    } 6 R1 [4 N$ G' f( x! w1 M8 y3 [& f. w
    typedef vector<string>::size_type sz_type;
, M& q% {3 O/ H) k# S    sz_type size = vec.size();   [( M/ j, f) e( K$ g" t* a
    for (sz_type i = 0; i < size; ++i) { . c2 U" t4 Z  m, P
        int a = hexCharToInt(vec[i][0]); ) v2 A8 Z6 d3 n5 {. o3 Z* z
        int b = hexCharToInt(vec[i][1]); 3 x# Y2 S% p/ z$ K# u, {6 z9 \
        out[i] = a * 16 + b;
0 l- E  h" h5 z* G    }
3 \6 ~, v0 N" c; H* H: X, Y; z; Q    return size;
& ~" e7 ^4 U! W2 n: ]) u}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H % e7 w3 Z  c1 Y3 x+ L
#define TEA_H 0 I0 Y5 J! Z) }5 v
2 i9 o, k( u& _' n
/* $ i4 ]; z/ S" G' \; f
*for htonl,htonl
( C: ?0 U: P/ z*do remember link "ws2_32.lib" . K5 U( n, P  N0 E( b
*/
8 B+ B7 g1 U7 s, X/ v8 U#include <winsock2.h> 4 T1 r, `: I3 P- }+ O$ C
#include "util.h" 0 Y2 @' A: B$ b, D* a- l& o4 l
$ E; v1 n2 A7 N8 Y& Q
class TEA {
. a' }+ o3 |* G6 z' r6 _! {' b7 ^public:
/ m% Q) K, U$ B$ W: \- i" v4 F    TEA(const byte *key, int round = 32, bool isNetByte = false);
$ Z& M3 u6 f9 P    TEA(const TEA &rhs); # G7 O. \- z# l3 B( Y) [' X
    TEA& operator=(const TEA &rhs);
: j. M1 R, j& L* b* S( o4 e( F    void encrypt(const byte *in, byte *out); 6 U; _4 k( N. ]/ g- L6 O  Y& g
    void decrypt(const byte *in, byte *out);
9 e! l4 u( w. z' V! d! Tprivate:
4 u" A7 y! T1 k    void encrypt(const ulong *in, ulong *out); 0 j: a8 W$ E& }, y3 b+ r: m4 C
    void decrypt(const ulong *in, ulong *out); - f. f" W1 R6 t
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } % @8 H& c) ~0 B) F
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } : d1 T% t1 J, V' N# v, r4 J
private:
/ \' f4 K6 _2 T7 K) ^$ O; Z    int _round; //iteration round to encrypt or decrypt , ~. K& y% X: @6 F
    bool _isNetByte; //whether input bytes come from network ; m/ J  a# B8 z( O$ M* H# G7 r5 C
    byte _key[16]; //encrypt or decrypt key 0 l) z! _( }6 \; E, X4 ?$ G6 X
};
8 C1 v, \! E( T+ |/ T
) D, X' J7 l4 U) O! k  A5 G#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
" Z. P2 e# l% N! q! s" N  R 2 #include <cstring> //for memcpy,memset
. b9 K6 F4 y  m( N$ E 3  
- v; G. j4 }1 g, }  t4 W 4 using namespace std; 3 }( N& i7 P. l) @% g2 R( Z; c
5  
( H9 `. |) R$ V( Y) u" n 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) % `$ o0 m1 w" b, [/ Y9 a+ t
7 :_round(round)
7 x0 p! x0 q; u- c7 l4 ?) D 8 ,_isNetByte(isNetByte) { " @3 J( h; ~! i
9     if (key != 0) % B: o  Y6 E) g
10         memcpy(_key, key, 16); ) ?( v  \2 z: y
11     else 6 @" d$ w0 u1 C& k  x! A# F) i
12         memset(_key, 0, 16); " r/ K( b; i8 J6 e8 S2 E9 B
13 }
3 s* R4 F- P# h+ T+ ]/ j14  4 I0 s) d- a1 u; R) O% m
15 TEA::TEA(const TEA &rhs) % k* W* m. k( z) t% z  S: F
16 :_round(rhs._round)
2 V/ M/ X$ {9 p" W0 ~17 ,_isNetByte(rhs._isNetByte) { ! |9 i; U& R) ^
18     memcpy(_key, rhs._key, 16);
; K/ F% D. f. [  t$ G19 } * H3 d6 s- A! \( O
20  $ O7 n9 w4 v5 }" ?
21 TEA& TEA::operator=(const TEA &rhs) {
' \8 A) i) x0 ~22     if (&rhs != this) {
" l& ]5 W' t- r: `23         _round = rhs._round; * [7 L6 ^/ o* \8 Q0 G6 a, @. J, Q
24         _isNetByte = rhs._isNetByte; 9 k' Z8 U7 f! }3 b
25         memcpy(_key, rhs._key, 16); " H/ K2 `! C; G6 j
26     }
! X  Y0 }" ~0 L/ L27     return *this;
) L% N& Q# D, e: o+ t- K28 }
2 r' V1 i* O9 L0 j29  4 i( a9 ~( u# |
30 void TEA::encrypt(const byte *in, byte *out) { - P4 U! }# w# e& f. i) @
31     encrypt((const ulong*)in, (ulong*)out); 1 r2 J! ^- K) P& W% E" C- j' T8 x' J
32 } ' v2 E  y- s2 T& X: W( n+ ]
33  $ h8 w2 `9 G- C8 |7 f: w4 H
34 void TEA::decrypt(const byte *in, byte *out) {
! h* n) g( @* s$ Y" O0 B+ k4 r8 j5 P35     decrypt((const ulong*)in, (ulong*)out);
$ R! T' u+ W- s4 A3 S36 }
7 M  `( I/ ~* l/ ^+ ]9 W37  
( S" f4 B: L6 C9 M! d( L38 void TEA::encrypt(const ulong *in, ulong *out) { 9 R  M! E! n* q/ _7 E
39  . H/ ]- a+ ~0 O& y& U# A, d
40     ulong *k = (ulong*)_key; 1 @7 E/ {- H# h. L. T
41     register ulong y = ntoh(in[0]);
4 C) z$ T4 i0 z, K0 x' z1 k2 U42     register ulong z = ntoh(in[1]);
& w; `" ^/ [; Z8 p$ s0 ~43     register ulong a = ntoh(k[0]);
/ A) i4 v& ~. m* ?1 ]44     register ulong b = ntoh(k[1]);
5 H) a, `7 @' L$ A& |45     register ulong c = ntoh(k[2]);
: S& k( u9 a% w" K: w46     register ulong d = ntoh(k[3]); 5 d9 W+ ~$ ^4 R  B0 q
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ : F" ?7 F- F! S3 q
48     register int round = _round; " g/ X& \8 ?  \4 \$ x0 H
49     register ulong sum = 0;
+ C& \* I* |8 }1 \3 e% T" [# o50  
& u$ Q; ]+ B  j. u2 T; C) r51     while (round--) {    /* basic cycle start */
0 ~1 d" t7 |9 D  o52         sum += delta;
2 x3 ?% y) v7 F8 g. ^! Y53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
2 K# L/ V# u% ~54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); * a' F( H) h- {
55     }    /* end cycle */
+ h) s* |% M" G* Y/ ?56     out[0] = ntoh(y);
# @! H9 |7 z! q4 k0 U1 F5 _$ X57     out[1] = ntoh(z);
$ S7 \0 l, \8 H5 W( Q& H2 y( q1 }58 }
& W+ Z8 {9 ~9 Z  j% w59  ) l  |% ~: v; {* d0 n3 f
60 void TEA::decrypt(const ulong *in, ulong *out) { 6 |7 w) n6 @% r" y. t; H$ F! j
61  
$ A  A& j  V& \) F62     ulong *k = (ulong*)_key;   @3 V* E. g" G* R
63     register ulong y = ntoh(in[0]);
6 m$ o8 E+ Z" n8 |- z64     register ulong z = ntoh(in[1]); 5 Y- s* O  V, I' ~
65     register ulong a = ntoh(k[0]); 4 ]; w( b# ~  `# Z+ c3 E) t% _
66     register ulong b = ntoh(k[1]);
$ S1 L" M2 U0 b7 W$ I+ i3 ?2 B. E67     register ulong c = ntoh(k[2]);
& a, b0 V+ u. X; l$ e0 L: `68     register ulong d = ntoh(k[3]);
# L. }2 e! p: e% g; X6 z: W; F69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 6 P" j' t( ?3 R0 u- ?
70     register int round = _round;
6 w! }* M2 x2 q71     register ulong sum = 0; + p% S  M, S6 h! a& D& u- J- A
72  4 ^' z* S. c+ z0 ^
73     if (round == 32)
1 I. g7 D8 @' O' c2 L" e74         sum = 0xC6EF3720; /* delta << 5*/ 3 [6 F' I* F; m2 H/ @
75     else if (round == 16)
7 `0 H5 d# d4 k. N76         sum = 0xE3779B90; /* delta << 4*/
: C  `1 h3 z2 f8 f3 q+ Q  x* S77     else
) A3 A& N  [) ^& B  A0 `78         sum = delta << static_cast<int>(logbase(2, round));
5 Y2 d9 L/ `1 f" R4 ]& K79  
" d! u& k* a& m80     while (round--) {    /* basic cycle start */
; `" U9 ^- _3 Z7 _1 K3 Z& v; _81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
5 [/ c- p8 V3 l, h' B, B) I82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
& V  c2 G5 F+ k0 @83         sum -= delta;
4 j  U/ S8 c- V" f) k/ O- O84     }    /* end cycle */
0 I6 s0 B$ r4 Q; O7 B: g8 o* t& a85     out[0] = ntoh(y); ' e/ U# V5 B4 k8 A; a: g3 C9 _
86     out[1] = ntoh(z);
5 g) `. L- {4 Z3 [87 }
* b2 S5 {* @' V6 Q. F" }" V
4 \. H! }) H0 h需要说明的是TEA的构造函数: , D5 c' t- B' o% g; j* S" s: x
TEA(const byte *key, int round = 32, bool isNetByte = false);
" L# N- A/ @$ P1 Y$ S  K; }1.key - 加密或解密用的128-bit(16byte)密钥。
$ n) T9 f) x; V2.round - 加密或解密的轮数,常用的有64,32,16。
/ u6 g% X! @9 H6 C! g3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 2 ^* x9 p# y- T, O4 F) B

7 O( _. f' q. @最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" . V# E7 a, B- B6 u% I
2 #include "util.h" * d7 n7 @! g; q  t8 F
3 #include <iostream> " [: `; ?  z/ h9 C- X) {% ]$ @% p/ |4 f
4  1 |2 _- b* z: o. V* o
5 using namespace std;
6 M3 _% P) ]5 W& K5 [ 6  
9 a7 _% F" q& ]# A# q: o8 o! ? 7 int main() {
, p; W1 f+ p% V& J* A 8  
; {, s, x2 i7 Q- b4 C5 a, W8 ^ 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); $ l' R8 m$ T* D- }7 S9 L, @2 G) ?
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
. o  R) Z7 ^9 X11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
5 Y7 Y0 p1 C/ c" c( g; S! V12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
: j" h$ L5 g4 |13  
; J' j6 E. a) |3 Z$ H: z  M14     size_t size_in = hexStringToBytes(plainStr, plain);
  v4 X% d2 K( c- E  y. U15     size_t size_key = hexStringToBytes(keyStr, key);
" h- T" g8 c& W* l. k16  
- c/ E# E5 ]) U: N3 ^1 N+ ~% S17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
+ f  J$ _  q5 h5 J* @* k3 @- p18         return -1;
- H: `6 {% a8 G% p, W19  9 E2 b3 F  J' ]$ W/ `
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
9 C" H$ b$ a2 \- b, S8 [21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
1 L9 \- h$ d2 T4 \2 U9 a22  8 P' I7 P( b/ j+ V
23     TEA tea(key, 16, true); 3 G: t6 Y/ U: D6 h. ~8 O
24     tea.encrypt(plain, crypt);
! C: b* q6 ~0 o25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; . M) U: K5 A3 D1 ^6 Q
26  3 M% Y- ]+ W1 Y1 y2 |7 e- F# ?
27     tea.decrypt(crypt, plain);
) Q# [  P# K/ p28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; & K5 u  T  }$ t. q
29     return 0;
- q  K. p4 }% e! e30 }; J6 K) |% c4 X2 F
  }1 S# P' @8 _6 U2 t' T1 s
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx3 L& @- Z+ V5 I/ G6 Z& u3 O3 L
运行结果:
5 H  b" o# t. e& ^Plain: AD DE E2 DB B3 E2 DB B3
) A$ _: R6 p8 F, J7 M& AKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
7 H0 V# R1 Q1 e! n: |" d. RCrypt: 3B 3B 4D 8C 24 3A FD F2
+ g" E& p0 V& t; K5 `& ~9 cPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 13:31 , Processed in 0.020511 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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