找回密码
 注册
搜索
查看: 37820|回复: 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轮):
# p+ ]1 D9 q4 {4 o  h微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
1 X( _+ T$ Y  x0 Q, m3 s! I& a0 h+ STEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ; T8 H& \, ]% H  b, `5 O1 e/ c. n
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 3 Q! o4 s) F2 E( N, M6 W
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 & e& a- I7 D: F' q0 C
在 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. % Z. U( j# H3 a1 I
  2. void encrypt(unsigned long *v, unsigned long *k) {
    2 P% D" _* t$ U. k6 A
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ) s/ }9 U) y+ h5 D( K% y6 w9 ~
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ) S0 [5 n. @- P8 S& n
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 9 q3 B* d* b7 I7 P& r$ h/ u
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 7 C9 k: D( ~1 Q, b8 }9 p
  7.          sum += delta; - G, I2 s; Y1 A9 \3 B: ^
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & `  s- S3 q' _0 L- s
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    4 V1 [* k$ |/ R) O
  10.      } - L; ^5 s1 [. m2 R% }! @
  11.      v[0]=y; $ q+ f, T, k* o3 ?
  12.      v[1]=z; 6 {( R1 }( M! Y  @; w% ^
  13. } 8 {" o! w# u# H! u: z
  14.   ) |9 A% G# A4 O
  15. void decrypt(unsigned long *v, unsigned long *k) {
    " m  E( w9 m1 Y1 }: \
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    + o: e# {6 U3 \7 y
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */   t( _# b! t' A. k$ p$ k3 [( b6 d
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 3 i1 D0 e6 a& U, L
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    3 _) j/ j- _- F' k1 t% W
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    3 f& C; @; ]6 M& u$ F
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & \$ ^% Y/ Y) b: i
  22.          sum -= delta;                                /* end cycle */ 9 y$ \0 `9 h$ b1 p6 v5 S
  23.      }
    6 `) k9 e' F$ g! `+ J; l& v
  24.      v[0]=y;
    7 r* U0 x7 W# Y8 q9 g6 O# U. Z( a5 O
  25.      v[1]=z; ' I- E2 L- r) E$ |. Y$ L' c
  26. }
    ; A' \" |; j5 l) p( Z0 I2 ]
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H * b  c% [$ }( `  G5 i- `: L1 F
#define UTIL_H $ N7 a5 g1 V0 U( l: Y
9 y5 m6 _% [2 l  h- h2 s2 ?  t
#include <string>
7 F) O+ r  X. E+ f" e#include <cmath> + N/ n4 c3 J9 q, z3 t( [5 Y7 h
#include <cstdlib> ( W& p' B( ?" {- B3 f/ C+ u' _

& g/ f& @* X+ W  p7 U" Atypedef unsigned char byte;
7 O0 @, v: F) O1 b4 mtypedef unsigned long ulong; % a" u. G# _/ G" X

1 H% r3 `6 P! |( I0 v, T& ^9 e* Cinline double logbase(double base, double x) {
, l" ^: I4 y1 [0 `% \% |: @    return log(x)/log(base); ' d0 n/ N% `! p! M" z! }  R: R  w8 i1 ~
}
! D1 R6 B4 ^9 A2 [8 ` 1 j+ x8 U/ b+ h1 V& D
/*
0 [5 o$ Z/ F0 O4 E  G*convert int to hex char.
( F& D; X. o' P1 L4 s*example:10 -> 'A',15 -> 'F'
; l) C/ Z, C( E*/ ; p  g' [, s* Q, M! Y: n# N& H
char intToHexChar(int x); 2 b: S) A+ g& E; p% w$ n

* n7 @: m2 n. X! r/ ^$ r* o/*
7 q) o8 e% b9 Z8 h) A6 I# B*convert hex char to int.
; M& w# g0 I8 j2 O% j3 r! n9 R*example:'A' -> 10,'F' -> 15 9 H- x) A( n$ @" D
*/
5 Y7 H5 S% h: Dint hexCharToInt(char hex);
& j  m1 F: B' \% s
' J* N4 F+ ?& N; _6 @, C# y/ i# |8 Fusing std::string;
. j; c  |6 e' h6 @% [/*
4 }4 O3 O# h% h+ u) E6 h  Z; F*convert a byte array to hex string. : ~* D7 ^6 p& b3 d' V9 s* Y: z
*hex string format example:"AF B0 80 7D" ; k/ l# T( {  P; ~5 X
*/
% G7 u' Q7 T) d9 c6 H8 ~string bytesToHexString(const byte *in, size_t size);
/ \  c9 Y) }2 o( F; Q7 S
5 W2 r" k# D' Y/*   F4 N: d  i7 z0 I
*convert a hex string to a byte array.
# M! z' C- N2 B*hex string format example:"AF B0 80 7D" " X% U, z8 D6 Z9 m7 O
*/
* j, Q# h$ o) O5 O. q4 asize_t hexStringToBytes(const string &str, byte *out);
  X6 W6 U0 C9 ~. L
( Q9 X" H% H# Z! R: T( Z#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 0 g' T+ o  t6 I" Q  v
#include <vector>
6 y3 S( x0 k1 U' {
% H, z! A' r1 c, s. Rusing namespace std;
5 b7 ^0 o. k: E0 F
6 x" y3 F5 ~: _7 m  z( J# Dchar intToHexChar(int x) {
& ?+ T/ y% j% `1 Z) M7 e) T( N5 U    static const char HEX[16] = { * {% n: R: L, I5 d" h) i
        '0', '1', '2', '3', ' h! E% i$ K+ |+ E2 `& }+ p
        '4', '5', '6', '7',
, {3 Z" g1 X# y" p7 j        '8', '9', 'A', 'B',
2 C4 n* ?5 a' @        'C', 'D', 'E', 'F' $ @0 I! y9 D" y) D& _
    };
, {/ |* E9 B4 a7 d, Y  H" O    return HEX[x]; 1 u8 W5 B) F9 `' B
} / F/ g' K1 u9 U
+ N& q( Q% I; |) S: Q
int hexCharToInt(char hex) {
; E8 {! J+ K: q) \5 B/ f: s    hex = toupper(hex); - h( k( N; K6 q' L; L& c: ~% b
    if (isdigit(hex)) " J: P0 P, w5 m1 d, ^5 A
        return (hex - '0'); ; }& @% ^) A+ G& g
    if (isalpha(hex)) 8 w- Q% \6 c, ~! C- {4 v, L& |
        return (hex - 'A' + 10);
/ ], H) Q6 A! v4 k1 V% o  I    return 0;
/ F! l/ M* ^* ~  b}
; [# |2 n1 A# e( } # M. `% \+ \( b8 V. F/ H
string bytesToHexString(const byte *in, size_t size) { - [6 @- Z$ ?! ~2 z: r; Q3 a, k/ p, x
    string str;
7 P8 p: D$ U1 ^. |5 }$ _3 R! _    for (size_t i = 0; i < size; ++i) { 8 g8 r& \* |* E8 N8 d. z0 i
        int t = in[i]; ' Y7 Z3 F8 k& l; T* [
        int a = t / 16; ; O& Q1 H" m  N. S
        int b = t % 16; 0 B* ^; x% ]  ?2 O5 \
        str.append(1, intToHexChar(a)); / F  \6 {# _) U/ g" |
        str.append(1, intToHexChar(b));
, _+ ^+ j: ~4 D7 K3 @        if (i != size - 1) 3 v0 C" A( Z7 q% Y; Y  P
            str.append(1, ' ');
: J9 ?5 C  w. W3 D    }
/ M- S3 j* s3 Y* M8 a' _    return str; % {  ]2 p4 x. d. ]* S7 A2 q% r; s& b
}
) b5 o1 B' q/ V ( z* n% m1 Y% r2 h/ [# K$ _; b
size_t hexStringToBytes(const string &str, byte *out) {
# B+ ?8 M; n* ~" j/ k3 t6 g / Q8 L% I1 H) `/ j! }1 ^
    vector<string> vec; $ j! R/ n2 ?3 |& w& q; k' ^8 E
    string::size_type currPos = 0, prevPos = 0;
8 X% W' L& a- h    while ((currPos = str.find(' ', prevPos)) != string::npos) {   {; {; I2 H) D5 X. {
        string b(str.substr(prevPos, currPos - prevPos));
3 \7 j6 U( s  L6 ?6 _" f3 N- N9 p        vec.push_back(b);
$ |- W3 e( W1 Y/ ?$ R        prevPos = currPos + 1;
; f" L* _6 b1 E    }
6 p2 R: U' O+ G, F, Y4 U5 c    if (prevPos < str.size()) {
- S( L0 p6 ~& Y- L% D8 b        string b(str.substr(prevPos));
/ H" z: o) M) V% m  ^7 c" H* b& l        vec.push_back(b); 7 g7 [: c$ M$ {+ A" y0 z
    } % |4 A( C3 S: z6 X. j
    typedef vector<string>::size_type sz_type;
6 |6 `! W, u6 Y" D9 G% u% W& m5 `0 H    sz_type size = vec.size();
: E/ Z$ o# o4 G& J  B    for (sz_type i = 0; i < size; ++i) {
% g. P* _9 C9 C' C        int a = hexCharToInt(vec[i][0]);
2 L' z. {& S6 b8 y0 p        int b = hexCharToInt(vec[i][1]);
2 t- d; r* h* s' n  m" \        out[i] = a * 16 + b;
2 X3 I8 n* w% I& |/ E- r( `    }
4 |1 C/ H4 {1 {2 O; f% u9 u    return size;
- \, h0 W% ], f1 q5 v* |, s}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H - P0 r  B/ i% K4 q7 W2 c6 Q
#define TEA_H " X! C% g1 s- Z2 ~9 c

9 g& G  w$ c9 q) |/*
0 g! n$ u  K# |( y7 v( k6 v*for htonl,htonl 0 `% T$ G$ i* p$ }1 Q9 b7 Y
*do remember link "ws2_32.lib"
: S* X  y7 \# p4 @$ D1 ]*/
/ z1 D0 j# m7 o( h3 m* i#include <winsock2.h> / k# _! y- q( y8 w& O6 V% w5 t
#include "util.h"
' s: Q# n1 R! T% ^. {( }
2 A: k* H7 P! @/ G( uclass TEA {
6 r0 @3 ~5 g! }7 v8 ]! Ipublic:
% A" W: c1 Q0 Y( W: t% x8 O; y    TEA(const byte *key, int round = 32, bool isNetByte = false); 2 Z6 y: v0 A; h7 ~& y5 k2 J
    TEA(const TEA &rhs);
% G6 ?2 H( F' M" h    TEA& operator=(const TEA &rhs); 6 F: k# h9 I3 v4 t" K, A* F
    void encrypt(const byte *in, byte *out);
: f* Y2 q4 y$ w0 D/ \* |, ~( f$ Z    void decrypt(const byte *in, byte *out);
2 ^6 n6 `8 e1 V+ r% yprivate:
. g, k6 i+ C8 O    void encrypt(const ulong *in, ulong *out);
, X/ q) B6 S% R9 D( Z8 Q, y    void decrypt(const ulong *in, ulong *out); 7 S0 H; ~% K: E/ b8 E+ W
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } - ~9 s" w, F# Q# m" p2 M# q
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
/ K( J4 N+ s0 Aprivate:
0 s* H9 ~  F( {) v    int _round; //iteration round to encrypt or decrypt
- \/ O+ t4 C0 @5 a* j) v0 u4 }    bool _isNetByte; //whether input bytes come from network
8 c1 q! h5 A) e4 c8 k) S! A" J    byte _key[16]; //encrypt or decrypt key - C/ o/ S7 d2 t' c3 H
};
2 i6 m9 V5 f" P, x+ b1 ~ , t" N0 a5 \( D4 \5 W; G+ @4 X
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
% P0 H/ J" y% @1 ] 2 #include <cstring> //for memcpy,memset * J+ b, Z4 v  H7 ?
3  , w/ b. v2 W- u- Q5 r6 _/ \) q
4 using namespace std; 9 n1 F. c6 x/ {/ `
5  3 l, z3 J! u  ]5 \
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
% \3 Z8 U3 G/ \! j4 L% W6 }7 c* F 7 :_round(round) # c# v/ a1 A) o6 j
8 ,_isNetByte(isNetByte) { 6 _" {* e3 X! K
9     if (key != 0) - ]0 \# w/ P) ]9 \2 x
10         memcpy(_key, key, 16); ! G3 _! U* l1 M5 L6 M: U0 z
11     else
, G( Y# z1 C" H% N6 ~% F! C12         memset(_key, 0, 16); 4 |. J1 h+ c- {! r8 M+ O
13 }
9 o9 C* V4 T: N14  
2 z: n% e& Q+ l15 TEA::TEA(const TEA &rhs)
" k1 X3 u- W0 Z8 l, g9 B7 S16 :_round(rhs._round)
/ F+ @4 Z# X, {3 t) a5 a; D2 F; ?9 u17 ,_isNetByte(rhs._isNetByte) {
- y$ S, g5 T" K18     memcpy(_key, rhs._key, 16); 9 z* ?6 E3 Z- I  W7 n
19 }
3 y( V" I6 m' ^! y7 |20  4 i- M+ V3 X9 J0 }1 ]4 A
21 TEA& TEA::operator=(const TEA &rhs) { 5 A/ [* y& F* {) G# j8 j2 Z7 m9 \! S
22     if (&rhs != this) { ; [. }# N/ E: ^7 j, d
23         _round = rhs._round;
: S3 n1 f5 z! C( }; }+ j24         _isNetByte = rhs._isNetByte;
3 y  D6 H& d' c; T4 M/ A) R25         memcpy(_key, rhs._key, 16);
! z& n0 c, n4 R  s. U. G26     }
3 ~; r; \+ F) g" ~( k# v. k27     return *this; # T. h4 `% z5 Z2 D8 o
28 } # c; f. f$ C3 S3 E0 ^# H: d
29  : [. T! g" c: Y, a
30 void TEA::encrypt(const byte *in, byte *out) { ( Q7 ?& O, W* \5 o0 [. {' H
31     encrypt((const ulong*)in, (ulong*)out); ) g* c: s8 |/ L- q! E, x7 K
32 }
* z$ U( r7 G6 F6 M! O2 s5 |3 `33  
6 @; Z* @- @; A34 void TEA::decrypt(const byte *in, byte *out) {
: N. k. I# d# d4 N6 {  \/ s35     decrypt((const ulong*)in, (ulong*)out); , Z4 l! _3 i) j3 `
36 }
3 y) F1 t0 [' ~1 I: I# E2 _37  , M* Z% N; b# d0 B
38 void TEA::encrypt(const ulong *in, ulong *out) {
' o, T" h5 f* {/ ~9 x7 N* Q39  7 p1 [! T, s, r$ G% Z5 T0 }7 q
40     ulong *k = (ulong*)_key; ! v. J) r5 w. t6 H& n( D! w# `  ]
41     register ulong y = ntoh(in[0]);
2 Y% p0 W" y" n$ C) ]5 M0 A0 m& P42     register ulong z = ntoh(in[1]);
# m: H! K" f/ h3 r+ r43     register ulong a = ntoh(k[0]);
; w, i* u3 M0 j% n0 M0 k: `44     register ulong b = ntoh(k[1]);
. t3 L$ E4 H* y7 q1 v# L45     register ulong c = ntoh(k[2]); ' a8 `" G# L7 P2 P$ }, L. r
46     register ulong d = ntoh(k[3]); , d4 e5 f0 P8 O; t" I2 D0 M
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ Z1 v  R# B- d: f7 d2 ], ~48     register int round = _round; 8 Q/ z: F( O6 \' [9 A- @
49     register ulong sum = 0; : g2 G& H5 |+ s, j+ _0 h5 Y
50  & L0 Q, {) Z! i0 h
51     while (round--) {    /* basic cycle start */ 6 E. w) _5 E; q  W# o) G9 c( J
52         sum += delta;
, n3 c) g! v2 u+ H+ G! ], [53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); " A0 W3 @. H7 p! H6 z+ r" Q
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
0 _# s- o8 ]3 M/ G55     }    /* end cycle */
0 q. w  m1 ^4 m+ D. N56     out[0] = ntoh(y);
+ b+ A! J3 F4 D' v; ]57     out[1] = ntoh(z); ! _! u; L( }: h9 [( H1 A6 x
58 } , Y6 T# y8 I% s$ M
59  
4 t" u) v, i# P0 ~$ |, N60 void TEA::decrypt(const ulong *in, ulong *out) { . c4 N7 T' a3 f
61  
! D% [2 b  V; E8 }! _7 ~62     ulong *k = (ulong*)_key;
; }4 x- y- O* U4 @( \63     register ulong y = ntoh(in[0]); ' u) X$ m' z0 F! r' c/ ~4 y
64     register ulong z = ntoh(in[1]); : A6 Q) f3 L; z$ B4 h  ~  I9 i4 q
65     register ulong a = ntoh(k[0]); 5 p4 G; t& L( ~2 U8 k" p5 a
66     register ulong b = ntoh(k[1]);
/ y6 M0 v/ G& s7 {1 R7 w0 s# ~$ G67     register ulong c = ntoh(k[2]); ( @" J9 Z4 q, ^$ _4 S2 }9 s
68     register ulong d = ntoh(k[3]); + G" q$ h. o* R; n/ X
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ h$ t, F( m  B1 T$ [4 z70     register int round = _round; # f! Z. P2 p( ?
71     register ulong sum = 0; , k( Y  B6 `8 y0 H' s1 f
72  & M% A, z! ?$ p6 j# k
73     if (round == 32) : E8 H# S/ \. a( ^+ C
74         sum = 0xC6EF3720; /* delta << 5*/
# f- i5 H% k9 }  M4 {* \* V75     else if (round == 16)
  i) K- Z% ?3 ]3 n! M7 n$ V76         sum = 0xE3779B90; /* delta << 4*/ 1 o4 j2 _1 \$ E- c0 n) Y# V$ p$ k6 j
77     else ! A" F9 F' v; i1 c
78         sum = delta << static_cast<int>(logbase(2, round));
- [3 {9 L2 r% N2 g6 k79  , A  i# }+ ?: r+ [  v2 F
80     while (round--) {    /* basic cycle start */
6 Z$ @) ]7 _* `) A+ D( H81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); % E1 v6 K) X0 W! g: N5 W
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
/ @' }1 u' k1 u83         sum -= delta;
0 q* ?- l4 Q4 ^7 k* y! U, A) X$ d0 y84     }    /* end cycle */
1 {8 [2 X0 D$ _5 p2 v* c85     out[0] = ntoh(y);
7 S( V+ B  }/ u, ^# @" S8 ~# R86     out[1] = ntoh(z); 2 }9 O8 G2 {* h! J! O5 \2 a' r
87 }9 Z. {- A6 j  {, B; r* M. q

$ s1 E4 Q. m3 Z7 V% w+ V% g4 U8 U( \9 V需要说明的是TEA的构造函数: + i1 Z: M# J% u; i6 Q8 j7 @
TEA(const byte *key, int round = 32, bool isNetByte = false);
7 y9 \$ Q. w# \' s) }( l1.key - 加密或解密用的128-bit(16byte)密钥。 - {1 e' L5 F! {/ n: c
2.round - 加密或解密的轮数,常用的有64,32,16。 ! X) `6 `3 j8 N- I6 u* k$ P' p
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! . q2 k* @2 ]& H: j

0 S/ b  E9 X9 \0 N最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 5 H7 |* l( J6 l9 I. x( G8 L
2 #include "util.h"
. t6 [4 G" C- a, t6 t% d 3 #include <iostream> ) b  h+ g8 d' Z) u
4  + }/ T" T! g( n: @4 X, \9 [
5 using namespace std;
6 N4 E* t) m0 Q2 \: Z 6  
: Q0 P  y4 V) w" W1 r4 T; K, I 7 int main() {
3 Y$ r) c/ h  u1 v0 ^  F7 Y 8  ; L9 `+ i  @3 [: c6 L; l; A
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); " G3 b% \. M; c% H( M' i) @
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); # z& w5 G+ q! H% V! M; o
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
$ V# L1 [: Y& }' w0 h* g7 c: }12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; % C3 Z( }! _% V# @  v9 X2 c
13  ! d- @1 C, p, r: H' f
14     size_t size_in = hexStringToBytes(plainStr, plain);
- U4 R7 c( g; e9 K3 g* }8 b$ T15     size_t size_key = hexStringToBytes(keyStr, key);
7 G$ N  @  H+ R( M- K  U16  
9 |5 L/ F* P! d+ V& i/ q8 h17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
0 p$ j) y5 H8 V18         return -1;
: Q7 |; P& x0 t% \2 T8 z4 L% e+ w; n2 m# U19  
% X# q1 ]; h+ M9 Z& h20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
4 ~5 O9 ^" [- E. a7 W" J  k21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; # Q5 K7 W% y9 Q
22  4 B* y* F8 l5 R  r+ M1 s
23     TEA tea(key, 16, true); 0 r0 `% S. e/ D" N$ m- s
24     tea.encrypt(plain, crypt);
& a7 R0 w- D3 I3 h2 c5 E0 t25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
+ H) A1 ~' b* _- j3 T3 c. W& o26  
3 }; U6 N/ Z% r27     tea.decrypt(crypt, plain);
6 y4 `& B! j% @' Q3 T7 Y& K28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
7 U; ^3 C6 y6 l29     return 0; & |$ }0 H+ s2 F/ P; x0 r
30 }7 z  e4 w% q# H! M9 i

; Q4 M, h- K5 X5 d本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
% _( d( T3 ~5 G! P% b( l运行结果: 6 }& |* G4 [  Y- |
Plain: AD DE E2 DB B3 E2 DB B3 8 f6 L$ R% n3 V# H. x$ i+ ^  b
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ! Z* f# \% K) r8 c9 T( N2 a
Crypt: 3B 3B 4D 8C 24 3A FD F2 / I4 U& Y! Y4 H  w2 m/ F
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-29 03:35 , Processed in 0.018909 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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