找回密码
 注册
搜索
查看: 37081|回复: 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轮):. q9 J* `( A+ f( i8 u2 j# G: P3 k
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 / {! L8 B. u- z+ E; y; k3 s8 O
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
) m% ]* a# {; w, O2 P2 u) W之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
. l/ c% s$ i6 a9 h+ e在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 $ p+ L' h6 W, y: u0 i5 m9 _; n
在 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. ' k' w7 b2 H& c- U& ?2 M0 C" A
  2. void encrypt(unsigned long *v, unsigned long *k) {
    % g. }* q/ h% W
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ) I* n" S( W9 ^, z
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    + ~8 \: ]6 X1 e
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ " K  b+ h3 v) O7 m6 r
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ! N  D( B8 O4 T+ Z" C
  7.          sum += delta; - v. t0 l) ^7 a
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ' `; _* }7 D: e7 F, N8 r: @
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 8 d2 T) J+ u1 W  X9 }9 {
  10.      } - e+ O. _1 _6 v3 t) {
  11.      v[0]=y;
    & E7 z9 E2 S- p" j* l! a8 O
  12.      v[1]=z;
    9 a: s3 J6 _; ~3 B; c% r8 }4 a( ], r
  13. } + w& j4 N+ s( _4 u) x
  14.   
    - {2 K+ H* t1 U5 O& ?
  15. void decrypt(unsigned long *v, unsigned long *k) { 8 J; y" }* C/ f
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 7 E* O3 V" k4 j1 |3 A9 E* l) W$ o/ w
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    3 G$ U( U0 k6 Z, A' m
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ! W# B0 e% {5 P7 ?% b4 k
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ % v. M3 f+ Z) v0 Q4 \1 j! y
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 2 C( ~$ I  U/ j3 a# K
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    : F( T0 L2 r- w# Q* A5 L) o1 m
  22.          sum -= delta;                                /* end cycle */ 2 F; v1 Q$ G) F3 X4 ?0 c
  23.      } - ~9 p5 [2 H( g# c2 q
  24.      v[0]=y; 7 Y2 ^& _9 S9 S; w/ K
  25.      v[1]=z; 7 g- n6 m$ p3 h( o' R
  26. }! O# w0 G" R% |6 v/ k- B+ U8 y
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
4 ]9 D2 s+ V5 \! }: l/ N5 k5 L#define UTIL_H
# q* ?. @+ M+ m$ R8 `! y# n" e# c* \3 b* Y& W7 G
#include <string>
' x8 S- k, G. r! n, {6 e#include <cmath> / q/ }$ O2 Y/ c+ u( \
#include <cstdlib>
4 R- _: _/ h0 O/ t* U, b& f1 f6 c - _( W, _* k2 S0 Q( [' y
typedef unsigned char byte;
# Z; ^4 b( Z2 L5 C% K0 D; l" k- Ktypedef unsigned long ulong; 8 k" _) _/ j' O/ I- M1 C7 ^; }" T

, b0 d( X+ e( iinline double logbase(double base, double x) {
1 ^, h/ b4 S$ _" m    return log(x)/log(base);
8 e1 @( F9 K6 e% q}
  E  b# q- A; |& ?' f5 I) D
# e1 F- Q5 f5 A) V4 l/*
3 i1 C; ?, U" ?# s3 D*convert int to hex char.
- ^2 A/ g& N; R( i6 S4 J# u/ j, e0 O% v*example:10 -> 'A',15 -> 'F' 1 s5 M1 s/ ~+ j$ u% c. c
*/ 6 S! p% ]; x( k" r* b
char intToHexChar(int x);
; t6 x% \* c3 R
4 U$ r" c6 Y/ y2 \" i/*
. `) ?4 O4 A4 V2 r- L% I*convert hex char to int.
: y& R0 _; n' m# M& E$ h* X. q% t' C, `" i*example:'A' -> 10,'F' -> 15 / y: R- P( v/ a( o
*/
$ k* }- j- e5 ~int hexCharToInt(char hex);
0 f! _0 b& F) H/ E. x- X% J* f- z $ H4 ^8 U) Q+ g% }: h" s
using std::string; 2 z9 N2 z5 i% _' M. r
/* % J: ~+ S* N6 d
*convert a byte array to hex string.
& \% ^; P& l* U( h*hex string format example:"AF B0 80 7D"
, O4 ~# z- c& x; h& p4 C/ i+ q# D*/
6 A7 D" |+ L* D8 ^- zstring bytesToHexString(const byte *in, size_t size); 9 Y. E$ d: O- K8 c

% }/ C, t: h4 j* M, ?) [: y/* ( {# }  j2 V. Q. C
*convert a hex string to a byte array.
$ c$ I0 e9 O& z& g*hex string format example:"AF B0 80 7D"
# J# ^- h  ?* [+ W/ X*/ 3 R* X* b; _4 ]9 k
size_t hexStringToBytes(const string &str, byte *out);
3 H9 J0 y" q) c& O- L9 ]/ Z6 O : l& [& ^0 P- S) S  n+ ^" M
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
! @! V7 b* W  E: H# ]#include <vector>
# o  C1 G/ J/ q4 i) F$ P; X
5 b& y, c- |. b  W& r8 n/ Iusing namespace std; % m9 J2 R1 a. M3 B7 m4 I  H, m* S% Q
; X& r' g# O8 ?$ U" _% A
char intToHexChar(int x) {
8 n. R/ P0 C5 {    static const char HEX[16] = { $ ?" t4 X  g+ p9 C& g. Y6 m' g% G6 d
        '0', '1', '2', '3', , F. X1 m" I. W2 h+ c# P) _
        '4', '5', '6', '7', 1 Z8 B; \, Q2 @- j" y
        '8', '9', 'A', 'B', ( E6 i; ]/ c2 l* a/ ^0 [( y: @
        'C', 'D', 'E', 'F' ! M9 J6 _8 x( p
    };
1 v8 M/ B  w. \4 ~4 v0 F2 A    return HEX[x];
" X! N) W6 o, ~; Q/ g, b9 @* N} # r' t. W7 E! c& i
* i+ ^  c8 n8 A( t* g
int hexCharToInt(char hex) { ( w. \( f% g, n2 O
    hex = toupper(hex);
" d1 b0 f0 @) @    if (isdigit(hex))
' ]4 `2 Y7 |# G: U( x6 q        return (hex - '0');
% T( X7 q6 h5 f) d6 ?( y8 f, ~! T    if (isalpha(hex)) 8 y) F1 I8 C  M' r
        return (hex - 'A' + 10);
8 d, y5 Y4 i) a2 g' z    return 0; 2 U6 H* v% q/ S6 @. d4 K' P6 o6 }
}
8 D4 V: p7 z9 H1 ?. s% P" R6 [* P0 X
# e2 W% `3 p6 j3 \6 pstring bytesToHexString(const byte *in, size_t size) {
! i2 D# K* ^& V. l& ?( @* O    string str;
' v7 \# H. ]6 \' k0 P1 b0 `) ~    for (size_t i = 0; i < size; ++i) { 8 K! K& g0 V% c9 @: j+ j
        int t = in[i]; . E3 z0 B6 G8 w/ F' n
        int a = t / 16; 3 q1 z8 x0 Z# D: z/ ^' e
        int b = t % 16;
& F# |( w* }: y& A        str.append(1, intToHexChar(a));
! v' R( N) |8 @6 s5 K8 z        str.append(1, intToHexChar(b));
& v+ C5 k8 o/ q* y+ |        if (i != size - 1) , m+ ?6 Z8 L, H
            str.append(1, ' '); " `' W4 Q; \, x! p
    } 2 y$ _8 e) _& Y* R) l
    return str;
7 s$ O; l0 l0 J" S* Y4 P- ~& k} % o! f! W4 C( ^1 T" K* H  a  P
+ a7 F4 Z' |' w9 u( I0 \: Z
size_t hexStringToBytes(const string &str, byte *out) {
' w8 t& ~2 `1 M+ K. E/ o! a 8 y/ l' Z& C2 m5 K7 E- ]& J
    vector<string> vec;
1 t+ s6 S& Y" z6 {$ \    string::size_type currPos = 0, prevPos = 0;
. N0 D* ?/ _) g1 k* k& b( D    while ((currPos = str.find(' ', prevPos)) != string::npos) {
* Q( t, }8 ]1 e6 d* R. B& K0 J        string b(str.substr(prevPos, currPos - prevPos));
$ |4 F  E2 ?- G! s5 [" C& }; c+ p0 [        vec.push_back(b); 8 u' y4 u# U+ }: n# c, {
        prevPos = currPos + 1;
, Z& q8 V# f: f: c9 Y# C    }
2 c" M. R, K" F- A, N" q6 ~    if (prevPos < str.size()) {
2 ~/ `9 t  l& `& z8 k  [7 [        string b(str.substr(prevPos)); 6 r" j! Q! D: Q, J8 v% d
        vec.push_back(b);
" H6 V! F4 G" t& C/ o6 d    } % X3 K1 p8 u6 q/ I0 U$ o* c  B/ ^
    typedef vector<string>::size_type sz_type;
' C$ q  p- l( p2 }& k5 m7 E2 n  r    sz_type size = vec.size();
+ l0 s# |+ P) L# E$ n    for (sz_type i = 0; i < size; ++i) { ( @; w5 m% j7 _( S
        int a = hexCharToInt(vec[i][0]); ' T3 j( z( a% W, \7 S
        int b = hexCharToInt(vec[i][1]);
( s1 l" }& y+ N4 D, m        out[i] = a * 16 + b; ; e6 j3 K2 |1 h) Q7 V# E- J
    } 7 I3 `1 `0 r6 x3 F1 B' G: o- k
    return size;
( m0 D. T* d4 `' w8 j8 U}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H / R3 @* ?- A2 @
#define TEA_H + H5 i  I  f0 |* `

8 b; j$ ?7 F" r. g/*
4 j6 t4 w" ?+ V; F& E# [9 }*for htonl,htonl . n& l2 S! _: }2 a
*do remember link "ws2_32.lib" 6 d. B2 i0 i. ?* k- p$ G  J2 f
*/ 2 q9 h; ?6 f, [$ N% U& e. M6 v1 \
#include <winsock2.h>
6 X+ M; ?: d- r' Y# X* J#include "util.h" * a2 l( i. e+ [  e& i( t' Z% @0 }

8 }5 X% c/ ]  g  v9 o8 lclass TEA { 5 Q, V0 o& ]. d5 U2 g
public:
5 o0 ~+ f5 w6 m$ k, F5 S    TEA(const byte *key, int round = 32, bool isNetByte = false);
4 E/ w% z8 a1 Q+ e) o    TEA(const TEA &rhs);
& H( A$ Z4 ^, P4 I- }3 M    TEA& operator=(const TEA &rhs); : M( l* h! G7 ^$ |. ^, B1 R" W
    void encrypt(const byte *in, byte *out);
1 G5 q: f1 Q+ Z, |) j    void decrypt(const byte *in, byte *out); - k' G$ h! \$ p# u1 m9 s- n
private:
' {$ D- Q' }/ m9 h; q    void encrypt(const ulong *in, ulong *out); ! V1 k% N, ~+ x: d1 F
    void decrypt(const ulong *in, ulong *out);
$ Z/ f4 J: o1 p- {+ m& n5 E+ r; `    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
5 @% ?) x- r) d) C2 S) b# D    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } # T6 D+ s2 X: m; Q
private:
% S- ^$ j4 F) ]( ]: g* y# G8 s/ h    int _round; //iteration round to encrypt or decrypt ) n7 [/ K6 o  ^  V1 S
    bool _isNetByte; //whether input bytes come from network
/ @8 V2 g$ F- U) ^    byte _key[16]; //encrypt or decrypt key
" X3 j# r9 g% Q4 ]; u: k}; & T" e2 E: G, E* ]7 {* H

6 \9 s! O' `; {4 A7 R4 T  P: _#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ! c  _4 a2 C8 s: L( m
2 #include <cstring> //for memcpy,memset
- u. V: W+ q0 K& h8 T 3  0 ~) N3 a. s& V+ L. D
4 using namespace std; 5 ]/ [% v. ^' ^% t0 Y" i4 q4 M
5  
1 l6 D" _) \: \+ t4 ^3 ` 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) + j( h# I$ U! ?) t5 E! u
7 :_round(round)
* \0 q& t; m% T/ V 8 ,_isNetByte(isNetByte) {
8 `- ^% b0 S( ]5 ?! D 9     if (key != 0) # Y8 d8 g" I" ?$ M
10         memcpy(_key, key, 16);
* n5 B/ N" o: ]11     else
* [, q" T7 G  ~1 \# m12         memset(_key, 0, 16);
& G3 N  p& B0 B+ d/ a13 }
' N$ X, Z, Q0 H) I5 ?14  ' y% c9 `4 ^3 C# W7 _0 c" w
15 TEA::TEA(const TEA &rhs) + Z6 H  D9 k) M' _: R0 F4 Z
16 :_round(rhs._round)
' e7 T: y6 S" }& W/ r17 ,_isNetByte(rhs._isNetByte) {
1 _/ D8 W3 z4 C. m18     memcpy(_key, rhs._key, 16);
+ r+ u7 Y2 w) x  k19 }
$ ?6 R0 g* z& J" l! _) R20  + S( @7 x' n1 }( l% B
21 TEA& TEA::operator=(const TEA &rhs) {
+ H* B6 |# X: t: Y" U6 {4 J; {22     if (&rhs != this) { ' c* N4 X8 c/ t/ d1 P* J5 ~
23         _round = rhs._round; ) |; J% o) m$ q
24         _isNetByte = rhs._isNetByte; - S* x& r" C5 }( O: a4 [1 G, n2 B8 v
25         memcpy(_key, rhs._key, 16); 8 A) r# K; k* `" K( K% W% R
26     } ' ^! y( U) B% L% O( [
27     return *this;
8 o: {  @$ [7 `; {: U28 }
" O& u' |' F* |- v7 B( h29  . ~  f  _, h& {1 n" `
30 void TEA::encrypt(const byte *in, byte *out) { 2 E4 i2 @1 R$ Y5 z; W
31     encrypt((const ulong*)in, (ulong*)out);
, z4 m0 d2 A8 J1 p4 m9 T) Y32 }
3 c5 _& r: ~6 p& R7 b; w33  ; D! Z+ T6 U4 f  {$ @' r; {
34 void TEA::decrypt(const byte *in, byte *out) {
+ n* z: f4 u2 B. i* g1 l/ Q" ^35     decrypt((const ulong*)in, (ulong*)out); 4 O5 p0 _* B' {4 i  P9 z
36 } 9 D9 _  Z/ J  G2 X0 p
37  # F; M, n9 K8 `8 L2 p
38 void TEA::encrypt(const ulong *in, ulong *out) { & w1 v! D4 F2 u" f6 _
39  
5 g! o9 b0 E0 @$ [$ {40     ulong *k = (ulong*)_key; 5 a2 y; o- D6 T: a1 v( S* Z
41     register ulong y = ntoh(in[0]); ) N: w3 \- Z* E; G
42     register ulong z = ntoh(in[1]); & n4 S2 a+ U( f/ X* ~; p# Y7 I: O: j" W, @
43     register ulong a = ntoh(k[0]); + l# f) D7 _" c, Y
44     register ulong b = ntoh(k[1]);
( c! g0 F$ j1 V$ W, e45     register ulong c = ntoh(k[2]); : B" ?& y2 S& g+ p# u- w
46     register ulong d = ntoh(k[3]); $ n6 C& X; ]2 I: Y4 ]
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . ?/ y/ z2 m2 K. N$ E& K! k
48     register int round = _round;
4 G/ H7 J9 c/ p; D2 A9 c, g6 h# y49     register ulong sum = 0;
; T+ k4 R" ]- R& E' m  E+ o: h2 A50  7 m, h+ d, n" V8 Y9 @8 `2 ~- o
51     while (round--) {    /* basic cycle start */
' A) H- D: X- k0 _6 r. C) \6 S! k% ?52         sum += delta; ; C; K& B8 P) o
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
& M, ?' L  K2 e54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 3 ]2 v% _1 a4 Y1 Z9 z* V7 c
55     }    /* end cycle */
/ h( {4 t& ]' V$ `; `56     out[0] = ntoh(y);
. t8 \3 q9 ?! e  U6 N57     out[1] = ntoh(z); : F6 j9 w' C$ {
58 }
- R7 E8 ~3 U$ ], g9 G; g. @59  
: ?$ ]3 ?1 ~( D) }$ q60 void TEA::decrypt(const ulong *in, ulong *out) { , K/ x, c8 B3 Z( W- W* `
61  # y& y1 R+ |3 A7 w! ]8 u  |) B- f
62     ulong *k = (ulong*)_key; % b9 @7 M' I8 `+ E7 x6 b1 j
63     register ulong y = ntoh(in[0]); 7 L: n8 r7 G" |3 B; c6 ^
64     register ulong z = ntoh(in[1]);
7 g, m: x5 d* C) u& @8 k' B& A- {65     register ulong a = ntoh(k[0]);
! s  W- j9 \- g0 r- Q66     register ulong b = ntoh(k[1]);
5 d  X; {+ R+ S) e1 ]- [% L67     register ulong c = ntoh(k[2]);
, ?2 s. w) L. i: p2 v7 D68     register ulong d = ntoh(k[3]);
. Y/ F/ e& {8 V# H69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 9 h- B) q- V( ^2 t. N& r% ]! |
70     register int round = _round; 5 n, b5 U3 K8 ~4 m; {
71     register ulong sum = 0;
+ t* h& M! t9 G6 {72  " J% I* U9 \" Z# F2 Z
73     if (round == 32)
2 C: n$ {2 P( g3 Z. K/ H" G74         sum = 0xC6EF3720; /* delta << 5*/
  e( W6 f& h2 v1 x75     else if (round == 16)
$ s2 `8 e/ `, C' Y, N$ c9 r' u76         sum = 0xE3779B90; /* delta << 4*/ : Y( N5 M4 `' A4 r" \3 v2 @+ C' l
77     else * L7 H& e! k( q( s
78         sum = delta << static_cast<int>(logbase(2, round)); ' ~) @' v- F/ n  J$ H7 q: ^7 y' Q' N" u
79  - z# d' b: t2 Y( w1 S: l  y
80     while (round--) {    /* basic cycle start */ % @# Q5 C# E# |5 O6 V) k9 @# v
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
) R( W* e. n# Q  d# L82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); , @' V8 E$ |( v  x
83         sum -= delta;
% \; {8 A0 R) w  `8 u- H. g. ?84     }    /* end cycle */ : Z( _& [* _# L3 ]! v% a( a* L' g- D% L
85     out[0] = ntoh(y);
5 W7 D( g  l$ m/ r! `3 ]) F: C' ]86     out[1] = ntoh(z);
* j! V/ a, w& g7 f7 p( T87 }$ B( Y, I* G+ J" t& Z! j: g3 y# u

; I1 A  R; Y6 F需要说明的是TEA的构造函数:
3 M6 v# }7 [( ~$ n' eTEA(const byte *key, int round = 32, bool isNetByte = false);
! i" o9 r+ Q9 H; n' u& k7 L4 @6 A; z1.key - 加密或解密用的128-bit(16byte)密钥。
) `" q. X/ q, @+ z0 d5 F1 s2.round - 加密或解密的轮数,常用的有64,32,16。 / \' B5 M7 }9 M1 T6 ]" l8 V( ~" l
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
# F, r: Z; L; R7 ^7 s0 W
% f: j& S/ I0 \7 x, g% o* |最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" # F: U- [2 V5 L7 m0 y/ }9 v
2 #include "util.h" # g+ |: k1 d. E4 l, W
3 #include <iostream> & v2 e$ k8 |; K4 p" T! f* y. A
4  
" e9 j2 U! f- t' T( w& ~ 5 using namespace std; 6 `' G7 ?' k, Y& L! s1 r# B
6  ; p$ q+ }0 h% h( }" q  M
7 int main() {
  K9 J% f9 e& @& b: @1 P 8  % b! F5 x2 x5 |- j
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
0 U: y9 g/ @* S& N/ y: S2 I* W, B& ?10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); $ B9 `3 i- b7 j9 u% U/ `
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
. D2 j  h% n  [2 Y3 C12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
# k4 D3 J6 ]0 p- I& l13  : g, b$ r2 H$ O  J" U5 K
14     size_t size_in = hexStringToBytes(plainStr, plain); 9 p! s0 a7 |; v9 r' N, e% b
15     size_t size_key = hexStringToBytes(keyStr, key);
/ Q4 m, ~& I3 q9 q( e16  
1 P1 F4 J0 ?, v8 g: u- ?5 o17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ! }  p; |  c) }2 b/ B1 e. L* J
18         return -1; 8 Q; L: x0 G- q! A5 x7 O7 P3 b1 i! z
19  
1 B9 l+ s! N" h0 _20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
5 z9 |! q2 ~+ B  |21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 9 p! h3 u0 L1 n
22  : k% Z" \8 ^3 H1 t" o$ }& E
23     TEA tea(key, 16, true);
! W$ J" D% ~2 y% v1 F: P24     tea.encrypt(plain, crypt); , m% K# o3 l$ f+ a
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 8 N$ K1 G/ }) L. U) P6 |
26  - M( C1 i5 |: }! Q: U
27     tea.decrypt(crypt, plain); 6 [) F# V8 j6 a  R& f' S- ^& m+ O  W
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
+ B! r0 k  ^1 i: T- A2 @  F29     return 0;
( L1 x' {" a8 E; ~6 {6 Z3 A30 }
1 k+ J/ x7 Y( u+ f' Q7 U/ D6 C6 B$ @
+ }; c+ v- m* @9 O" b! @本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx( _7 `/ r" ~- ^$ Q
运行结果: # V; t3 O9 x; A5 B0 Y
Plain: AD DE E2 DB B3 E2 DB B3
; E9 h0 b, ~# T4 }9 Q" x$ `Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ! i2 `8 o# N; b6 d) b
Crypt: 3B 3B 4D 8C 24 3A FD F2 & }* A1 u( \4 C$ L2 [1 f# L2 C
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-30 08:45 , Processed in 0.037112 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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