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

使用道具 举报

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

unit.h

#ifndef UTIL_H
9 B$ g5 r* [, e5 f#define UTIL_H + \) d' t1 G! I0 w" E, }" V
& B" V6 C3 r: y* {6 Q0 ], c
#include <string>
) ^: [) V7 Y6 I% b# K3 d5 @& t#include <cmath>
; ^/ p. `% J! N#include <cstdlib> ! c4 I' d1 T7 X: F/ I8 I

. @' ~8 T" Y% N) t1 Mtypedef unsigned char byte;
+ i  G! x* A3 Htypedef unsigned long ulong; , W' q% l+ t! e

# D7 R" j0 Z& Iinline double logbase(double base, double x) {
' z, F: j0 {2 v+ V6 C    return log(x)/log(base); 2 u. _2 z/ F8 C+ u- Q4 |# T
}
0 ^: x" g. D5 w) c / T- W+ I( S+ q1 S5 [
/*
$ H  X9 n% t, U: C0 q2 I5 u*convert int to hex char.
' j% ^5 ?5 ?# C- J9 L*example:10 -> 'A',15 -> 'F'
2 x$ T* ]2 I$ Y7 q# k- h*/ - J3 Q3 o; S: T2 q/ H
char intToHexChar(int x); ! _; V0 f  c9 q8 ?% y0 ~: x7 f
/ M( _6 o6 ~% y  M4 n4 y4 i
/* . U2 X, b1 d2 b7 }
*convert hex char to int. # N9 E& B( |, @' U
*example:'A' -> 10,'F' -> 15
/ J% G% Z( P0 I" ]* n. H) a*/ ; w% n: M; L1 D: V: K/ ~2 b
int hexCharToInt(char hex); 7 r, Y- O7 W; K5 _

8 U  t" S- O; {! A& D) H, F9 Ausing std::string; / U  O: a- ]; {/ _7 a5 ]3 o1 N
/* ( y& Y) D8 K/ M/ y: s
*convert a byte array to hex string.
, S# n0 ?0 ~4 ^& L1 F3 {*hex string format example:"AF B0 80 7D" : R) ~, w3 |* F) e3 j+ X- [
*/
3 o& m6 t, ~, V% Rstring bytesToHexString(const byte *in, size_t size);
+ |6 `' T+ N) w
+ |' M& G8 V' _( z/*
8 V, I6 {: E; T6 c, a*convert a hex string to a byte array. ) K- W( K6 L3 D$ E( Y7 J: y
*hex string format example:"AF B0 80 7D"
9 b2 `* w  W3 N% H( h  u# X' Z7 a) E*/
# \* d, u5 L, e% I4 U8 ~size_t hexStringToBytes(const string &str, byte *out);
. a! s- G- a! F5 A- a % n% ], H/ d2 c" B# z0 m, d5 |7 [$ g
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
) u1 O! G) B7 E7 b#include <vector>
: n7 \8 A" j# {, ]1 \ 1 F" j5 R; }1 K( ~, _6 m9 ~! }8 {" P' c
using namespace std; ; N5 R7 [' `! j0 e

, a7 J$ _1 p/ C3 ?  {% Z! N# qchar intToHexChar(int x) { 7 q7 {" ^: }: y
    static const char HEX[16] = { : z2 z5 z4 c4 L9 l
        '0', '1', '2', '3', + u. [4 _6 s+ K* V9 C
        '4', '5', '6', '7',
) a* Z* _9 f1 R5 F        '8', '9', 'A', 'B',
! e; C. X8 P6 r" X! C        'C', 'D', 'E', 'F' % v: p* ~& J8 A
    };
# X; [. v. t! b! q' i    return HEX[x];
3 c5 _$ d& ~" x} 3 V/ p) v5 T4 S9 `  z4 z" E
. Y" [1 A  `  d/ ^) `+ ]) S; [
int hexCharToInt(char hex) { 6 r: ]5 A8 u" R0 F3 U
    hex = toupper(hex); # z+ ]8 s  Y* u: h7 T  j/ s
    if (isdigit(hex)) 0 ~5 e- [1 ~) d. V* s& H
        return (hex - '0');
. o) Y% z+ ~+ S0 Q- R& b    if (isalpha(hex))
& _7 I# u7 o! G, @5 v        return (hex - 'A' + 10);
4 G  z3 d" ^  c5 G, T: n4 Q    return 0;
0 s: f- s- [3 o& K: D% r# M8 v. i2 i}
7 I) ~+ ?; C* u) A2 [4 R
  T. F  i; ^4 v: v# Ostring bytesToHexString(const byte *in, size_t size) { # x/ X9 G, p: E0 b8 Y
    string str;
1 d  A  r7 q! C! j  K0 C    for (size_t i = 0; i < size; ++i) { : p( z. s+ T! v
        int t = in[i]; ) _6 P5 Z& A, y. q% t6 F9 W
        int a = t / 16;
0 x1 D1 _2 o. s: k: ]- q( |        int b = t % 16;
) _& C' y" d* i, e0 c; H        str.append(1, intToHexChar(a));
* H* j% j2 _6 |  p9 Q  r1 Y        str.append(1, intToHexChar(b)); 6 ?$ }; f. Z8 s% ]: s# C
        if (i != size - 1)
. s( S  Z8 ]! O$ W6 W            str.append(1, ' '); 0 E; k! s$ ]& ?
    }
  W* `0 k0 n$ ]* H- w    return str; $ B. q! b5 b2 M; p& J$ z/ w1 N  \
}
+ `2 [$ m) j" Y8 \9 |7 c: R
1 X4 x( E* V& Hsize_t hexStringToBytes(const string &str, byte *out) { & x) B" O) D2 o  c1 C5 g" W

' Y: j- }# H0 a9 Q. F6 C6 p9 }) o    vector<string> vec;
. X3 S/ u# U) a1 \* {- d    string::size_type currPos = 0, prevPos = 0; : }9 Y' Y9 f& [  M9 D" B% E# U* L, P
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 7 y  a) y: }% _2 g7 Q+ j
        string b(str.substr(prevPos, currPos - prevPos)); : v$ p8 ^* J3 j
        vec.push_back(b);   Z1 {0 U) k. P
        prevPos = currPos + 1; 5 N+ n( g! I: C/ s7 ^$ [
    } " Y2 q4 O4 g# O
    if (prevPos < str.size()) { + F/ ~! S4 q& y# v+ E- U. L; O- o
        string b(str.substr(prevPos));   F" B6 x5 N! x) S! w% s( r  `
        vec.push_back(b);
& d# ^4 k, _+ y! R# S' Y' S    }
  ?9 J8 S; M$ O3 u2 s; t, a0 d    typedef vector<string>::size_type sz_type;
# p" c+ C  a8 E) b4 o' |; t    sz_type size = vec.size();   t  ?- g1 \+ g3 g/ |! @
    for (sz_type i = 0; i < size; ++i) {
4 h) Q) R/ X! l) o# ]% \3 `9 n2 N* M" G        int a = hexCharToInt(vec[i][0]); " a: Y9 z1 u6 o9 }
        int b = hexCharToInt(vec[i][1]);
; f1 c1 M5 j% [4 o        out[i] = a * 16 + b;
  R0 a, n0 A- w: P1 x2 r    } , c4 Z1 p" D1 R' g
    return size;
2 _2 {$ z" \! [' L  A: Z}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H - v6 k0 T  A0 n$ Y: b5 V( ?
#define TEA_H
+ j# C% s/ \0 w4 M9 a6 F6 l ' M0 c2 E2 H) i2 G# D% R% ~  K
/* . ?: J8 \- L- K0 |: e
*for htonl,htonl 4 T( S# u5 R5 e- g5 Y
*do remember link "ws2_32.lib" . {" }8 a/ b1 h* T6 k  F
*/ ' K% w# \3 p5 P' @/ h, S" A" ]
#include <winsock2.h>
- B- l; R  p3 W" e#include "util.h"
  u) y. T) P" L/ x$ `4 x/ W4 `' y+ t 4 P4 ]: O& j2 h4 e9 E. P, b
class TEA { 9 H4 p/ ?/ Z( z: y5 v
public: / P, E  U, y0 S2 M6 f
    TEA(const byte *key, int round = 32, bool isNetByte = false); 1 X0 h: @$ B8 B% x6 g; V% B" I
    TEA(const TEA &rhs);
9 K& ~8 N' L# [; a: G& b    TEA& operator=(const TEA &rhs);
8 G/ A- h( `- o$ E! W    void encrypt(const byte *in, byte *out);
5 h+ O( q" W& w1 F/ t    void decrypt(const byte *in, byte *out); 0 K4 [1 l! z3 \( }# R: N
private:
! j0 P( U2 O1 G( w, u1 P# @    void encrypt(const ulong *in, ulong *out); 8 M) u6 u4 |6 y; b4 C( m) w) u
    void decrypt(const ulong *in, ulong *out); " `2 n* l" d4 k
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
1 u& C  q: v5 r' O9 o; ]) h; a9 v    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 7 M5 x: x: @5 y& E
private: 8 V- a; I/ e" e0 C: ~. e  {' M
    int _round; //iteration round to encrypt or decrypt 8 v, P, R7 B$ D9 C9 o, f* B
    bool _isNetByte; //whether input bytes come from network
5 U/ i/ w$ T2 c" x    byte _key[16]; //encrypt or decrypt key
$ e' [! z7 b# m+ S2 L0 n3 p2 |4 z}; ! d2 a' z, d# G* \" J+ l( P/ F8 f
2 R1 C0 q" a9 ~& Q; \2 M  ~) q
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
) e6 g5 Q( a/ l* }6 q 2 #include <cstring> //for memcpy,memset
6 O3 F. T$ ]  [8 v 3  
7 ~( j$ d; K0 q. G  }7 J 4 using namespace std;
; \" Q& J: o! Q1 N/ i* | 5  
6 \) \- r, j) N7 _5 T 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) , |1 j, |3 u3 R4 {
7 :_round(round)
5 {0 W3 P) m* ?( f8 h 8 ,_isNetByte(isNetByte) { 9 i2 M7 w1 c+ u# O. @
9     if (key != 0)
8 {: B+ D, p, c! i8 e, }$ _10         memcpy(_key, key, 16);
; N. q5 k& a3 E6 q% `11     else " I$ u7 _3 I0 g' v0 P
12         memset(_key, 0, 16);
4 q3 o5 J: L& ]+ e! Y, `13 } 5 v! u3 L" E& j/ |6 E
14  ) |, u  }6 v/ p
15 TEA::TEA(const TEA &rhs) $ j& Y; W3 w3 R3 ^' ?
16 :_round(rhs._round)
, Z% I8 O9 [5 E' i; f17 ,_isNetByte(rhs._isNetByte) {
& i& q: L: P- R; B18     memcpy(_key, rhs._key, 16); 3 r& T: p3 J$ |# ?4 X
19 } 2 Q' h% ?" V. Q9 g2 V7 k8 t/ P$ F' S
20  / [: q, @" p+ ^! `- l% [  u/ h
21 TEA& TEA::operator=(const TEA &rhs) { 7 ^2 }. Q6 C+ S7 w
22     if (&rhs != this) {
5 g: Z- b; Y8 Z0 |4 I: L1 ?23         _round = rhs._round;
% c/ Q# d9 U+ l3 V% h24         _isNetByte = rhs._isNetByte; 5 |0 r1 W  y% f; p  F
25         memcpy(_key, rhs._key, 16);   h+ s$ `1 ]0 d. s6 A" a) v4 L
26     }
# u. l4 P1 O: w9 Y27     return *this; 4 I2 t' [" \: Z9 C. i$ m
28 }
  U9 r3 O3 C! n* P3 M. o! K29  ' r; [. ?. V  G* r
30 void TEA::encrypt(const byte *in, byte *out) { 6 N8 S) }% R3 I; x8 j' |* n- L' `* B
31     encrypt((const ulong*)in, (ulong*)out);
0 {% n/ c$ }# j- Z  q; a32 } 7 R; T, a" q2 v2 J) P: J
33  
3 ~' K( W. C' }9 i; q' _7 e& O34 void TEA::decrypt(const byte *in, byte *out) { + s1 a- ]( e5 v
35     decrypt((const ulong*)in, (ulong*)out); " a8 f& Q/ V% P4 R2 d
36 }
( G6 m2 A+ p1 z3 A37  1 N" C3 \6 j  i! H
38 void TEA::encrypt(const ulong *in, ulong *out) {
* p7 L% F# h+ o* `39  
8 T( X% A7 s5 Q7 r( S4 t' w40     ulong *k = (ulong*)_key; 9 `3 j, P! A4 E2 ^/ E; o
41     register ulong y = ntoh(in[0]);
4 s/ e: R- W) V3 _& L) f( m! o42     register ulong z = ntoh(in[1]);
9 @; `5 r" @7 h43     register ulong a = ntoh(k[0]); 7 y/ h. O" W+ _2 w/ V# U: M% Y
44     register ulong b = ntoh(k[1]); # E+ T: o+ d' ^
45     register ulong c = ntoh(k[2]); 3 L1 S' i/ A: i# T' U
46     register ulong d = ntoh(k[3]);
1 R( b9 a! d  h0 K3 j: Y47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 2 p6 F, P) U# E* @; {7 e: H" K! g
48     register int round = _round; 1 L4 J- {- q" ^! u5 Z# w: z) v# |
49     register ulong sum = 0;
  E; F0 k6 [' ?' l50  
1 [3 k; D  S; K1 u+ x& {8 v51     while (round--) {    /* basic cycle start */ - J; g1 Q& u) }
52         sum += delta; * X+ K( X6 D9 D# f, [; d
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
1 D4 |3 p0 f" _, I: e54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
. i6 {% m9 n: n& e2 h3 d55     }    /* end cycle */ ! R# D$ A( R/ i) r: `/ L
56     out[0] = ntoh(y); + n9 [1 ?$ A! l( q# y
57     out[1] = ntoh(z); 2 N! z4 r. j! A: [9 @
58 }
* x4 _6 U: S$ p1 }" O! P3 M59  4 Q  y! C( [$ _+ T& Z2 ^
60 void TEA::decrypt(const ulong *in, ulong *out) {
) B. e8 J; ?& U: h( R61    P2 }2 r: H3 C7 q, L1 B3 \/ I9 a
62     ulong *k = (ulong*)_key; , y1 u! A% o( g& ]' B- x- P" Q
63     register ulong y = ntoh(in[0]);   P% _$ G; _# W  a- C# w
64     register ulong z = ntoh(in[1]); ) p2 c# v! x+ `  S# k
65     register ulong a = ntoh(k[0]);
6 y+ K) u7 J# ?9 \. b1 S" r66     register ulong b = ntoh(k[1]); 4 b1 e: ?" a3 @" h/ G
67     register ulong c = ntoh(k[2]); 3 h/ I6 d  z- `$ n, S) N+ G& I, W
68     register ulong d = ntoh(k[3]);
0 \1 Y6 n2 k4 i69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ u/ _5 c% u9 m0 E70     register int round = _round; / [1 J; ^8 i5 _2 D2 L1 s" F% T9 y
71     register ulong sum = 0; ! g+ P/ }+ m- t/ U
72  
/ V* g+ B6 Q0 X$ g: u& r  h$ `73     if (round == 32)
0 p3 F6 @! j$ B, C) W8 E" ^' b& G74         sum = 0xC6EF3720; /* delta << 5*/ 8 l7 N& E4 M4 y# n9 A& I
75     else if (round == 16)
, x# Q0 f/ {* g76         sum = 0xE3779B90; /* delta << 4*/ + D! n6 U* H* M* \: l
77     else + b( i. p# p0 f5 \! ^& W
78         sum = delta << static_cast<int>(logbase(2, round)); 3 X$ G$ k4 Y' E" s2 H
79  
9 ?- O  O( T( c- S" y80     while (round--) {    /* basic cycle start */ 7 \  |5 c; Q, X: e# n6 p
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 1 S2 z5 l, U7 l, [  o+ W: a7 l
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); / {$ W3 m% J8 C% E* k$ e
83         sum -= delta;
" m4 A/ e7 L2 H; F84     }    /* end cycle */
5 [1 |8 v& ?0 H* [& p+ e4 @85     out[0] = ntoh(y);
0 r, p7 e# s, Q8 Q5 r1 p86     out[1] = ntoh(z); 5 @( e+ s4 w' v# w1 c9 A
87 }
- u2 X( L- H! A4 |! g' z/ i- a; `1 B  c/ Q* s
需要说明的是TEA的构造函数: 6 u: Q  {% ?5 C& U% B
TEA(const byte *key, int round = 32, bool isNetByte = false); & l( |, h4 @0 p- v% @, A
1.key - 加密或解密用的128-bit(16byte)密钥。 & u. M3 C7 r7 |: T' D
2.round - 加密或解密的轮数,常用的有64,32,16。
! I9 }6 `( A& T# I* `3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
- z# ~+ d' c! D# k( H9 q
4 @; N+ B' b% c" \" ~最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
; I- N" k& ?$ c6 O# j4 W9 { 2 #include "util.h"
1 U- I5 ]% w; ~, W# r% I3 d 3 #include <iostream> # ?: a0 m6 z6 t' P
4  
6 x8 J& p. s( E1 e( }% ^( e 5 using namespace std;
+ v1 @* b/ F( B" y 6  
* Q/ r! I( h. Y' @( n& P 7 int main() { 6 m8 R: y" L! ], w
8  
, D! }0 S! V* [4 C 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
8 n: U: `- i9 |' r. P! P. L2 x10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
) L9 f9 o" {/ v5 L, u: v# y2 W8 {11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;   A* U& v) I: \# ^
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; " a" l5 Q" Z) h2 h- Y. P5 S5 u
13  ! n7 l6 ?: f. B6 M
14     size_t size_in = hexStringToBytes(plainStr, plain); . j& |& w; I( y: N
15     size_t size_key = hexStringToBytes(keyStr, key); . {2 Y4 h2 F. K9 O
16  
  q0 ?5 _& }. y" @* L/ j17     if (size_in != SIZE_IN || size_key != SIZE_KEY) # n9 g+ [# n& a1 D) V
18         return -1;
3 ]4 C9 @* _: m- P5 e& o19  
: F: D5 _- i8 D5 `4 p20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 7 g' c# V! ?; f* c0 G7 b
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
# Z# Q' _& K! W/ U: o6 \) x22  $ H6 w4 y# I0 ]! m& z* V' G$ i
23     TEA tea(key, 16, true); 2 t0 M: O) E8 b4 V- O8 h$ [8 U
24     tea.encrypt(plain, crypt);
  i# G, Q9 O* w; j! ?25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
" \7 F5 L, W; j9 p5 C( u1 j4 V26  
2 A/ q7 V: p$ w27     tea.decrypt(crypt, plain); # T& x, Y: ~2 n9 Z8 N
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; + A8 u4 T+ O3 V" f( S6 o( ~; N
29     return 0; ' i: r# b7 S5 z6 A+ E" |
30 }; g: M2 m4 i+ X

1 V6 \, Q* ]6 K本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx3 k$ P; l4 m. [' T6 E7 y
运行结果: ! P$ H- v! u, l( W
Plain: AD DE E2 DB B3 E2 DB B3 $ L( @5 F/ q: X$ x# M1 j
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
% F2 p8 d7 h+ G1 JCrypt: 3B 3B 4D 8C 24 3A FD F2
6 q8 m4 t/ f/ x7 o3 ]# {% i6 B6 jPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-17 04:16 , Processed in 0.021297 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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