找回密码
 注册
搜索
查看: 37734|回复: 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轮):
* D7 g$ d) d1 J5 k2 k0 A$ g( V微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
8 v0 `( Y7 X% _1 X2 ATEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 , A) N! ]2 M- E6 y1 I
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
4 P1 s* v8 b% C8 L7 f4 R在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
" g( X9 z7 l" f: I! H在 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. ! C9 b" R6 s# o; e0 M/ e. D6 @
  2. void encrypt(unsigned long *v, unsigned long *k) {
    # F3 ~; l/ r( V+ C
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ! l1 @. s' s. B0 |/ V5 Z
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    8 i" k# z3 i- V' E, [4 V
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ * H- ^4 q6 \: Y3 Z) e+ Q% z( u9 d' N
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    4 D4 i; S. ?6 B  l
  7.          sum += delta;
    ; U. n/ ^* A, g1 s1 K
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 7 c+ u: v$ \0 i* v8 F4 e$ p+ {
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 5 Q0 P1 m* i8 P9 Y6 L  Z. @& R
  10.      } 0 K% L9 I* N4 f5 Z: @
  11.      v[0]=y; & [' l+ p% }/ c! W
  12.      v[1]=z; & {1 g) q5 U' o
  13. } " Z, c) h" I; O4 k" c; z2 p3 B
  14.   
    # Z2 ^% w# T/ U
  15. void decrypt(unsigned long *v, unsigned long *k) {
    5 [9 @" f5 H0 c3 l: Y- ~2 C4 n
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ $ F* S! j8 d  d6 I' C3 A
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    3 D( M1 T( r( i! g" X
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    / o& a' ]( q; B; n1 _
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    * i2 x0 p" }6 D. q* C" i$ m" m( t
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    7 E7 C0 p- ]+ F5 _; p$ P# u
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); * ~: O8 [  h" g+ M& ]& _$ T
  22.          sum -= delta;                                /* end cycle */   T8 c- G5 T' F
  23.      }
    . a, l. O# }. ?$ z* _1 ~
  24.      v[0]=y; 6 k3 T! Y. N; |3 f/ O4 C7 }6 h! [
  25.      v[1]=z; 3 r/ [5 A1 m2 @. R" @$ B8 B6 d) X
  26. }
    8 ?; G0 n; C) ^! q
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
6 h5 a' Z( S& P1 L$ N# @#define UTIL_H
) c. k# r! K! O7 ]5 J
# o' _; x) s; F#include <string> . K9 K* J) l: @0 z$ A$ j
#include <cmath> # i( ~0 U9 O1 `$ E
#include <cstdlib> * {* F+ f  D. T6 O  p) ]( i! V. x
$ l9 e, S7 p9 P7 w3 a) u
typedef unsigned char byte; , w# p1 \9 ]+ \% S9 a2 V
typedef unsigned long ulong;
$ J7 ?  X+ [% ]5 J2 i, k
' E' y6 Z5 }3 Z- I& @& l0 jinline double logbase(double base, double x) { 7 X( b9 o" Z. Y
    return log(x)/log(base);   M6 _( c# }. R% c* }
} ; q% Q. Q+ \& M: V* x" L

2 Z5 ?$ E6 @& M& L! Q, e6 L/* ) W: v* n; S8 `
*convert int to hex char.
* R8 J7 R( ?+ M/ ?8 s" R2 [*example:10 -> 'A',15 -> 'F' / Y2 K2 M2 \8 |' B! r6 H
*/
5 P9 z5 N) |* ^2 nchar intToHexChar(int x); ' e0 @5 w# J( Y9 m3 E. }9 Y4 w

9 U/ F  k+ b8 p; v, _/ w/*
- v9 k, Z5 d0 l" K* O*convert hex char to int.
& ]3 h) k3 q$ f/ ?, p- M! w- ~# E*example:'A' -> 10,'F' -> 15
4 _3 M$ B3 ?7 S/ R) A0 h*/
, l0 ^/ Q: q  z$ e/ P5 D; ~( Rint hexCharToInt(char hex);
! M+ f& y6 ?8 b* L' H: Z) F ( l. {, ]' Q% o/ f' e
using std::string;
0 T( _/ v5 T, ?3 Q  w) z5 {/* ' C  Q& Z4 F6 ~$ U" [, S( g! n
*convert a byte array to hex string.
5 F! Z% w' Y6 A4 b7 H; E*hex string format example:"AF B0 80 7D"
5 `7 I; ]/ N" w& U*/ 0 f7 n# w  E2 S& A: t3 f
string bytesToHexString(const byte *in, size_t size); ( g- _7 W$ H+ `$ r( A

9 ^/ M/ ]  {; M6 ?: h' c4 {/*
! Q4 ?! N& P' N$ |4 n$ q*convert a hex string to a byte array. + v7 P, ?' S. C0 g, _
*hex string format example:"AF B0 80 7D" # S( G) @# T3 z/ Y0 ^9 j/ _8 t
*/ 1 t2 v2 X" A# e
size_t hexStringToBytes(const string &str, byte *out);
6 c- p- S1 l; g7 I: y8 N0 U 9 H8 ?. Z% Y$ Y' L  t) y
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" : _7 |& @9 q/ g0 g* h, v; C. c
#include <vector> 4 d9 \& q0 g4 n8 l2 v$ J

4 m2 ]; D3 ^' eusing namespace std;
" m, \1 @  @- D  A4 V7 p$ c
) a7 a  ~; P7 e6 w7 D8 Pchar intToHexChar(int x) { ' ^9 _1 r' b( L. ?  D7 ~
    static const char HEX[16] = { 3 U' i& h# z$ S1 y. V" G& I6 U
        '0', '1', '2', '3',
- V* g3 L6 S5 Z, `# a# M2 [        '4', '5', '6', '7',
2 o' D6 ]6 q7 J/ i3 p% Z" E( Q( b        '8', '9', 'A', 'B',
, C4 z+ U' d4 a+ B( ~        'C', 'D', 'E', 'F' / z, N/ T6 f% D% E. j
    };
. w- Q5 v8 @, p1 C; O    return HEX[x]; 8 }' H8 z3 @8 C, J8 }6 J
} % ?$ T, X  q* ^7 R
6 y+ i4 v  E2 _2 O9 e
int hexCharToInt(char hex) { 5 N0 n: u/ w6 c& A' J
    hex = toupper(hex); 1 H2 u  R: \$ b4 b& `2 v4 ?2 S
    if (isdigit(hex))
& T; ~, R- j3 ]% i2 @" j/ E        return (hex - '0'); 3 G, {: x0 m# w
    if (isalpha(hex))
, }& z5 C* v8 `0 t7 ^/ b        return (hex - 'A' + 10);
: l8 k& g  Z4 a, d1 _' E3 U    return 0;
+ D6 J3 D' n" w4 ^& I' _) s}
& |! [; T  V1 X& G+ A6 ?% c
: V9 \9 {* \0 ]& ?. T- n( l* ]string bytesToHexString(const byte *in, size_t size) {
5 J. v5 Z! a. V3 H" w" X( N! c    string str;
$ y1 a* B/ [0 R    for (size_t i = 0; i < size; ++i) {
' N. `* c4 S8 f: C        int t = in[i]; 5 s3 ]+ W2 \0 g+ B" ]& d2 x
        int a = t / 16; ) B: C# \3 `; g2 Z
        int b = t % 16;
: r& ]) L( O1 P( Z7 m6 g9 d9 `/ N        str.append(1, intToHexChar(a)); * J: a( ^0 ?4 C! g" c2 e
        str.append(1, intToHexChar(b));
0 w4 @4 [" l- j! C/ D/ e; I4 u        if (i != size - 1) % `5 O' }! W$ _
            str.append(1, ' ');
2 w  c0 u- x% ?2 V/ v4 u    } % D8 r& |/ d% q* k: X
    return str;
0 u7 Q  K2 ]! v9 q  {}
  V$ A: @3 B% t& U4 J . ^7 I- z- ^* Q% V; c# D9 I
size_t hexStringToBytes(const string &str, byte *out) {
  _( d, U9 v) h6 _ - Y( z2 i% g" d" ^
    vector<string> vec; / F5 E# P0 g% G; L+ Q
    string::size_type currPos = 0, prevPos = 0; * c6 ~, T; G+ Q; D# F6 [& E
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
0 |4 \, x) {# z5 p8 @' w! o1 w* w        string b(str.substr(prevPos, currPos - prevPos)); : {9 ]6 O/ ?7 C2 ?
        vec.push_back(b);
, X8 M* m( m) u9 ^        prevPos = currPos + 1;
. i$ V( _4 U2 b! Z    }
3 Q! n& }& w6 E' M7 j    if (prevPos < str.size()) { . O. x+ h; U8 Q0 J; j- H/ w
        string b(str.substr(prevPos));
+ @4 @2 J# J* t, H/ ?$ g        vec.push_back(b); 3 [* D# j0 ]/ J6 r9 x
    }
  h4 M' f# J4 ]    typedef vector<string>::size_type sz_type; 2 l$ d/ z( `9 u' R) o" e  ]( W
    sz_type size = vec.size(); 7 L& p: ?9 v. a6 k  f5 p6 d
    for (sz_type i = 0; i < size; ++i) { ( n5 m" [# ^& j: M
        int a = hexCharToInt(vec[i][0]);
/ [1 u+ `" x8 y4 [" u1 t        int b = hexCharToInt(vec[i][1]); 8 {8 _: P( s6 j- N: F- {+ @/ \: c
        out[i] = a * 16 + b;
, o* [6 i4 C7 r" ^( T: K    } % F+ h/ D# [  F! J
    return size;
  _- K! v+ E, r" j! A& A" K}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H + Q; y  R% c  S, q
#define TEA_H
- J  X' U! J7 z4 W0 _
& I7 T2 D" ^" {6 ?1 q/* * E8 o4 D7 \% f/ R7 U. O, W: w
*for htonl,htonl
* n, G" Y% j3 @" F( M2 I6 O*do remember link "ws2_32.lib"
9 i3 N% t3 f7 e2 ?*/
; F: P, ^, Z+ Y: v/ ~& F#include <winsock2.h> " ^/ n8 ], Y1 z6 N5 i
#include "util.h" 7 {7 ~! V: k6 B  ^9 M
* ]: v, Y* S2 k6 g9 b$ W
class TEA { % Q; o* [  F4 d; U- U# J
public:
) w, o, d- k8 Z$ B: }9 \/ }) }& d    TEA(const byte *key, int round = 32, bool isNetByte = false);
( X  a% g. v" c+ E) @1 z( W: D5 K    TEA(const TEA &rhs);
% @! ]$ H8 A  o; \    TEA& operator=(const TEA &rhs); ; V+ G( A3 I8 N/ C! K: p* o. u
    void encrypt(const byte *in, byte *out);
5 C7 I2 I' M0 h" k* {    void decrypt(const byte *in, byte *out);
, g2 d; @7 \1 aprivate:
7 S/ f- N3 H1 m: }& k* a    void encrypt(const ulong *in, ulong *out); ' M1 x; e# R" ^: Y- Z
    void decrypt(const ulong *in, ulong *out); / s6 ^1 q3 Y2 f3 _, o5 i
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
, D4 m3 J# j- b* n2 e# a; |    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ; j7 l: A! f3 r% s
private: ' B- \3 A3 o: ~2 x# J0 g6 b5 r- T, ?
    int _round; //iteration round to encrypt or decrypt
4 k' c' k: H- x' P5 g    bool _isNetByte; //whether input bytes come from network " M! b5 X! q/ ~& g. E* \
    byte _key[16]; //encrypt or decrypt key 1 o$ J1 d1 Z. [
};
: r  G0 z0 X8 Z$ V2 ~) t( ]
2 d5 ~8 [0 z. z3 F9 r: ?6 s7 u- {3 ]#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" + t% c$ G4 [8 q
2 #include <cstring> //for memcpy,memset
6 l! P7 B' t, T  e. Z) S! Q5 D+ {- O 3  2 z9 n1 c  ]! L5 I
4 using namespace std; 4 H6 X- J% N3 g7 |- {4 ]9 v
5  & Z7 F* P! M  \; ^( F- F3 u
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
' h# W/ g# a7 H 7 :_round(round)
3 r: V2 ?# w1 ~2 Y* E 8 ,_isNetByte(isNetByte) {
9 {/ P( i) \/ u0 T' U 9     if (key != 0)
4 J! a; O& x' C, {10         memcpy(_key, key, 16); ; R: W! H' Y* D' P* s$ j* T
11     else
8 H! W; c8 X+ [# C: W' Y$ V& S( p& @12         memset(_key, 0, 16); 6 }$ s9 n/ M$ S( b
13 } 2 o3 _5 E9 l. @& Z
14  7 ]& b" W  D  ?8 @8 C' Y
15 TEA::TEA(const TEA &rhs) . I: H6 t6 v4 a/ d0 G1 Q# Z
16 :_round(rhs._round) # ^0 V% R9 r7 R8 N5 I* z" ~9 G7 S
17 ,_isNetByte(rhs._isNetByte) { % k0 z+ _9 f' x/ g) i
18     memcpy(_key, rhs._key, 16);
0 R/ V( ]0 |2 D19 }
6 n' O6 A  X9 w- |5 A1 k/ C20  + S& E' m8 _  H* V: m
21 TEA& TEA::operator=(const TEA &rhs) { 7 @) @9 l: Z! {5 A) X" {
22     if (&rhs != this) { : w- q7 s  D8 H$ @- \; J/ W
23         _round = rhs._round; * e+ T: {; b/ o7 M
24         _isNetByte = rhs._isNetByte; ! k9 U: V3 ~6 e- ]. ~: y3 \- w/ o3 H$ E
25         memcpy(_key, rhs._key, 16);
% O  \5 o1 w3 [5 [26     } 8 k/ r" A8 F1 K  L% m2 L# l% u& i
27     return *this;
  ~8 l% C7 ]% ^1 W3 V" n28 } . H& K0 u+ t+ c" p" Y6 Z
29  
" ]3 h- K& I1 j. \# T$ o5 Z30 void TEA::encrypt(const byte *in, byte *out) { 2 u* M4 F3 T8 m% d: |4 ?  G2 L- D) P
31     encrypt((const ulong*)in, (ulong*)out); ! e1 m4 D5 e% r4 |, N4 o
32 }
7 d4 c& u9 z" D4 L33  8 K* g: ]: b+ `) M% h, G
34 void TEA::decrypt(const byte *in, byte *out) {
+ j& {. p; e" s2 v( Q, Y0 u35     decrypt((const ulong*)in, (ulong*)out); * z2 B( n9 v( w( n  `& H
36 } 8 P& P, w+ V- v/ K7 v
37  
4 C# g7 T, a4 ]" g38 void TEA::encrypt(const ulong *in, ulong *out) { # F% X- }! G! U4 N; Z& p! v: i; N
39  
' N3 D9 J8 o8 M6 I7 \40     ulong *k = (ulong*)_key;
; d9 a1 e* i1 Y41     register ulong y = ntoh(in[0]);
+ c# D) p0 a3 m42     register ulong z = ntoh(in[1]); ' B: D+ {  l" R% k
43     register ulong a = ntoh(k[0]); 8 J9 N( G0 F7 k9 v6 V  s
44     register ulong b = ntoh(k[1]);
8 k3 l7 ~- E( S& }45     register ulong c = ntoh(k[2]); # c8 |; J9 k, f1 ^/ J, M9 F1 K" W
46     register ulong d = ntoh(k[3]); * q% z7 U) Q/ m" P, i; ?& F
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
8 a# P0 j2 P$ v. l4 G6 v- O0 ]3 A48     register int round = _round;
: _0 M4 S0 M8 a49     register ulong sum = 0; 6 ~- P' t# s! Z1 x
50  % `3 H; V8 d( x5 a* x' X' E
51     while (round--) {    /* basic cycle start */
3 j  s5 ~' G: L; x  K* Z52         sum += delta;
) k" x* L- N- P1 {* g; O" j( i53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); : r! k/ J) J! n  S" {. X5 z
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
' H+ R7 M3 h' y, M8 Y55     }    /* end cycle */ 3 y$ C% ^5 W$ l& Q6 @5 p) Y
56     out[0] = ntoh(y);
2 |, H- Q# X$ \- p% q4 c57     out[1] = ntoh(z); ; M& G8 e9 I5 L" a- J& a* R! v
58 }
! a+ l$ E+ S2 @; Y8 O, v- l. `59  + B! x0 G% C6 e7 F  P1 w
60 void TEA::decrypt(const ulong *in, ulong *out) {
) o" z, h; |2 w9 L% p! x8 J5 j/ f6 U9 L' M61  
( p4 O: s2 |- t62     ulong *k = (ulong*)_key;
' A* E, W7 c% d4 D5 T0 [# [63     register ulong y = ntoh(in[0]);
7 o+ p( A- A) [; ?. Q2 [64     register ulong z = ntoh(in[1]);
9 ^2 p  R# }0 C6 Q5 ~& I65     register ulong a = ntoh(k[0]); ' d& M+ c$ ~0 `4 @5 {# R3 u; E
66     register ulong b = ntoh(k[1]);
+ v2 C  z  V: y: \1 s% T67     register ulong c = ntoh(k[2]); % z# F4 F+ q. [& T# m; b/ z
68     register ulong d = ntoh(k[3]);
5 ]2 m5 F, w# A& j69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
; ~% p' E, A2 [8 X# m70     register int round = _round;
& a. ^' y/ ]( d8 T' I# v$ |$ i71     register ulong sum = 0;
3 s4 P1 S; m8 P" _+ E- R9 F72  ' G1 F' i3 Q: R/ W2 \0 J0 M
73     if (round == 32)
7 c9 m4 e8 L9 c74         sum = 0xC6EF3720; /* delta << 5*/
( d5 S1 v  H+ Z, x75     else if (round == 16)
) R/ g1 M7 A5 g, E6 t! l: m76         sum = 0xE3779B90; /* delta << 4*/
- b8 U; r5 U/ V6 ?; b: C/ ?' }6 r77     else 7 V$ |4 `& \" ?: K
78         sum = delta << static_cast<int>(logbase(2, round));
3 m" _& ?2 H! l( R# Z. G% U/ O- ~79  
4 @6 x5 s3 h. }) V9 _% }80     while (round--) {    /* basic cycle start */ / ~& O( S+ N/ m; h. M6 l4 E
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , z5 M' l) `: j6 f& x
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
) ?' K% y& @9 @! ~/ e0 J. W6 c9 w83         sum -= delta; / S! l" z$ K5 k  V" n$ y' I
84     }    /* end cycle */
- h4 E) c! ?: K85     out[0] = ntoh(y);
# `5 V/ k# i  h0 o+ P& Q8 l86     out[1] = ntoh(z);
: I6 o. {7 ?( [" C87 }
+ g1 ~! {5 a* h6 C# j% f8 H
) e3 B0 M7 C; c* ^3 P3 W- d$ |需要说明的是TEA的构造函数:
! l# l1 H/ G5 T  u) W( ZTEA(const byte *key, int round = 32, bool isNetByte = false);
3 X3 @+ D+ J' j, s! c1.key - 加密或解密用的128-bit(16byte)密钥。
. T. Q. ?4 S% n2.round - 加密或解密的轮数,常用的有64,32,16。
# o6 p+ `1 Z# b# ^! \  O5 Y; \3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ! z% Z+ F; Y6 U) u/ X

7 k4 F' Q. s4 t% i/ j) a最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" $ f; R: q" N% e' ^" P
2 #include "util.h" 4 n, J- j1 c  B# N  J
3 #include <iostream> , I2 ?- A2 _$ W7 k
4  7 {- m9 {9 g0 y4 D4 i7 {) X
5 using namespace std;
' y# y0 L( y$ J 6  # k; ?' f+ U2 Z" ^3 f4 O4 D7 b
7 int main() { 6 L8 G9 x. h( a! l
8  
1 S9 R4 G4 |: m6 r 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 0 F# f9 R' L, t4 d( D  F  w
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 1 V9 \1 }$ E, m$ C
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
8 V& B& M" h9 ~! Z12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
  _; m  P; r  T& Z* ]  U: m- @* C4 X13  0 u1 }, V) r% }# j! c
14     size_t size_in = hexStringToBytes(plainStr, plain);
9 K* y) r3 M! s+ Y% o2 o. A15     size_t size_key = hexStringToBytes(keyStr, key);
$ |0 P; R9 c7 E& y16  7 Q  c  r& \; E0 L8 H2 w
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
, C+ o: A% k* a$ O! `8 T18         return -1; 7 l0 i( e  H: V) @$ q, H
19  
$ a( s! W0 l' @20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; , p" j, g. I9 w4 V7 c  d
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
& @  e* V8 k  |& v$ f22  
1 A/ a1 f, F. ~23     TEA tea(key, 16, true);
: o( Q- ^& D' y24     tea.encrypt(plain, crypt); , h9 {9 P8 [7 p, l
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ! o6 v4 u7 q# l& A0 h" Y4 s; b
26  " u! I" T/ ?% z1 e4 _* E3 s8 p
27     tea.decrypt(crypt, plain);
$ l! Y9 o& }3 o( }8 [1 ~2 g28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; : |' i7 o7 `$ }5 X0 O6 C  Y
29     return 0;
8 l, k! j/ a0 ~4 {* M4 i1 s30 }
' A5 g2 }; u0 L$ C$ G9 Q2 E" |* e: n) G, P
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
6 P* r. l4 i( H7 J# O( A* t7 }运行结果:
% h4 ^3 h- O% b, Q+ M/ d: i* W7 `Plain: AD DE E2 DB B3 E2 DB B3
6 [9 G  o0 z4 s0 |1 I2 X: z5 uKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 6 z" k, @6 n" l  K
Crypt: 3B 3B 4D 8C 24 3A FD F2 / `5 s/ U& g1 D2 D( Q
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 00:24 , Processed in 0.022113 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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