找回密码
 注册
搜索
查看: 37295|回复: 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轮):
2 m3 C- Y! C/ F7 X微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 6 r0 Y, Y2 u! g6 u; h+ w# a  U
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 6 J5 P' @; E' z7 @! a( q6 k8 U
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
0 A+ r4 R" W; v) a: }$ X; Q0 o在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
: {2 K$ U# ~  K% }4 d, g在 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. + f: p- ^3 h; H5 {  F
  2. void encrypt(unsigned long *v, unsigned long *k) { * D6 t& @3 p6 f. i9 k: V2 M; T
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ( k" W* t2 l% h* h( ^$ J
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 1 A, B, i" l$ @# t& [8 P+ R
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    7 ^1 @( c8 U6 _  b  C! @8 A
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) I$ F" e- D3 c4 K
  7.          sum += delta; 5 Q' G7 K$ i6 U: q
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    5 k  H9 k# e. b3 D. O3 J1 g% h
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ! E2 i% m+ A1 @: R
  10.      } : D- S4 j2 J; h6 b
  11.      v[0]=y; 0 N+ U; X+ b6 u$ P+ ^% }) F
  12.      v[1]=z; 8 f4 J# Q9 }7 M/ l9 }* ]& A; A9 p! K8 j
  13. } 3 h" [9 _) H) p
  14.   , r. ^- ?6 }# t" k5 M( j: X2 B' }
  15. void decrypt(unsigned long *v, unsigned long *k) {
    + r" R! Q6 L' p* Y; ?: {
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 3 l2 w1 t+ U& K
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 6 c$ v4 u' S" q, x1 Y* Q3 o8 d' D
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 4 c: S6 X/ R* @, ?& ~7 [
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    : A+ M( _7 e$ M6 _/ L7 r& Y
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    - v5 N( J' ^- ~  S% M+ [
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ; M0 F7 L& o. M( y3 U6 P
  22.          sum -= delta;                                /* end cycle */ 0 [( b2 ~2 M9 h
  23.      } - m1 P: U2 Y( N& Y0 e" p' a# `
  24.      v[0]=y; ' y9 v- h$ H2 r
  25.      v[1]=z;
    ' K2 w" q) k  n& \
  26. }; T; p+ ^5 g9 N! u7 C- O
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
/ V6 }3 o2 F" H5 Z4 y: y2 X#define UTIL_H 2 O3 W0 w* C$ j; H
% P3 R3 o0 }' \
#include <string> ( u5 J3 d: {6 b- U2 c! Y( m* a
#include <cmath>
' _' Q) R. m% R+ k  `% b$ k0 D#include <cstdlib>
1 X0 I4 E0 p/ Z: v( n
$ Y. I1 j2 a3 P9 R6 Utypedef unsigned char byte; $ M/ O. R& R* `+ s- f5 O1 o3 j: T
typedef unsigned long ulong; $ S2 b- K' O$ D# Z3 N

2 [+ G+ _, m% |* @% ?0 V, v# linline double logbase(double base, double x) {
/ C& R- B+ e1 j# O# i' v2 }$ a$ R    return log(x)/log(base);
3 N& \4 H$ m' s6 @: h! G) Y& O}
1 l+ [4 C7 p: h8 s* d9 y: N9 Y4 y 5 `  R' D& d) T6 r% t
/*
4 t+ x- _# d& u$ {6 S3 x! `1 c/ `*convert int to hex char.
. g4 A% R! B5 K, S6 n1 {6 w*example:10 -> 'A',15 -> 'F'
, o& s' C! W* b1 i# v: n; E! M% p*/ 3 n' K  ^6 i8 P6 G
char intToHexChar(int x); . Z3 b( U0 V% q$ s) b/ e- H
9 R/ k0 {3 C* C$ n6 ]. x) ^
/*
. i# ?; ]5 r1 W*convert hex char to int. 1 s) {9 v, A, c9 L5 U% ~4 ~( K) x
*example:'A' -> 10,'F' -> 15
9 K& `5 U! j+ X; A3 r" w*/ ) g/ f0 M! S% Y* ~' ~0 ^
int hexCharToInt(char hex); . W  @" m% O4 q  H( d2 ~6 s

" `6 l% `" }% }% ?. [% p( \using std::string;
+ e7 i3 e6 q4 i; e7 p/*
& S% G; a/ y0 b$ T; |5 ?- w*convert a byte array to hex string.
; P5 I+ @' h6 _9 i*hex string format example:"AF B0 80 7D"
6 E8 R" ~7 G1 Y* g*/
! }0 s) b& {- x% ^9 ~* [- v& Lstring bytesToHexString(const byte *in, size_t size); ' W! D  S" A6 u

7 k' G, X2 d6 ?/* ( I. q  G- g  t+ h1 |7 [
*convert a hex string to a byte array.
) T4 r  \4 U6 n7 Z! v. H1 \- J*hex string format example:"AF B0 80 7D" 3 q. l/ ?: u2 C
*/
6 E6 J6 {( A& {, X* y6 ~& x+ R( Z# u- }size_t hexStringToBytes(const string &str, byte *out);
; ^, C/ O7 L+ m8 W8 n0 | ; `/ Z/ F5 I8 Z
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
2 r9 w3 I# d$ F; q5 H#include <vector> ; d* n% x- p5 J$ k- R
; `% k2 H: m% }6 R3 b. m4 x5 ^( x
using namespace std; $ b7 T1 A( y8 p0 Y1 F  X

! }# ?# i' f& {, Gchar intToHexChar(int x) {
8 z, L$ i2 e8 X5 _    static const char HEX[16] = { & k( r- H* m, D, Q
        '0', '1', '2', '3', ' T) Z; y, @  \: k7 V
        '4', '5', '6', '7', . Y) K/ J( N) a2 n$ p
        '8', '9', 'A', 'B',
, _+ C7 k6 _4 y3 ~8 G6 N& M0 d        'C', 'D', 'E', 'F' 5 z5 ?( T- L  f& c: w1 H7 N
    }; 4 [% V8 Q) O: t0 w3 {, S
    return HEX[x]; . n* q! K3 }4 D
} ) V& s" E; t# F" @" \, v
6 T" m: P9 Q1 H9 E" f, P
int hexCharToInt(char hex) {
( W! D! m, F2 [! g8 I8 `! n6 t, Z    hex = toupper(hex);
2 x! P  Q" O; s/ ^; q; c& Z    if (isdigit(hex)) 5 F  Z8 y1 i' B7 b+ b
        return (hex - '0');
6 |5 X( k6 Z- Z: K, V4 B; u6 g* Z8 r    if (isalpha(hex)) ( a, X2 B, q' t  D
        return (hex - 'A' + 10);
* m" a9 Y5 A1 j1 w1 R: C    return 0; # D* L! b2 U+ s
}
  z: h% x: W4 v, s1 p$ a# S 1 d" c$ q/ a' `3 O5 p1 l) |$ D8 C
string bytesToHexString(const byte *in, size_t size) {
8 n3 Q. [1 L" z5 Q  e4 Z8 _+ N    string str;
8 i& I# l8 t' A# p2 W    for (size_t i = 0; i < size; ++i) {
+ u/ @) v! K9 y& A# @        int t = in[i];
+ h0 f: ~  k7 o        int a = t / 16; - K, S& W  [: y; N% e
        int b = t % 16;
( ?5 p( v% P- j8 i+ K& B        str.append(1, intToHexChar(a)); 2 B" e5 E8 V2 f- r3 A4 p+ `4 A. ~
        str.append(1, intToHexChar(b)); ) L) |( @5 i  o
        if (i != size - 1) ! A& B, [" x( u3 X/ l3 s# A
            str.append(1, ' '); ' M4 T# C9 G& d) J1 [& J& J
    }
. T8 i2 m% W: n' }9 n. |  b    return str;   D% X4 l5 r6 K. P
} 4 Y* v$ l/ Z" B; @0 T# d* i, }, C

$ M: G  s4 z1 c' t5 esize_t hexStringToBytes(const string &str, byte *out) { " y& A! h5 F8 q& h: z, [2 c
0 t3 u4 U3 a9 z! K
    vector<string> vec; 9 @6 s9 d" A' P$ i+ l$ V" L4 T; b
    string::size_type currPos = 0, prevPos = 0;
! z& w, g, D. x5 m    while ((currPos = str.find(' ', prevPos)) != string::npos) { ) L% B0 a$ \. y- c) z4 d+ `. `- B
        string b(str.substr(prevPos, currPos - prevPos)); 4 o. ~" H" \# C8 d+ U
        vec.push_back(b);
; _7 x$ ^6 r6 Q5 |( A; \: }% Z  x        prevPos = currPos + 1; . G4 ^  m* ~7 {. h
    }
. H0 s) Q6 x$ y. l4 B7 B/ n" d    if (prevPos < str.size()) {
# [5 L4 A& n  e0 U  j) m        string b(str.substr(prevPos));
/ g: F" c4 v- K$ S0 X' `        vec.push_back(b); , E: L, |2 C# T. V
    } 3 Q3 Y7 `9 C4 Y" `6 T9 F4 H. P
    typedef vector<string>::size_type sz_type; / y4 u1 t! ^8 c# m( ^4 ~$ T7 S0 p7 }
    sz_type size = vec.size(); 8 A4 Q4 h: P! ~* {
    for (sz_type i = 0; i < size; ++i) {
/ l2 z: n. o' g. ?9 \6 s        int a = hexCharToInt(vec[i][0]); % V& f1 g6 P; P' G3 O
        int b = hexCharToInt(vec[i][1]);
$ F, ?) V, O) P: i        out[i] = a * 16 + b; ! p6 a) C5 ]; z8 z) x
    } 7 L9 v! _6 \1 G# [+ B  n% D
    return size; 8 }& w4 `9 F. M1 I; I1 x
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H + _7 o6 o: U3 n$ z; a9 w
#define TEA_H 5 o2 ^7 }* H* k. {  ]" T! A# i3 c

' |7 U( x- J0 Q$ K6 M- O) E: c/* 2 U1 X% J& _, K% K! }4 z0 H5 s
*for htonl,htonl 7 h$ k9 j" [7 y
*do remember link "ws2_32.lib" , S8 \' x4 s9 S2 |: }# M0 {! r& Y: G
*/ 2 J1 p9 S' {, k1 H  k& j
#include <winsock2.h> + K( A* E8 E$ d/ \2 C
#include "util.h" 5 B3 g' f" p3 w( i- `# g  v  f* J. f

' J6 Y4 \* r: X8 Fclass TEA { & B$ O5 |; {8 V& z' m1 T' o
public:
7 ~, l3 X$ ]! E5 r8 G  W+ S, N    TEA(const byte *key, int round = 32, bool isNetByte = false);
' g3 k1 V2 ]4 w+ Z+ ^' _6 }4 M  s; N- l    TEA(const TEA &rhs);
! @7 T* T* d+ p/ |    TEA& operator=(const TEA &rhs); 1 q! o. E0 X+ D* y+ n
    void encrypt(const byte *in, byte *out);
6 B, n& S) c* ]0 G7 I+ x# @% X* [+ S    void decrypt(const byte *in, byte *out); 2 p  r" X( i; S9 Z- D4 j* I* n) C
private:
( l% I" _/ k9 Y# ~  H. i' @    void encrypt(const ulong *in, ulong *out);
. \# B+ w$ ?5 i% G    void decrypt(const ulong *in, ulong *out); + X8 I* i6 v: Z" T
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } - r+ Q, R4 M2 N: r; K$ B
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } - l" A9 f6 c* {: Q0 R" L  K- O) W
private:
% p, Q" g3 q# [. e2 H: J8 C3 a2 y5 V    int _round; //iteration round to encrypt or decrypt
7 Q$ I0 c2 r! Q2 ?, s1 J    bool _isNetByte; //whether input bytes come from network $ o$ R: H5 R9 B4 F8 I  P" C
    byte _key[16]; //encrypt or decrypt key
& o+ t% X- `. z& ^& ~};
, U- ]* F4 V* X# W1 t( e ' ?* f9 E. v# j" e2 V/ S% f( y
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
4 D! c; u& [5 b# V& j" C  i 2 #include <cstring> //for memcpy,memset
" n5 ?5 C7 \) h' Y9 r2 K1 _ 3  - ?! v7 a* v0 d
4 using namespace std;
# h; b5 h) a( G/ K. J" T 5  " A. j$ q% I. x7 A% n
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) " S6 ]7 k3 g" U* f: Z5 ?  }% S
7 :_round(round) ! I+ Z7 Z! N0 ?/ E8 N: [' o
8 ,_isNetByte(isNetByte) {
6 J7 ]; {  j& \3 s 9     if (key != 0) 2 _* R0 y$ F1 s5 m
10         memcpy(_key, key, 16);
3 F8 |) }) |8 }2 P11     else
- g% l: q* d3 v7 e/ k12         memset(_key, 0, 16); 7 k1 X$ R/ m7 P5 S
13 }
: S4 F; y2 [: X" b2 R% k14  
% e; P: c  R, J, ^" q: E15 TEA::TEA(const TEA &rhs)
" p+ f  n0 @1 w3 U, y9 [0 Z16 :_round(rhs._round) , ^( t! ?2 m8 I0 M& E- b7 g' c& n
17 ,_isNetByte(rhs._isNetByte) {   d* S& ~$ J% Z, J' i  N+ Z& l
18     memcpy(_key, rhs._key, 16); : G7 s0 l" D( p2 p
19 }
2 p2 Y* F) e# n% g0 Z' x  q20  
; l0 u: c0 v' V% P9 K21 TEA& TEA::operator=(const TEA &rhs) { . r# K5 r7 ]* B: P$ D, J7 g
22     if (&rhs != this) { & ^  ~9 q% _% l7 _& p9 I" Q9 C  f
23         _round = rhs._round; + V4 \1 R+ a( m
24         _isNetByte = rhs._isNetByte;
0 _4 r% K, [+ h* {/ S25         memcpy(_key, rhs._key, 16);
: z' b' M) R" H3 e9 e/ m8 L! R26     } % P8 e  t! {0 U3 B& s1 x5 S
27     return *this; $ m2 s0 ^. S& S% O- |0 z7 F1 Y
28 }
  L9 w! x- M( D29  - r5 W, }! e- E$ f; \) p3 K
30 void TEA::encrypt(const byte *in, byte *out) { % q" }: X3 r( A  y+ k  J
31     encrypt((const ulong*)in, (ulong*)out);
; X2 g8 R0 t; |" ]32 }
" N& y3 l- y. h% W9 K$ U3 U% p33  
6 W4 D$ y# c7 r' q34 void TEA::decrypt(const byte *in, byte *out) { ) s8 Q- s6 C! k5 Q" U4 ]3 K
35     decrypt((const ulong*)in, (ulong*)out); + ~3 }6 \1 T( J% x
36 } 0 s& R: Z' {9 h# D( F" a* d9 Q
37  
( j# }' a6 B3 }38 void TEA::encrypt(const ulong *in, ulong *out) { 1 q# }+ E3 |( t! O+ u. A9 g. |
39  
0 G) H& u; P( w& Y  z9 r# V40     ulong *k = (ulong*)_key; & y( \- t) _; w# O. T! ]7 n
41     register ulong y = ntoh(in[0]);
) c) k' b; g* w! q# K! w: d42     register ulong z = ntoh(in[1]); 6 n$ @$ |0 f: n7 D
43     register ulong a = ntoh(k[0]); 2 m6 `/ _& v; C: ]# C( c
44     register ulong b = ntoh(k[1]); . i/ X, s) M% l, v( \8 `; X
45     register ulong c = ntoh(k[2]); " I( N/ t) j7 ?+ \- k1 y6 o
46     register ulong d = ntoh(k[3]);
# @) a# q+ ]  \* w9 B3 q47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 0 O% Y9 z( K  `0 L6 W- C3 s3 {
48     register int round = _round; . o- G6 N% m) d( p& D, k) Z' W
49     register ulong sum = 0;
. t- S* j# N5 k& f50  
- `  x, @- e& g% `' ?51     while (round--) {    /* basic cycle start */ ' h" y4 Y* Y  N* ^2 s
52         sum += delta;
" [1 q5 Q3 B2 U- Q1 ]7 {53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); + Q( F9 r5 d5 e' S) E" c
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , C! A  W4 L4 I) f
55     }    /* end cycle */ ; ~. r$ J3 }. ^4 K) u! L4 W
56     out[0] = ntoh(y); ' \! h- N) P) W1 _
57     out[1] = ntoh(z); , Y/ H1 s/ m7 R, p6 A
58 }
0 ~2 p1 J# _8 i; K- u59  5 C! q4 A& g) B) _& d
60 void TEA::decrypt(const ulong *in, ulong *out) {
& o  \* G$ V. Y1 x& f61  9 x# V  K4 x2 a; G* N
62     ulong *k = (ulong*)_key;
* z6 B0 L* E* b) X63     register ulong y = ntoh(in[0]);
# ~( M( f9 T/ s( f0 r64     register ulong z = ntoh(in[1]);
3 I# Y: @7 |" G$ i1 a- P% i65     register ulong a = ntoh(k[0]); 9 _: w( ?! n* Q; v& E5 ?% Y
66     register ulong b = ntoh(k[1]);
; q' [7 `3 _2 H" G3 ^67     register ulong c = ntoh(k[2]);
1 r( H7 [% s+ C% }3 |4 @4 ^% @! ~68     register ulong d = ntoh(k[3]); $ N8 ~7 Z7 `9 l1 ], n
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & e3 p+ X' V6 V  v; M& ]0 D
70     register int round = _round;
- G! Q2 J+ Q2 Q/ D6 y- c4 h9 T9 K71     register ulong sum = 0; ' o- t, s' s" b, U% u" s/ J
72  9 e# v- X- G% L0 I
73     if (round == 32) : b$ C8 m& f7 k# d+ ?
74         sum = 0xC6EF3720; /* delta << 5*/
3 ^& U, R' }$ s" ^3 _75     else if (round == 16) ' q+ }! H. y) j2 w* z8 }) d) [: i! b
76         sum = 0xE3779B90; /* delta << 4*/
. N. j  r  a' }9 n77     else ' N7 O3 n% r9 v- N7 [, v* s6 g
78         sum = delta << static_cast<int>(logbase(2, round)); % v/ A9 r: J0 Q$ o4 D3 X$ l' ~
79  
1 s: T$ ?; V# s/ T3 w. x- j80     while (round--) {    /* basic cycle start */
) v/ Y# _6 x% \% r: Z81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
, f% _: R: d( q/ Y. L- T82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 5 |2 {& a0 K+ z
83         sum -= delta;
$ Y" l  ~, z' p. I1 b# V84     }    /* end cycle */ 6 f9 W; o: J" i; A9 g, m
85     out[0] = ntoh(y); 0 e5 w2 c* n9 Q$ B
86     out[1] = ntoh(z); 9 F( c' G8 N* [  D
87 }3 w/ I- s3 h2 r* C  z' M
" |  _. h) {9 z( u$ w6 w
需要说明的是TEA的构造函数: / \! |+ k1 R& M# E% f7 t
TEA(const byte *key, int round = 32, bool isNetByte = false);
: l# S4 j7 W6 e) }/ G( R1.key - 加密或解密用的128-bit(16byte)密钥。 6 T( A: W% h, S% a
2.round - 加密或解密的轮数,常用的有64,32,16。 7 a# o( |' t. s- x! r3 @
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ( k6 E) l! c5 u1 T& V& L

2 z9 \  j0 B8 d  d: }最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
- p& U* H8 v1 f1 ^" ^# v; y 2 #include "util.h"
+ ^8 t: Z, K5 s7 A 3 #include <iostream> ; ?! h6 p4 z- s2 I8 z. i( t; Q
4  + A! y2 `& k, y; g
5 using namespace std; ' t3 g/ p$ J* g
6  
+ B( P% ]5 m# n* ?2 d 7 int main() { & m1 z& R, c) @. a. Y
8  
4 z' d! _% N! Y: C) G5 n 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 1 v, \% u) j6 |& e1 E
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ; X! D9 o/ b0 t
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ' C5 i5 U9 d; T2 e- r
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
4 c% J/ k9 M0 g1 l4 x& Q+ U- ^13  
$ i* i& E% w7 }7 c8 w1 ^1 S! a2 k14     size_t size_in = hexStringToBytes(plainStr, plain); 7 [6 J3 I4 \0 v7 H/ c0 A0 r3 Y
15     size_t size_key = hexStringToBytes(keyStr, key); ( }6 `$ h& K7 j
16  # M7 _( x4 A0 W$ J; }( Y. W8 {9 U$ P
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) # D1 r5 G- Z2 I" V" i2 I& q' ]" B
18         return -1;
0 u4 M8 m- u8 e+ Q" M3 ~! v6 }6 L; @19  
+ @9 n/ i1 u) o9 w20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; : ~& W( l& U% u; a/ y
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
. h- a7 l6 F" m, z; ]* @6 N22  
4 Q; _4 t6 b- t$ W6 k8 s: K9 Y. K! q23     TEA tea(key, 16, true);
& d) G- x% C+ b5 v6 h& v2 s* _( @24     tea.encrypt(plain, crypt);
' J7 l$ G  M6 v+ ?25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
/ Q  `& m! M+ P26  2 U( f: H2 q+ Z, L
27     tea.decrypt(crypt, plain);
7 V2 w0 q3 d- d) o28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
* N, k  W7 q8 K% k- ?& [29     return 0;
2 j' ~6 r' d' r  l30 }
" x, D  k  I* o% L) H8 W
* \; F( N( E7 h0 `7 w. y本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
6 ]9 I$ V2 T4 Q运行结果:
# ]! F3 m: F) r0 W9 yPlain: AD DE E2 DB B3 E2 DB B3 6 B% q7 _# q3 @2 q  X0 u
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 1 ^' ^" U* e3 a/ W) S: z+ p6 H
Crypt: 3B 3B 4D 8C 24 3A FD F2 3 u* G8 J' Y  D+ \- }
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-24 12:25 , Processed in 0.017642 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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