找回密码
 注册
搜索
查看: 37895|回复: 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轮):7 n/ d1 O1 q$ F6 z# C' a# L- `
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
, k$ W! J% m% j# }9 n: \! _TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
2 W% @. y/ R" A5 l之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
/ L0 b6 `+ ^& }" D- E2 b  f! h在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 3 o0 q! E' I- S1 L1 L
在 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. ' q/ |% S# B. h- {
  2. void encrypt(unsigned long *v, unsigned long *k) {
    2 ^$ q! ?3 c* o( Y  B$ T; r9 p
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ / {& y9 [( N7 ?; Y' j0 {
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ $ Z5 C& U. p+ q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ ; v9 l8 ]0 G8 S, \/ Z  s" M1 e! Z
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    4 g( L/ G9 N# u
  7.          sum += delta; 6 ^7 c6 s" |& g, ~8 z
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); + W0 y4 H; _% o3 J! k) X
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    8 ^0 x/ f7 ]6 x2 J
  10.      }
    : X/ L# d1 ^0 Y6 v9 P" q
  11.      v[0]=y;
    , i9 O8 k8 i. g; R) u( \# s
  12.      v[1]=z;
    8 Z6 N8 L5 v" Q/ q) ~
  13. }
    9 l) O2 w" P! o8 C# N- \
  14.   . t( ~& D6 c6 |8 f
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ) Z" M* T' ]1 ^: Z: `
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) `/ p& p/ H% j% b
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ; O/ X9 Q  g8 G1 m- y$ M1 o' W
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ " h, N1 m4 Z3 E3 F: u* \8 C
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ * j3 X( d0 R2 y
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); : K/ J- B4 ~) n0 W
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    % U, `* e, K! e0 Q) u6 m5 W2 X
  22.          sum -= delta;                                /* end cycle */ 3 @& g, X; m3 [8 S- T. Y, ~9 q
  23.      } - \) x9 C( [/ K* d
  24.      v[0]=y;
    ; A: r( g8 A* `) Q/ g; |
  25.      v[1]=z; ( z' I- \. Z% e
  26. }7 T2 t$ @- M/ ~) \0 u
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 1 ?, F  |" H9 j' v& R/ }8 q0 v4 A) X
#define UTIL_H ! D0 |# H+ ?1 K$ E1 ~% y

% {8 o* W' C) L$ `% E3 m. `#include <string> , a4 \3 J+ s' ?* h, y
#include <cmath>
3 q# o( z2 x& M' U; ^* l$ e#include <cstdlib>
% e5 Z- U+ }2 i6 n
/ X: t9 _, R5 j  ]: }, C/ htypedef unsigned char byte;
! e( ^: \7 U. `/ Etypedef unsigned long ulong;
5 f, t. j0 a0 i) E( w- \/ ~0 `0 ` 7 J. L$ _& n5 g, e
inline double logbase(double base, double x) { ! q, c/ N1 T4 o* c+ E3 v0 [
    return log(x)/log(base); : m7 j5 [4 A2 v
} # A, n5 D9 H/ g, w" [
7 u5 E- A. T$ V2 v* R
/* , y% i' t! O. |; @/ D
*convert int to hex char.
3 G, `( J' K/ f*example:10 -> 'A',15 -> 'F' 2 X; P# n. O1 k" w
*/
; [2 c3 [8 |: o( k: b' b2 ^6 ?char intToHexChar(int x);
0 X( K& y3 o: m+ v- i* F
8 G4 ]/ A' a5 F1 Z. `+ r5 g/*
/ \5 v* ]' Q; }5 m/ ^*convert hex char to int.
3 M8 {, E. n4 y6 M' N# a*example:'A' -> 10,'F' -> 15
$ ?" n2 ?& t5 Z! U( E*/
! U2 ^  s' \2 iint hexCharToInt(char hex); " o- u! D6 ?0 _+ |) j

% k) W- C/ u8 o4 }5 B( H6 C2 Vusing std::string; % j- P* v, v$ k- @! E
/*
: [  q2 f/ [/ D! y! |8 I*convert a byte array to hex string. ( s% W4 R! x& Y& l' P" b
*hex string format example:"AF B0 80 7D"
7 {; ?$ q( b) v9 I0 c6 ~# ?' O/ y*/
+ F# z2 q6 O8 E/ F7 \string bytesToHexString(const byte *in, size_t size); & o- }- ?; M1 k/ f2 ^; O9 M

0 P# n: o/ r4 e0 K/ Z9 W/*
5 p1 b. B% v/ w8 o*convert a hex string to a byte array.
$ J8 @# Q* W$ Q" \+ M*hex string format example:"AF B0 80 7D" . e# Q6 k; U# m6 w; o- s( O1 C
*/ 9 l4 R  `) f& S  Y
size_t hexStringToBytes(const string &str, byte *out); ! {+ `; O7 i; v+ Q9 P! Q

9 q6 _8 ]& ~! i4 Y, p#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
' a/ T* T# X' v4 i8 E& Y#include <vector> 6 ^7 z/ ~3 J7 S) t
; ~" I: V6 s# F; b) m! j
using namespace std;
: X7 y3 l) R) a   Q# i/ u1 E- P; |: w; K) k
char intToHexChar(int x) {
+ b! r4 C: \9 A2 a% L    static const char HEX[16] = {
& Q6 t" ?+ c& G! A& P" A        '0', '1', '2', '3', , _+ Y2 g3 J, t6 L# K+ b5 W5 j& ?' s
        '4', '5', '6', '7', - i1 U, f1 M; H0 P# w. m" M( Y
        '8', '9', 'A', 'B',
: Z, W( r6 z7 C: i: z        'C', 'D', 'E', 'F'
- c. a% D8 P. t! N: J! z1 {    }; $ i2 s& S, R+ ^+ L" P
    return HEX[x];
' y+ n: g( s9 K8 G& y}
) O7 c* r1 K$ ?( M1 X 4 N8 D6 ]- d7 i- K
int hexCharToInt(char hex) {
  ]; Z* x, a( g4 d5 a    hex = toupper(hex); " e" J: G+ x& N) \3 C; _1 U
    if (isdigit(hex))
5 W2 _8 F6 ]1 }* i        return (hex - '0');
! s+ ~+ `: s# Y# R7 N/ U    if (isalpha(hex))
& \0 P6 Z, |: ]( p  a' \! B/ x- c        return (hex - 'A' + 10); 5 K3 e: M' ?7 H9 k* K
    return 0;
$ z  V* n: R! }* N$ d( y}
- r5 F5 k: z6 I/ o  s9 a0 I
) f, o0 t) ^# L; v& ^" [* hstring bytesToHexString(const byte *in, size_t size) {
& o* S7 x" |0 E/ [5 G# ^/ j! y    string str; % A& I- r% _8 e: {' m: G! U
    for (size_t i = 0; i < size; ++i) { / z# k) A! r- U0 t
        int t = in[i];
7 `4 a- u7 b; V, |) @        int a = t / 16; 9 e+ }+ \' c8 ~0 S8 ]7 q; ]) H
        int b = t % 16; 4 G8 m$ C; y  @( _8 q% F
        str.append(1, intToHexChar(a)); 4 R7 e& m+ ^0 {* a7 U
        str.append(1, intToHexChar(b));
" @. `& ]3 l( t  n, r( V, D        if (i != size - 1)
) b( J0 o; `1 N0 R" m% d/ H            str.append(1, ' ');   H$ `( K8 _  d- n0 Z8 N  o, Q
    } 3 h7 C; w: L2 {, h0 j4 C
    return str; , ^2 A" x2 F. J( E' a/ U4 S( j
} " U* c. _. b/ @" b

* W$ T! ?/ D' q5 Isize_t hexStringToBytes(const string &str, byte *out) { - h4 |% L/ v: M9 W% z0 A# l- l1 O

/ W, [* t0 W% `  a) _8 l, w( W    vector<string> vec; 1 d, l3 ~2 F0 i& E
    string::size_type currPos = 0, prevPos = 0;
- K6 b/ K( ?8 f; j    while ((currPos = str.find(' ', prevPos)) != string::npos) { / s) ^/ H7 k8 C3 G- u
        string b(str.substr(prevPos, currPos - prevPos));
* B1 q! b* U+ X+ q$ {" B' r        vec.push_back(b);
! J6 U& W) @5 _9 W        prevPos = currPos + 1; ' ]' J0 r- ^) {
    } ' V3 F7 E3 R" {7 C4 P
    if (prevPos < str.size()) {
4 K& R0 k& H: ?- j( _: a. ]        string b(str.substr(prevPos)); + @8 m8 t7 ]6 `
        vec.push_back(b);
. {; A0 V% {; o2 d  N/ X, I: C4 a: A    }
$ x: \* F1 q5 }0 _( Q    typedef vector<string>::size_type sz_type;
/ D# c- o7 f+ i4 c1 E: \7 @    sz_type size = vec.size(); $ S7 l( u8 n2 f$ J# Z
    for (sz_type i = 0; i < size; ++i) { % G5 ?3 M5 d' O7 x2 B0 P
        int a = hexCharToInt(vec[i][0]); , R  ^: V6 L6 [8 a
        int b = hexCharToInt(vec[i][1]);
9 b. H% X! i0 \        out[i] = a * 16 + b; 8 l, ^2 s0 K% c+ f8 z8 o2 `
    }
4 W" k2 A! u" g, o% l- Z8 O' N    return size;
% o$ i( s2 j3 \! T5 Z}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
$ g  D" p& E5 T$ i8 f" g#define TEA_H & o2 B% g  p6 \4 z/ e! j

. \! j' E) j; l- e8 H) }. g5 ?$ U/*
2 u/ D7 O: P0 w6 i1 P*for htonl,htonl ! l8 B7 ^8 F! l# O
*do remember link "ws2_32.lib" " e2 G$ J5 o; [1 L0 K2 X; X6 q0 e3 h
*/ ' q% _. T  b, k3 X. L
#include <winsock2.h> " Z- l7 Z# _) r) M& D2 W
#include "util.h" * _. }, ^- @9 `5 B* Q& d
1 m; s/ Y. |% i  U; B
class TEA {   V: Q" V; g6 q% k- }# D
public:
, O* c" e8 p' I! T1 V0 L: q    TEA(const byte *key, int round = 32, bool isNetByte = false); 4 i+ s: d+ n2 Q. z2 c0 F
    TEA(const TEA &rhs);
5 y8 _- N1 H4 {0 |1 ?& I; y$ q    TEA& operator=(const TEA &rhs); ) \& Y6 _( z; E, w5 A* [9 M' \
    void encrypt(const byte *in, byte *out);
$ u8 B; @5 r  A( X    void decrypt(const byte *in, byte *out);
3 T6 b9 S2 N3 Yprivate:
% |7 ]  K) t) H3 C8 O' k( ]0 ?, a( {    void encrypt(const ulong *in, ulong *out);
% g) ?' p. N! u$ g7 e3 f) c    void decrypt(const ulong *in, ulong *out);
: M4 ^/ O3 c" {    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } , T- w2 J( {. y  l7 ]' S
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
9 r6 G; a" [& e1 T" L  xprivate: ! O6 {$ v2 b. c  q2 }; R8 e: V+ |7 n/ n
    int _round; //iteration round to encrypt or decrypt
9 |) F4 Q" {$ q/ L. s( C    bool _isNetByte; //whether input bytes come from network 9 Z5 H: \" w' G
    byte _key[16]; //encrypt or decrypt key & S/ X) _: K4 A: N
};
' I0 Q( i- V" n  t7 H* z# N# Q- C- e7 z8 E # c/ d3 }3 ^- F/ f( C! n' Y
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
& U1 c& B3 e* b2 y2 E 2 #include <cstring> //for memcpy,memset
1 `5 ]& T1 T' I( S" \ 3  9 U+ y$ D9 c; T3 Z! }
4 using namespace std; 6 F/ Y% B! Z5 f: C/ w# J
5  . `% [' c: F) k! B" C; s
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
( [' G. Q) p& Y1 k7 H' Z 7 :_round(round)
' H8 g3 e  c* a1 q 8 ,_isNetByte(isNetByte) {
( U" w' K9 h$ x  Y- O) x3 ] 9     if (key != 0) 6 V& t2 x: \2 |3 f3 M6 ^1 ~
10         memcpy(_key, key, 16);
* \" P" n: @. M& ?6 K) H11     else
* E6 [' T$ Y, T1 X; @( W12         memset(_key, 0, 16);
4 x* f: N7 L9 x* B13 }
' B) D: y; l. }. J3 g9 N- R' u7 U14  
' R) W$ d" o/ @. r" d15 TEA::TEA(const TEA &rhs)
6 ^6 H# H0 T3 r% T; R16 :_round(rhs._round)
5 M( n  E; a# c9 s( n17 ,_isNetByte(rhs._isNetByte) { % l7 b8 m, Q1 C/ L6 m3 f
18     memcpy(_key, rhs._key, 16); 2 g' A; t1 q3 U7 n3 F
19 } 4 \& _! l+ p+ e9 E3 S0 @0 ?7 p
20  $ V4 m: O% w; K! ^$ B
21 TEA& TEA::operator=(const TEA &rhs) { , u( r! B6 X4 D3 m
22     if (&rhs != this) { 5 t! G( W: s  ]
23         _round = rhs._round; ' F' U% o" W& e
24         _isNetByte = rhs._isNetByte; 8 }# L; S: n- P, H/ r' x7 J
25         memcpy(_key, rhs._key, 16);
# D4 ?1 s, y5 {26     }
" W2 n4 Y# D% `27     return *this; , W/ w4 J0 U, ~* Q( L! u8 H
28 }
8 s$ \' y6 ^# S  W% t6 {4 g29  
0 `. C$ s% v" y4 J! r  w7 p0 C- C30 void TEA::encrypt(const byte *in, byte *out) {
  c6 i7 l/ l& X/ r' X0 _) G7 e+ t31     encrypt((const ulong*)in, (ulong*)out);
5 w1 a, q, t- G32 } , R: K2 J2 k5 E# ?+ E. D
33  
: S: D0 ]; C3 _34 void TEA::decrypt(const byte *in, byte *out) { 4 D( J" h2 X$ {8 t& Z* t
35     decrypt((const ulong*)in, (ulong*)out);
" k7 B* s9 c& N( ]9 R6 I36 }   w7 R& Z) n9 E: E' e: s( K$ d
37  - ~9 G" w! s5 |6 Y6 w0 N4 V8 Y
38 void TEA::encrypt(const ulong *in, ulong *out) { 0 f2 @8 a9 e* q' N) j( x1 d
39  ' _2 m3 L( J% T
40     ulong *k = (ulong*)_key; ! }7 P4 J/ s3 F4 [4 ]7 ?" g
41     register ulong y = ntoh(in[0]);
9 y. u# g, T+ O3 h, J: s3 x42     register ulong z = ntoh(in[1]); ) N% n& b* |0 v% c& V
43     register ulong a = ntoh(k[0]); . t$ b1 F  v8 E3 [
44     register ulong b = ntoh(k[1]); ) f" v) C9 P9 c2 G2 K: [( o& D! s
45     register ulong c = ntoh(k[2]); : ~* h* x4 f# a' T8 x9 q! j. U$ [- C
46     register ulong d = ntoh(k[3]);
2 ~8 W+ W1 g2 w% M4 K% x( C1 x47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
! a( ]( ^* K& F48     register int round = _round; , Z$ G7 u$ R+ v+ U* b
49     register ulong sum = 0; 5 f# D( l  l) s- S( w8 Q  r
50  
. L" Y1 \. I6 ]1 c51     while (round--) {    /* basic cycle start */ 7 o1 h( ^/ X5 H+ w, Q
52         sum += delta; 8 ]) h) `+ T; A8 X- Q6 F; {) z
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
8 F1 x6 s9 X* h, O% X3 e  ~  Y54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 2 f. x! k; k9 Q; Y5 B$ F' Z
55     }    /* end cycle */ + J9 |! {& ~' K$ N
56     out[0] = ntoh(y); 5 @) t: L1 {" X! V! T: Z
57     out[1] = ntoh(z);
. C, T# g1 U# O( ~58 }
0 V8 e) G2 X7 k; M1 H, O59  
9 _* D/ c0 f  T* U5 {3 T! n60 void TEA::decrypt(const ulong *in, ulong *out) { 6 W1 }- H# p, E8 y3 e! h
61  
3 _+ r& A& A9 }  i- e" X62     ulong *k = (ulong*)_key; 9 U/ ?) q- I; {: D% z$ b
63     register ulong y = ntoh(in[0]);
: [! N) h: f. ]! d1 O64     register ulong z = ntoh(in[1]);
5 r9 i0 s# K0 C8 }$ Z! j5 Q. F( |. w65     register ulong a = ntoh(k[0]);
. ~. d7 [7 S8 e* R, K66     register ulong b = ntoh(k[1]); % J5 n8 d4 a5 Q
67     register ulong c = ntoh(k[2]);
% R- N( _( g- [3 o68     register ulong d = ntoh(k[3]); 9 }9 Q8 q2 `' B. t- b$ O) d4 s
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 9 F9 z( E1 T0 C0 N6 v5 S% W
70     register int round = _round; 6 A" \$ U" a1 S& I) ^; J
71     register ulong sum = 0;
2 u2 x, q: t0 H- Q! l6 @72  ( I: F4 M: z3 V+ R
73     if (round == 32) 2 M! ?4 i" g7 T8 X# Y' Z
74         sum = 0xC6EF3720; /* delta << 5*/
4 @1 ], N) B) t7 L75     else if (round == 16) ! b( c6 l$ R! c2 N' [( S4 s4 y" l
76         sum = 0xE3779B90; /* delta << 4*/
/ k3 ~% \+ W6 N% V0 k77     else
  `# `. y/ @' f78         sum = delta << static_cast<int>(logbase(2, round));
, K  g* H" \, |1 h79  ( a: o. O' K8 A* p
80     while (round--) {    /* basic cycle start */
! p- `5 D3 ^6 y+ L; m" u7 z81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
3 I% Q6 d, y+ {7 J& o2 I# J82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
; T( z4 ]  J5 a, P  q83         sum -= delta;
7 ^( m9 J7 E; m84     }    /* end cycle */
; ]. }8 e$ U( \7 ~5 a$ S85     out[0] = ntoh(y);
' F- y4 z6 D$ c: d% `6 O# Y86     out[1] = ntoh(z);
5 N2 A6 S+ V& y  l7 L, I87 }
. n! |0 [- ^6 k7 a0 {$ @- M
7 K/ N: [7 a2 z需要说明的是TEA的构造函数: ! W1 Z5 Z% N3 z* {) l& L" t
TEA(const byte *key, int round = 32, bool isNetByte = false);
) W  u# i& X, @/ ]+ }1.key - 加密或解密用的128-bit(16byte)密钥。 6 |: n: {1 }6 m  s3 ^, X
2.round - 加密或解密的轮数,常用的有64,32,16。   T* n: `: {6 l+ O/ w
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
8 \# S/ ~: `  k& h+ m  b( S
3 ]' j+ H- Z+ V; {最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
$ U7 W; D- H) B% X' }) d* ^* p 2 #include "util.h"
4 @6 p2 M8 A. z% ] 3 #include <iostream> ' y, S- A2 h( G, i
4  - Z2 k6 I7 e2 }5 d1 [. {
5 using namespace std;
9 x+ T/ `( |, \* J- r1 } 6  
9 v! t; M% w9 t" }( p% E5 e 7 int main() {
$ o, V. @: d* k# k" p5 ? 8  & y  ~; |8 \: d6 T) k0 F
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
, |% m* X) S7 D1 ^# H, Y6 A10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
9 Z4 b$ f* _* [; W# ~  g$ `! v9 Z11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
1 d, O  q/ @1 ?- m5 [: t* U12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
% c- v' S. s8 q13  
1 V1 O  R, c: l14     size_t size_in = hexStringToBytes(plainStr, plain); 0 }" P2 |) |- }' t5 Z& u0 ?
15     size_t size_key = hexStringToBytes(keyStr, key); 5 b  R* q7 e% C9 N3 ?
16  
. A" s' g' x# w- m7 E5 I17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ' `# W$ G1 _; N
18         return -1;
! f: G1 K) Z, }) J* P/ p19  % P% G% ~! J- h8 L% V
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 8 s3 R3 S) `$ e9 X. V1 q
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 5 A# @  [/ M8 v* M1 e
22  
4 ~2 L& S! a/ a: K23     TEA tea(key, 16, true);
4 U  T! k) z  r7 m' m24     tea.encrypt(plain, crypt); ; U4 e& ?5 _* i
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
& o* H4 e3 ^! A3 K) j% _26  
: ~% _1 M& w# u# z' T; A* Z5 R% g" [27     tea.decrypt(crypt, plain); 3 U8 t; j! ^0 f  P( z
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 3 G% L( B" S( r- i7 T
29     return 0; & _6 y, W( x( R# O
30 }
" i+ k& `+ P! Y5 S( S% g+ x- q2 j- \# |/ ^6 r
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx& r8 ?' T9 u, m% j) I* B
运行结果:
9 |, l4 D1 f0 ?, `; c- h0 RPlain: AD DE E2 DB B3 E2 DB B3
; C! ], f7 e! s" E4 TKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
+ a+ [' {- H+ CCrypt: 3B 3B 4D 8C 24 3A FD F2
/ i0 ~1 T( B1 R) _) R5 IPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-7 18:50 , Processed in 0.019876 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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