找回密码
 注册
搜索
查看: 37722|回复: 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轮):% l% d! O% w8 k! {& I9 c
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 , Q" a3 a0 J. g3 H, f
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
+ w2 y0 f/ D7 ]之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
- l9 U- `7 ?! H0 R在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 6 t& E. _' q9 y+ ~, i1 e
在 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. ' a: g3 I# C0 h  C, g. z
  2. void encrypt(unsigned long *v, unsigned long *k) {
    % r  b+ W' `5 O1 V9 y) `
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ( Z+ w1 P6 Q$ y' v. _, R6 v- t
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    - a  M) \: c( X" S- I6 D
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 9 \2 {8 F% m. G
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ) P9 v* U' r; ~8 [
  7.          sum += delta; . s% Y6 t' j) S: j$ s
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); / p. u1 J* d/ t' d- J2 {
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    $ F* y  [4 N* ^
  10.      }
    + ]: O  N$ I# K5 |2 u  F! ~
  11.      v[0]=y; 5 Q* A: L. m" N1 n/ `! L
  12.      v[1]=z;
    ; r& p) |& O! V- E% n' E
  13. }
    ( S5 s+ h6 _! @$ K, I
  14.   
    $ r+ G* I& M; Q& l0 x6 B  x
  15. void decrypt(unsigned long *v, unsigned long *k) { 6 e: c- X' t. l8 J* j; E4 z
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ * S' m% ?" N4 N4 W5 r
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ( V! |1 S. A$ M5 g1 x/ b% M
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 5 i9 w% V6 T) ]
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ % Z2 q' q4 i4 v' r* a' X. D
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ; {( L9 L' g: @* p3 B7 j
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    4 h' M. b. i7 ?1 _9 [4 g
  22.          sum -= delta;                                /* end cycle */ * j& ]" k) W$ [
  23.      }
    0 J) U/ v! y2 ?6 u4 ?, V( a
  24.      v[0]=y; ( _8 J; @2 `% G
  25.      v[1]=z;
    9 ^* a4 L: r( |# h0 w; m( k+ l0 v
  26. }
    9 i% F: Y! Z( _. F) |  o
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H # j) d& d, `+ O! p1 q8 E
#define UTIL_H
8 ^4 v0 Z; z$ M2 X/ m2 k/ |; G' I4 W$ b4 l7 P1 r
#include <string> 0 B) T" I6 C7 L4 R
#include <cmath> / J# w% x$ [2 H$ M. h: u" f
#include <cstdlib> ! A! L1 ]: w" w4 G" [4 Q5 q! Z
+ r: d# v3 u" |
typedef unsigned char byte;
9 S" D* ^! \4 c$ Atypedef unsigned long ulong;
) n; ~& V3 z9 j% l4 T) j ! N0 d' W& P) v, G+ g& D' M
inline double logbase(double base, double x) { ! s4 G& |/ r) C
    return log(x)/log(base); : {2 J6 _% M- q9 B
} ( a1 F7 H: I; A/ k+ a
6 @/ F2 j4 J& K/ o6 I5 I
/* ( O/ Z" P& `* ?) `9 m
*convert int to hex char.
: t9 |* a( E' a( C*example:10 -> 'A',15 -> 'F'
3 a" W. F# M1 @6 Y$ z  U9 p3 L1 u. ~  U*/
/ q& i1 c7 j. ^* o( x" r5 Uchar intToHexChar(int x); , }. n, ?) `# M! z
0 @! C; q% r# L4 Q8 A: O& E% g* X
/* % V& q( |. ~& J* ^8 f# b7 M
*convert hex char to int. 2 Z: A2 S/ E8 o" z. ^9 `1 `
*example:'A' -> 10,'F' -> 15 ; ~( r# v3 f+ t# _2 T) H$ L
*/ 3 ^) `- s/ G( U" D; I! r
int hexCharToInt(char hex); . w2 B8 z3 I7 h( C+ m

: e, T+ X) B4 X5 ]) fusing std::string; % d) m# Q- Y2 J* ^, _% e& b' V
/*
1 a' |/ x9 [3 }" b/ E9 w*convert a byte array to hex string. / Z* g: U: r9 a: @( L6 J
*hex string format example:"AF B0 80 7D" 1 S9 R: H7 r8 c
*/ ' X8 d  t2 j8 E& @7 S7 ]% x
string bytesToHexString(const byte *in, size_t size); 8 u* N3 E. Y3 }( ^

: j. U& T. X+ q! \- x/* 8 \, u1 a1 Y9 I+ ~, P8 q+ Y
*convert a hex string to a byte array.
1 J5 `# F5 ]6 n) T*hex string format example:"AF B0 80 7D" , G+ h( T6 k9 c4 B6 C
*/
6 W% }# a$ I0 a8 A% h$ o; [  Dsize_t hexStringToBytes(const string &str, byte *out);
. K* W3 b2 T! ?2 ^
- {" K) e) T  g2 _) X, e  H#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" : y  ~+ S/ p  {, S2 Q+ I
#include <vector> 7 C' H. H4 N$ O) R4 l/ [; Z
2 C. r2 B9 j. n- W; _( _) z
using namespace std; 6 _- L7 Q% N  m4 H9 @
9 f! t- O+ R6 t4 K6 g
char intToHexChar(int x) {
. o; z2 r5 F( a$ B: i% q    static const char HEX[16] = {
) p- X: Q4 w2 ^3 h: q5 ~1 S        '0', '1', '2', '3', , `% }# w: I0 b  f
        '4', '5', '6', '7', % r2 ~0 L; Y/ ~! X0 b8 {. U
        '8', '9', 'A', 'B',
$ h2 ]) @; n+ j% o% |+ M        'C', 'D', 'E', 'F' ! ~; h0 k- Y2 [7 I6 M
    };
7 e/ B3 z: T0 \- }    return HEX[x]; 4 w  Y; r4 W* G) j
}
% @5 }. _" o4 [( N5 r! L* ~6 @& W 1 r/ p; ~( h, a# V6 t
int hexCharToInt(char hex) {
( j( \9 ~8 m- @5 d5 l! m    hex = toupper(hex);
* A" [% X+ ~" S    if (isdigit(hex)) % e' h4 D0 u, u4 L
        return (hex - '0'); ; c: s4 R# n' \  S0 ^7 ?9 C
    if (isalpha(hex)) ) [! w. \/ r0 L' T0 k( L: Q# U7 o
        return (hex - 'A' + 10); 3 e. v$ g7 c9 C2 P/ C% B
    return 0;
0 l. A' P% F# |, y; m% s& W} $ @! R; G( g- t9 B3 v# u# q
5 b) d0 |* w5 o) ^
string bytesToHexString(const byte *in, size_t size) {
! \; B9 Q, R. E# ^: D    string str;
7 A/ `* C. s4 V! ~% I7 t    for (size_t i = 0; i < size; ++i) {
  {" S4 z5 x- u4 R/ `+ C        int t = in[i]; * R  A" r: V$ S. V5 G# f+ {3 c' J8 i, E9 p
        int a = t / 16; 5 \- g7 U: X2 @: F7 {" S- ^
        int b = t % 16;
6 I& r' Z: K  w, C8 {* S0 d        str.append(1, intToHexChar(a)); 0 v3 i4 h& [* B+ t) L% i
        str.append(1, intToHexChar(b));
& B# A( ]% n! F        if (i != size - 1) 0 ?; k' ^4 g& j( L- i
            str.append(1, ' ');
8 r( C5 }# v; Z9 p) L  g    }   [7 X! L% n! [, B7 [) w6 v
    return str; 7 C- D+ S! ], Y
}
# c& @8 `5 o: ^* I
1 X. s! F. p9 D& Nsize_t hexStringToBytes(const string &str, byte *out) { ) S( U" w* B4 x

( f' b- o: L0 R7 u    vector<string> vec; 7 `1 u% G- z* {0 Y% n/ t  g" J
    string::size_type currPos = 0, prevPos = 0;
" Q! U8 F' M* g0 W+ M    while ((currPos = str.find(' ', prevPos)) != string::npos) {
6 c% {, x1 h: `% o7 k8 v0 Z        string b(str.substr(prevPos, currPos - prevPos)); 2 \2 o1 N- C3 S9 v& Z3 V4 d
        vec.push_back(b); , K7 i; q8 }6 ]. j
        prevPos = currPos + 1;
9 a6 K$ d' g3 T  e    }
' d7 [8 w- e1 D0 H& s* u    if (prevPos < str.size()) {
- F3 c2 K& p, n) Q' v4 {        string b(str.substr(prevPos));
) G# T8 p2 i( k7 @# X        vec.push_back(b); * a: \  X# b8 z, {  t, v- l, x/ a5 O
    } $ ?. `# ~/ [3 M& @8 C
    typedef vector<string>::size_type sz_type;
2 K0 ?, O6 y4 `; b; P( T6 X* v    sz_type size = vec.size();
- Z) m- v5 ?! [: H- b    for (sz_type i = 0; i < size; ++i) { 6 h9 v; [$ i, G4 P
        int a = hexCharToInt(vec[i][0]); - L( b, z) f% n+ r+ w
        int b = hexCharToInt(vec[i][1]); * x4 F  m/ f2 I4 a
        out[i] = a * 16 + b;
% w8 ^# c& k; q    }
# i/ W3 z' {; E    return size;
  x1 T8 l3 G% p+ i7 `}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
  V) ]" o4 L/ ?( @  i8 a9 ^#define TEA_H . J$ l0 ]; a8 A# G, |( j# u1 V% ~3 B/ p

: y& v. s: y$ f4 X/* 5 J% ]) Y  V2 W* i. r. H
*for htonl,htonl 3 h  a) V# V  y6 c  _
*do remember link "ws2_32.lib" 8 J. ]+ h$ q8 t, M. R
*/ + P" }) }9 E9 ~: n$ S8 t
#include <winsock2.h> 8 B* r+ {) y, K; Q% Y
#include "util.h"
) F' K; M1 C" T) ^" j; a* J
( _9 ^3 u4 h4 x- L0 F3 pclass TEA { 7 y% p# \* x: K# E* w6 |  x0 K
public: ' R! i- J, g* Z, l* R, s) E; C
    TEA(const byte *key, int round = 32, bool isNetByte = false);
+ ?: s4 |$ U! ~+ I5 o0 L    TEA(const TEA &rhs);
; L7 ]1 _- R; G" C    TEA& operator=(const TEA &rhs);
0 s. ?& H: K. V+ Z4 n6 J; D6 q* ?    void encrypt(const byte *in, byte *out); + }" c: j1 w4 \" [# C
    void decrypt(const byte *in, byte *out); 7 U% Q2 e' v8 A9 |; d/ g  g; Q* h9 l
private:
6 A! q* M, p3 B4 t1 B% N6 d    void encrypt(const ulong *in, ulong *out); & q% v$ R( }/ a: i, }3 N3 L$ i
    void decrypt(const ulong *in, ulong *out); 5 z( n: c; i- _) J) s/ w2 |4 b
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 7 F3 f; `! j& g& ?; A
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
  u  `/ P0 M6 x8 Rprivate: 2 e3 B/ w1 l0 L, ~
    int _round; //iteration round to encrypt or decrypt % r+ J; J1 }8 \$ G" L8 K+ V
    bool _isNetByte; //whether input bytes come from network
1 N6 b% f. G0 c. N& z    byte _key[16]; //encrypt or decrypt key
0 m( T2 ?1 T$ t8 E}; + ^" n  Y" d) G, m. ^$ e0 h. C0 T4 R( }
/ B9 B0 W2 v7 n$ ]& g' }
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 5 n! \" @7 P" }+ V) r3 P5 B
2 #include <cstring> //for memcpy,memset
: I3 l# o; Z/ I# W( J7 A 3  
0 U3 ]: t! Y6 @8 T' c 4 using namespace std;
& U+ z8 b& {4 Q' q/ [# C 5  
9 y$ }3 E  K% d% n' F3 `6 c- M3 h 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) $ [( ^6 M0 \' W8 p! K! {% @
7 :_round(round)
$ P4 h/ d4 O% k" B 8 ,_isNetByte(isNetByte) { 9 T# n" J$ I$ N
9     if (key != 0)
$ w& c2 \: I: \9 ^* K7 [4 }; \10         memcpy(_key, key, 16); ( d- h6 V- B7 s: }& b+ u, f9 D+ d9 Y
11     else
$ F( U' \/ F# u9 K/ i12         memset(_key, 0, 16);
- \0 H6 N% U- P( j, t13 }
$ ]" \. }3 i* z14  / a! r# [2 }2 C* A: }& P
15 TEA::TEA(const TEA &rhs)
5 g5 o0 w. M$ m, w8 v3 n7 B16 :_round(rhs._round)
7 n) u( L/ K4 d5 Z17 ,_isNetByte(rhs._isNetByte) {
! T8 [# |( _4 t+ c7 m6 B6 z18     memcpy(_key, rhs._key, 16); 9 J6 B! E- a9 S$ P) I# ]
19 }
8 {! h1 x, q5 i$ N20  2 H7 o1 P0 w( y  T  j
21 TEA& TEA::operator=(const TEA &rhs) { 6 O& H- z& X/ a' A+ w
22     if (&rhs != this) {
& t5 b4 Y6 @, y  {5 v23         _round = rhs._round;
4 ]2 J4 n& E8 e1 s" M0 V0 x24         _isNetByte = rhs._isNetByte; 8 v3 E+ X9 D( K- t  z" _) r1 H
25         memcpy(_key, rhs._key, 16);
5 a, l. c; `7 S4 r- J: v/ c0 J0 F26     }
( ]  s: r2 }& O7 i5 d7 Q  M1 o$ O: s27     return *this; : ~3 f0 d/ Y8 C" n& l
28 }
' ?+ H. A( w; @! k# z29  
7 y: }+ ~" ^- e8 P30 void TEA::encrypt(const byte *in, byte *out) {
# D0 o" q* w. |; P4 ^4 k31     encrypt((const ulong*)in, (ulong*)out); - O4 {: L7 l/ P2 _' a6 e
32 } & C* q: E9 Z' y, ?, E
33  
! @8 U& Y/ U, ^, D34 void TEA::decrypt(const byte *in, byte *out) {
, p, y7 L- [& x/ T35     decrypt((const ulong*)in, (ulong*)out); / ?, o5 }0 V8 l' A/ z# t
36 } ; I  ]0 x) I4 M6 I$ Y
37  ) V1 R* w5 ^& M$ W" ]
38 void TEA::encrypt(const ulong *in, ulong *out) { 6 z, z$ z$ [# a
39  $ T% S: g$ |+ E2 J1 _
40     ulong *k = (ulong*)_key;
7 j5 O; L3 |$ Z" H41     register ulong y = ntoh(in[0]);
# R1 ~- [! p* f0 [* F9 r42     register ulong z = ntoh(in[1]); ; F. ~) J/ f7 Q; x3 t' b+ U, x
43     register ulong a = ntoh(k[0]); , s2 y( X4 h$ i
44     register ulong b = ntoh(k[1]);
% {( H/ F. r4 W; s  W45     register ulong c = ntoh(k[2]);
/ M$ I3 ]/ E) ^9 r4 n( K+ \: _46     register ulong d = ntoh(k[3]);
$ k' X4 E; O1 W$ x) |8 k47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
1 U" x1 `& D  M4 S  h1 w7 u48     register int round = _round; 2 ?7 r  ^* H8 R9 L" [8 F. k2 }
49     register ulong sum = 0;
: t% J8 S* l5 h6 o4 G9 k  a) D50  ! L' r) ]$ h* P  U1 W
51     while (round--) {    /* basic cycle start */
/ y$ X. f8 V7 |& ?$ b  o% l2 X0 x5 K7 U52         sum += delta;
: O9 ]. p/ W( j7 G+ }53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ( _3 R+ `, m1 n$ I1 N; y% H; \! ^
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
0 J4 _3 J6 ~: l) y  j55     }    /* end cycle */
5 D" [' ]. @0 }' V' s- Z56     out[0] = ntoh(y); 0 f0 d& E9 N. _1 K
57     out[1] = ntoh(z); & _  x5 _+ \$ t
58 } : L+ C; [8 ~+ g; w- e' y" l
59  
( ?! J" Y7 {0 r: B0 D60 void TEA::decrypt(const ulong *in, ulong *out) { & o% G* B9 B; y! ]
61  
2 E/ o) R: L1 k, {" ^1 k& _3 i62     ulong *k = (ulong*)_key; 7 m! V7 f1 b1 Y2 j# o: E; U1 {
63     register ulong y = ntoh(in[0]); . N% C# [9 i/ M! Z7 m+ [0 l
64     register ulong z = ntoh(in[1]); $ y% R" V+ X/ i/ i  `! |
65     register ulong a = ntoh(k[0]); + ?6 ^  x8 O% z) X$ Z$ `( }8 }
66     register ulong b = ntoh(k[1]);
6 Q+ x8 H) k$ B) R. V: i- B67     register ulong c = ntoh(k[2]);
6 w1 T# i6 l9 [68     register ulong d = ntoh(k[3]); 1 ~* S! `/ @, ~
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
( g  G* S& t/ ~1 ^70     register int round = _round;
. E2 @2 X: ]% M7 y3 f, N; j71     register ulong sum = 0; & Y( N6 c$ W( O6 V$ ?
72  , {7 O, L2 y/ \% j0 V
73     if (round == 32)
+ C0 q# O- G! z* |& h74         sum = 0xC6EF3720; /* delta << 5*/
8 g# ^, R- A  \" }' Y75     else if (round == 16) 0 r$ \4 p, n. n( _
76         sum = 0xE3779B90; /* delta << 4*/ 0 |% Y2 l* W8 }& y' X; v: f+ J
77     else 6 J2 ?+ Y* _7 a, ~% @
78         sum = delta << static_cast<int>(logbase(2, round));
, ?# C$ H* s* J79  ! V, V5 V. x8 h
80     while (round--) {    /* basic cycle start */ ) ~' Z( z8 z: W$ U
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
/ M9 l/ {5 K3 O- b82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); , h  n! F: O& O; q
83         sum -= delta;
, G) F" ?: B7 D2 ?" C& m7 j6 f3 c84     }    /* end cycle */ : u5 N- K0 m6 j6 v, J
85     out[0] = ntoh(y);
2 e. k/ U" J$ U% q$ b( Q86     out[1] = ntoh(z);
  w3 x) Q! G) C% {/ q2 G87 }' r( w$ Q- B+ E) w/ Q0 F! Y

4 U' |5 e0 \/ |! C  o* p需要说明的是TEA的构造函数:
2 X4 X0 U0 I1 g$ U7 QTEA(const byte *key, int round = 32, bool isNetByte = false); . F  U( o; f# X( d/ O9 x& }8 P5 \
1.key - 加密或解密用的128-bit(16byte)密钥。
; ^) {& y* R: {" p5 W; o8 N2.round - 加密或解密的轮数,常用的有64,32,16。
9 X" z+ [3 F, z) B5 Y0 l) F3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
" Q) U. j0 p% r  T
# f, m7 S( N, y8 K最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ' K2 @+ V+ ~- k) L. }8 G
2 #include "util.h" 6 E8 B) q: Y* y; d
3 #include <iostream>
. ^& l: Z) L/ _, m 4  
8 _. g# C( n; T' G: B 5 using namespace std;
, K, T' u3 y' b5 G! j 6  
$ f3 d$ i6 k- Z9 A( c6 X1 x9 C 7 int main() { ' A$ J- l- ^6 T3 r) d) {
8  
+ E" u6 w* y4 {/ y$ f% K 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); / K5 E8 P( m6 \
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ! i7 C' G% \: ?) R
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
1 P* L, Z( q+ h, f; }  S: v" W  U12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; , j. @8 f( g$ D! V6 P6 L# x
13  0 O* K6 b/ X! j3 x$ ?9 j
14     size_t size_in = hexStringToBytes(plainStr, plain); 6 b& [: n0 T7 R5 Q
15     size_t size_key = hexStringToBytes(keyStr, key); % g. o( Q4 R( V: l/ [. C
16  , z2 q2 }3 v9 P$ D" c
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 5 Q0 n" v' [8 _$ G9 j( C# J
18         return -1;
) m/ |. ?7 k3 m  x2 q) u+ i8 p19  
6 K  E& Z0 }4 ^% Y- F: p) j20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; " D7 g( s) t2 b* O
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
7 Z2 X6 j9 e- p4 O# ]22  
9 E: _. S' P2 J, h( s23     TEA tea(key, 16, true);
1 Q/ R$ K' `& F1 i8 L. i6 G: Q24     tea.encrypt(plain, crypt);
; C$ z* {# `2 s0 x& Z) w25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
, `2 N$ |2 B1 r) C26  
/ A5 A& h$ c4 U' N# u6 y* m27     tea.decrypt(crypt, plain);
- h  e5 E1 e) D8 y7 K* l! i28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
7 e9 V, G* ^* z1 R29     return 0;
6 C3 B/ I2 x+ i4 [6 y9 j* P30 }
( D  `) z. r5 ?+ n0 ]
% N2 H, K2 O5 j$ i本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx0 u6 H4 Z) e! M5 }/ ^2 g* b8 B. Q
运行结果:
- g1 Y  z( o* i! c1 F  x7 G/ {5 {Plain: AD DE E2 DB B3 E2 DB B3 ) f5 V2 S& q# y( k
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 0 z( r# J/ o* z: S9 v
Crypt: 3B 3B 4D 8C 24 3A FD F2 . w* p2 |, M# I; U- e
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-17 11:25 , Processed in 0.021296 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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