找回密码
 注册
搜索
查看: 37632|回复: 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轮):4 t5 v1 |$ H1 `1 R4 [, _: W$ ^  D% u# `
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ; \3 V% b5 L: K5 l4 R2 R
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。   s6 f7 y0 \  ?! N/ I% z+ j
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
$ ~% k1 P: Z8 d- R在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 % g6 O# }& N3 ^& R1 h4 \
在 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. 7 ?4 U4 @6 i: v, c6 v
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ( S4 h/ T" e* s+ Y- w; Y
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ & P% m* O1 o" ?& c: m2 A# n
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    , g5 L( {6 O2 k
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
      x: \4 @  @0 ~9 S* j0 F) I
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ % S4 W( n8 W4 R6 k
  7.          sum += delta;
    ( ?1 O2 X+ T: j( i
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ I* K/ }9 B9 ^  f1 C6 S
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 0 q! M1 T3 l; N* |, v0 r  }
  10.      }   K& g( W2 s- ^2 w+ w/ s
  11.      v[0]=y; % N' r# e7 s  e! d4 t
  12.      v[1]=z; # b/ U- x- i- J0 }' C) Z4 W% K
  13. }
    - \, r/ c8 |# ~2 d$ [
  14.   
    1 _* i) T9 C8 Z3 t2 r8 m1 R) E( |, G
  15. void decrypt(unsigned long *v, unsigned long *k) {
    - V& J1 N" F) z; ]3 F! g, x
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ % Q4 G. _) B' O8 b
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ / P2 T+ v4 G7 Q
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    1 U! N  G: z+ w7 }0 k% @- O% j
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    : X3 }2 a$ n' ~
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ) {* v! |7 |+ @$ z
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    , i0 d8 F( y) B7 U
  22.          sum -= delta;                                /* end cycle */ * C( J; |' [2 m4 m, L
  23.      }
    : m8 e, {$ H  o! T7 ^2 S
  24.      v[0]=y; 4 T2 M; |( G$ L* f  U5 |$ Q, M
  25.      v[1]=z; 2 x, D. Q1 }0 L  @5 t* ]! I
  26. }% F) g, J4 ^$ e2 n3 v( K
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
3 v" i. J6 j4 v+ i7 G#define UTIL_H # i' M+ h2 S9 }& c6 M2 ]$ J! R' n
: f. G( P- ~$ c/ I8 {# N
#include <string> 8 h& z1 ^5 V6 N" [# k, f
#include <cmath>
' G  s$ L$ z5 `. l#include <cstdlib>
1 V" X4 n; ~# ~4 f, _! u 5 l' z% @) l$ n2 F3 H+ e% p* q
typedef unsigned char byte; ( N% u: P- U  Y$ q$ u2 {+ }' J8 i
typedef unsigned long ulong; ( A0 ]) l0 W/ G+ b! o* q- K( I' D+ B

! @5 ?! Y# z2 ginline double logbase(double base, double x) {
; [+ {8 D$ W6 f/ d, y    return log(x)/log(base); 1 A) N- m5 u  j0 y- I
}
6 o9 r) T- ^% y. ?" q: | ' \* z+ w+ I& K3 b
/* " B+ b( ^0 p2 M7 ]# x
*convert int to hex char.
3 m7 U* }) d# {' i5 J# M/ X% d' P*example:10 -> 'A',15 -> 'F'
9 s1 w* z5 l% h: f" @3 Y*/
# v  j; ~2 s- @* E3 Ychar intToHexChar(int x); ) O' _7 u, i+ H7 U6 y! U: O5 v
3 o' h) z$ m1 a( a+ J' q6 }
/*
8 m( m4 s+ O8 B& ^*convert hex char to int. 4 g. _; h3 h) \1 B
*example:'A' -> 10,'F' -> 15
0 W. t5 \$ c; M*/ 1 X1 [: O( \  f
int hexCharToInt(char hex);
1 I( G4 n8 g! B, d* ^9 R
& f1 _, U2 M$ ]. Eusing std::string;
$ U, o  t! l2 y% M5 j# W! v/* ! m5 [. i1 F1 Y6 c0 @* T
*convert a byte array to hex string. 7 w" c' }7 r) g. j- V6 s9 p* G
*hex string format example:"AF B0 80 7D"
9 Q1 a- e/ v$ x( J$ I) z  F*/ $ a- i8 Q9 p0 f. R3 T; I) K) h9 B
string bytesToHexString(const byte *in, size_t size);
, n+ ^# u; o; t: d) | " J& [/ F# X; H, I+ w/ R7 Y1 _
/*
2 J! X9 f8 k" Z*convert a hex string to a byte array. 5 _! W6 g' P- G* @9 f& H% }  [
*hex string format example:"AF B0 80 7D"
( d. ^+ Q: e$ y: m" Y) t2 T: o! V7 M*/
3 g% m# S' _1 q/ gsize_t hexStringToBytes(const string &str, byte *out);
+ J" E% D; B6 O+ X2 h 6 o0 v& ?( U/ x
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" $ r# J' o# K0 Q$ n
#include <vector>
1 U* ~* ~1 Z8 p" r4 r 4 {* e1 Z0 b1 f+ l( [
using namespace std; 5 \$ ^( T( Z: ^6 I% u! v7 Y3 ~$ J
# m; ~+ f2 V; V, p7 }: S
char intToHexChar(int x) { 0 W/ x! B+ g3 R) e, G* h
    static const char HEX[16] = {
/ R5 s( D; p- o$ F) f. R        '0', '1', '2', '3', % D6 N$ V; ~' b% q- F1 j8 B2 H! |6 H
        '4', '5', '6', '7', , A) M1 J  E; J# g- P) m4 ], R, Z" C
        '8', '9', 'A', 'B', & X/ T% R, j1 J5 Q$ [9 I; X
        'C', 'D', 'E', 'F'
0 V; e+ D" q# ?4 g7 N    };
# N, O- B8 t; P- Q* g; D    return HEX[x];
8 t5 {& B0 c) |7 {  |% O! o} $ Z) l& u* s7 q

9 k5 ?! k: R9 E! a2 p7 Cint hexCharToInt(char hex) {   Q" o/ P+ |$ e
    hex = toupper(hex); : }0 O5 J7 f& {; u( H7 }+ P* }
    if (isdigit(hex)) + _2 L# P1 Y! q* @, f8 E+ J6 Z
        return (hex - '0'); 0 ~! i& ^) T' |7 v" ^
    if (isalpha(hex)) ' [( ~2 n7 U2 x; T' L
        return (hex - 'A' + 10);
. v/ K* h/ O" {+ Q; e# ]# W    return 0; ' p, Q# D/ W, H. c
} & N8 f' b9 F9 P, B. w

+ {8 p& @  ~' H; R, o6 Z% estring bytesToHexString(const byte *in, size_t size) {
# p; r4 W, ~# f4 |* w7 S6 R& `    string str; 2 y/ j: R9 p! \# V+ R. L) E, m
    for (size_t i = 0; i < size; ++i) {
/ k' i; E) P. l. J2 I2 F        int t = in[i];
% ]' f* D# `6 G$ e+ ^. t  j        int a = t / 16;
2 x6 Z; ^7 o& M- s! Q        int b = t % 16;
& t1 n% X: w8 |: J. \! ^. z! y/ c        str.append(1, intToHexChar(a));
, e6 a! S* a" N- U# x2 b& E        str.append(1, intToHexChar(b));
! q( ?. ~$ d7 ~) Z        if (i != size - 1)
6 n  a$ h7 L  L            str.append(1, ' '); # S0 _; r' F+ `$ c7 u5 F
    } 4 R8 y, P5 W% o# O
    return str; $ Q2 p- P7 _  E
} 8 u8 e/ [$ i$ N. s& J& a! h& G+ ~* i$ q3 m
& K/ u6 h9 a+ H" Q
size_t hexStringToBytes(const string &str, byte *out) { " K7 _% P6 c  T. ^( V9 g$ U
. y4 Z& q& ]7 A
    vector<string> vec;
" l7 y" \7 ?) q" H5 K9 N# V    string::size_type currPos = 0, prevPos = 0; : i, Z7 Z+ m5 z- Y- P- O
    while ((currPos = str.find(' ', prevPos)) != string::npos) { . M/ Q4 F3 b" U- A# \
        string b(str.substr(prevPos, currPos - prevPos)); . h) N1 a$ j1 X# X) N/ I' u* V3 s' Q
        vec.push_back(b); , D0 b1 L# Z  r% ]# V
        prevPos = currPos + 1;
" c" F) ~: }/ }+ z4 Y' P/ Q1 Y7 ~    }
) {) I/ U5 Q' A    if (prevPos < str.size()) { & x" l" p, A+ B5 i1 D
        string b(str.substr(prevPos));
  M* D, D( V" e        vec.push_back(b);
7 y* k& z+ z% g& r+ Z* g$ t+ U, ~    } " A4 ~, d. c( }! d$ Y  x
    typedef vector<string>::size_type sz_type;
6 T2 K" I% m, g6 N    sz_type size = vec.size();
8 ]7 g8 R5 J! f% G8 e, b) |+ Q& H    for (sz_type i = 0; i < size; ++i) { & c7 t7 h1 F4 U4 `' x8 T
        int a = hexCharToInt(vec[i][0]); 9 \1 x: \  B9 A" X# \+ @
        int b = hexCharToInt(vec[i][1]);
1 w- G+ Q2 \3 A9 C        out[i] = a * 16 + b;
0 f4 ?5 ~3 x: N$ h    } 3 E( q1 v( M7 p  Y! ?; Y: r
    return size;
  n! G1 R& ~9 F+ H* {1 I: {}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
& k! ]2 t1 ]$ `% V0 W( a#define TEA_H ' s/ }6 D& m' q
/ c: ~1 M* w. l9 o
/* 2 |5 v# n$ n9 E: ~
*for htonl,htonl
* |* F/ o- a; ^% J# ~- b) p*do remember link "ws2_32.lib"
* Y, s: |: s1 }! o" q) i$ V  X# n*/
& x* W8 X% g/ _8 P8 ]  M* @#include <winsock2.h> 0 ?  G* j3 B. U- [, x; X$ ]
#include "util.h"
, s% Z* U* D7 z) ~3 T( V9 Y5 u + o7 z, ]% c+ k3 [
class TEA {
# v4 W) j) ~  P6 Apublic:
& B4 e7 P% U! ^4 n. s, P+ l    TEA(const byte *key, int round = 32, bool isNetByte = false);
8 _0 w0 \4 |/ u. I. l    TEA(const TEA &rhs);
! O5 s( N5 `2 t1 E' E8 Q  ]    TEA& operator=(const TEA &rhs); ) Y/ g# q$ E+ O' |( U/ O, z4 M
    void encrypt(const byte *in, byte *out); ) @% o; L3 g+ `; z" ]$ _% |
    void decrypt(const byte *in, byte *out);
9 \( [0 Q: g1 O: B/ nprivate: 1 v. A+ C9 |& ]2 k5 ^" M
    void encrypt(const ulong *in, ulong *out);
6 m2 T' C; k" I    void decrypt(const ulong *in, ulong *out); 8 u* ~. P; u1 \/ |" z4 x) W2 I
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
' B4 W! ~6 ?# Z# O) u  F    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } " h  k' O! e4 N. L
private:
! k0 o$ P: W9 h+ ?. l6 Q7 {    int _round; //iteration round to encrypt or decrypt
! F  m$ ]& z5 z    bool _isNetByte; //whether input bytes come from network % f+ M5 B- Z& x% B1 i6 Q
    byte _key[16]; //encrypt or decrypt key
% p' n2 Z6 J& Z0 |- g8 w  Q- _2 A};
( X( v  l- X5 Q  u# x4 M
! `, g. T, o8 x- ^( G#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
  p8 ~* V) x3 x 2 #include <cstring> //for memcpy,memset
$ K( V2 w' w' `! B- ]5 \- ` 3  
& M6 ?& F! W3 v2 w. W5 H 4 using namespace std;
( d4 M2 d8 J% G6 J; C& ]0 W 5  
6 {1 P7 G; m+ H& ^3 G0 }0 [ 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ! ~% ]- c4 L8 Y2 q$ L
7 :_round(round)
/ W0 Z- Y, u% h! [6 Q3 W 8 ,_isNetByte(isNetByte) {
; a) }' y4 e5 v) Z8 ~& U 9     if (key != 0) # x! n# t3 F' a) V  ?' C2 c( R& L
10         memcpy(_key, key, 16);
6 L% e, i" F/ E0 h6 @! K11     else
0 v4 y: [$ E. V) S5 H12         memset(_key, 0, 16); - X; O7 D! ?# c2 V
13 }   `) ^. {+ _1 Q4 b* K  g3 C1 {7 b
14  3 S1 b9 Z% Y! c% w/ P( Q
15 TEA::TEA(const TEA &rhs)
: H* W7 K- z. d" X16 :_round(rhs._round)
! `; G: k8 B8 F2 N17 ,_isNetByte(rhs._isNetByte) { # G* J1 i/ k7 Y) l7 N- j. O
18     memcpy(_key, rhs._key, 16); 4 f; D% {2 A9 E% t7 Q
19 }
- f3 f. m$ n( ~20  ! q! J1 [. ~% @
21 TEA& TEA::operator=(const TEA &rhs) {
" A9 I8 \2 }% Y) J, i7 `22     if (&rhs != this) {
: ~( p5 H" q  Q) ]23         _round = rhs._round;
: T! d" R  a+ X" C24         _isNetByte = rhs._isNetByte; 2 G/ o" {6 {" P! A
25         memcpy(_key, rhs._key, 16); 6 M3 E# `1 f3 G& n3 ]
26     }
' V7 c- I( G1 b! s6 U6 g0 }  q27     return *this; % J/ K6 o3 A4 Y8 }
28 }
2 x3 d, e/ G: F" Q* W- l( X* F29  
0 N& ?+ F( J  \1 B+ E+ o, a& Y  I30 void TEA::encrypt(const byte *in, byte *out) {
4 I0 ]2 |- _- S: p( H2 l' C7 _31     encrypt((const ulong*)in, (ulong*)out);
/ q, H! h% R4 c' L. |( _32 } : i1 O3 n' Y7 j- S# B+ S
33  
9 f9 B3 H; g1 r8 b' K- D* U34 void TEA::decrypt(const byte *in, byte *out) {
' A: C9 {2 Z0 i0 P  Q' A; p- |' ~35     decrypt((const ulong*)in, (ulong*)out);
0 c* i5 y) D% C2 ^- P36 }
+ ^3 I0 `* ]: b# [37  5 q! O0 Q- i: [) `: z" X2 m4 s
38 void TEA::encrypt(const ulong *in, ulong *out) {
. J" j  a4 |' {$ h0 H" r39  
1 J9 E0 I3 I4 h8 m2 X40     ulong *k = (ulong*)_key; ; f+ q7 J4 v$ U  s) i) V2 v7 n
41     register ulong y = ntoh(in[0]);
( ^; m& ]7 @: ?6 \42     register ulong z = ntoh(in[1]); $ O+ p7 }& `$ D2 d5 N
43     register ulong a = ntoh(k[0]); + s& }& k* ?* x6 G
44     register ulong b = ntoh(k[1]);
" b% E+ R$ ~1 d( y5 b  R2 d9 C45     register ulong c = ntoh(k[2]);
$ j/ C7 f, j$ Q6 z* _46     register ulong d = ntoh(k[3]);
7 m! I/ z6 O- Z1 J) F7 G47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ; n! `; C7 k% B' k; p
48     register int round = _round; : L" Z4 i) Z" S5 G: V8 Y* ^
49     register ulong sum = 0;
2 d$ i0 h/ J# Q50  " y9 k; h+ M, z: r- i! z1 \# d
51     while (round--) {    /* basic cycle start */ * D0 U6 {; n) |$ x& `
52         sum += delta; . s5 K6 w3 L. f" W
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
. P& h+ H$ _0 U0 `& ]/ d8 O54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ' u3 P( P3 g2 A( c  ~
55     }    /* end cycle */   m0 |# _9 }9 b3 {0 E
56     out[0] = ntoh(y);
  y9 p8 H4 y0 ]2 L7 i9 c8 U* J9 x57     out[1] = ntoh(z); : F# g/ o. o+ {/ }! ~
58 } ' n" R/ \9 t+ O5 y$ V
59  - h7 n" Z! v; C* f" U1 H* M
60 void TEA::decrypt(const ulong *in, ulong *out) { 5 m: ^4 k: `9 l  t7 ?/ e! M  V: T
61  
5 [. z) c: E3 F2 G8 Z62     ulong *k = (ulong*)_key;
7 H8 [  e, u/ S+ o63     register ulong y = ntoh(in[0]); 0 M% W5 ~4 c$ C6 G) M6 i
64     register ulong z = ntoh(in[1]); ; Z  J0 L7 N" E, q! U% d% M: _0 \
65     register ulong a = ntoh(k[0]);
# I2 v" k2 T( @! g66     register ulong b = ntoh(k[1]);
" [. Y4 \% B8 _. |3 Y  R2 }4 n+ G! J) t67     register ulong c = ntoh(k[2]);
% U! b5 V$ O( I. y8 G68     register ulong d = ntoh(k[3]);
5 d! s; e7 I7 R7 I3 Z6 j69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 0 R5 {) h4 H; x9 a- o5 A' C! t: p
70     register int round = _round;
, ]5 a4 y1 z( G; w6 x# Q9 G71     register ulong sum = 0; 5 G" c/ Y; f% k+ u% n! O$ n
72  
0 q, u4 Q' X7 N: ]! U0 ]9 ?% r$ d73     if (round == 32) 1 K( M! w+ ?$ @$ C  ]1 G& |
74         sum = 0xC6EF3720; /* delta << 5*/
+ ?7 B( R) }9 j" N4 r75     else if (round == 16) ( U' M+ J  O7 r  g1 G
76         sum = 0xE3779B90; /* delta << 4*/ 7 ]9 [- I- e3 h' X! L) P6 C
77     else
  w# P! x% @/ l  a9 T8 k78         sum = delta << static_cast<int>(logbase(2, round));
" H* B5 F. F. j' e! P$ K+ S! ^79  2 B! a6 P8 n1 J) }: m
80     while (round--) {    /* basic cycle start */ 6 n; i, W  T1 b  C2 ~9 `
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , n8 x0 I/ U1 d4 H. x( [: B
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ; |# A' R3 l1 V" T; V
83         sum -= delta; # r7 T' U. C. [' R5 |2 r+ h
84     }    /* end cycle */
+ g) R4 J2 j9 c, W1 V5 u8 j* f85     out[0] = ntoh(y); . _* Z: |. e+ F: W3 t
86     out[1] = ntoh(z); 0 W9 o5 O# V! H6 f
87 }  g2 _8 M4 ]/ B0 s, `5 Q( P
$ Q% U$ G8 d* y. Z* ~9 D- V. S7 F1 @
需要说明的是TEA的构造函数:
8 H- Z6 N( b$ V( |% Y3 QTEA(const byte *key, int round = 32, bool isNetByte = false);
( R9 r& x0 _7 E7 V3 u1.key - 加密或解密用的128-bit(16byte)密钥。 . V5 d8 u' J+ s- u
2.round - 加密或解密的轮数,常用的有64,32,16。
, J, y. P; }2 }$ l  V3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
. ?4 y; z* x1 i! X2 ]7 w) t- V$ W  E- h2 e' g0 i* x2 K
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
7 I  U9 t( a9 p 2 #include "util.h"
3 d: k4 f% K! z 3 #include <iostream>
- D, u, d, y! c 4  
0 d; g, e# p7 J( r 5 using namespace std;
7 L. k( D7 P* f  A 6  
- W) J; \# _  b2 n/ B; @& a 7 int main() {
' ^6 g, h, b6 a 8  ! i3 G+ t7 T( L+ G5 t
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); : @7 s- |- `" o$ d" V0 I+ |3 I
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 4 n& G2 s6 O# [# |* w3 i- ~- _
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
' l3 m) d% G2 s1 O: C) j/ R' I12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 0 i/ M' @3 }/ J
13  
* g) {, l( A4 ]1 \% {+ u14     size_t size_in = hexStringToBytes(plainStr, plain);   ?( g9 n; N8 Q; X& v
15     size_t size_key = hexStringToBytes(keyStr, key); $ H# M9 P  ?- s$ b
16  3 u3 o' |7 Y3 C4 o7 f6 p
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
! R7 ?; f  _- O; a: e18         return -1;
! a+ w  a4 I, i19  / N5 P% N& L2 R, z4 `
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; ! g2 C) {; s7 \, O' {) f
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 3 l( Z% n  {0 L7 U, w
22  & G$ }3 u, {$ [! J
23     TEA tea(key, 16, true);
3 [4 j6 o9 R; j24     tea.encrypt(plain, crypt);
7 h' T! k0 D3 k; e/ Y25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 3 k5 g* H2 x7 A- H# X
26  . a7 H+ E, {# h- u5 }$ p
27     tea.decrypt(crypt, plain);
& t6 Z0 m6 _5 l9 m; o# Y8 |28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; # K& x1 F1 c) ]
29     return 0;
0 f1 }0 U( C: h* ~30 }  ]( a9 j3 B* @* \2 @  b: S" O) _

& g, P2 n6 ^; l6 l/ o本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
& h- d5 d# l% l3 f& ]7 w运行结果: : G8 b% h8 p: b6 S  _* F
Plain: AD DE E2 DB B3 E2 DB B3
$ h1 c3 A- q3 d7 [, F, iKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 , d2 O% r- j; E& h8 Y7 u
Crypt: 3B 3B 4D 8C 24 3A FD F2
- B( J0 [: A' ]; @4 z3 o* aPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-9 17:03 , Processed in 0.021661 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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