找回密码
 注册
搜索
查看: 37258|回复: 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轮):- g" Z& c8 [; R9 S) ?9 L2 u- d
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
1 c/ }3 H& p1 @9 e* S$ ~- {+ gTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
( f% z8 X' D: s% ]" i之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 % J. U* I2 _( c6 K, t  e: B+ K
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
4 g* O* y) X+ T# r" P# ]% A1 Z, 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. ! s) u9 W/ m" s+ q9 Q/ |
  2. void encrypt(unsigned long *v, unsigned long *k) { . n9 v, d7 R! T+ q+ {3 e1 G" v+ t
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    3 `% w* z/ l6 g# r, }
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ) O  q2 ]6 ?1 u2 K
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ : L* J4 _/ N7 f4 m  t  D; _
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    4 T- {; P6 d! w+ {& J
  7.          sum += delta; 2 j; {: \" d* T2 r9 N* z# y
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); , h6 N$ P6 J. o! o5 R4 X1 t
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ : A- ^; m* n0 o
  10.      }
    8 U, k2 b; e. A# y+ U4 M
  11.      v[0]=y; 3 y: a$ {% m8 ~4 U8 f
  12.      v[1]=z; 5 A1 B8 t7 e9 X) O2 Z
  13. } * E  N" K* S4 A; D+ ~
  14.   
    & {2 j, L7 o% N; \$ \6 k& t
  15. void decrypt(unsigned long *v, unsigned long *k) { + D: ~7 v+ E; c4 [+ [6 X9 r
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ / E" a9 T7 T8 x& p( m
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ + u# X: W9 h. n  B( p" U4 p4 ]+ W
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */   u" h4 J/ X+ H; b
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    9 A  T0 M" g6 M6 L% [0 g
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    , y% b) i( o- U8 i) N5 N, n; e/ H
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    1 C  u2 e. J+ R
  22.          sum -= delta;                                /* end cycle */ / M# w" q5 U- r7 D1 ^5 }5 B
  23.      }
    . e& q; I8 i- O7 s4 h/ F! Q
  24.      v[0]=y; $ l1 X) `  k" Y& `  S6 k% z! D3 P7 W- C* c
  25.      v[1]=z;
    + v  v; c: I. p
  26. }
    ( Y3 @- H( Q1 C8 o( i5 J
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
$ Q8 p0 M6 E' I8 ]* e#define UTIL_H
3 I; W8 Q0 s4 }1 P$ K: {" `1 e/ T2 N
#include <string>
/ L* F+ e) z: d#include <cmath> - N6 A) T6 i9 o! q
#include <cstdlib> 8 a: Q/ k, u! Z$ E

1 ^+ M/ Z( f/ [2 M3 ?typedef unsigned char byte;
7 y: y, H9 {3 e! wtypedef unsigned long ulong;
4 e# c- M; H% \$ T4 Y ' s8 C( }3 s4 T* w8 D2 {
inline double logbase(double base, double x) { 4 S/ m2 l: Z/ X! h" N% m
    return log(x)/log(base);
1 ?- G9 g5 p+ u& F} 8 g9 o0 X$ \, J" n2 r
8 U" h2 j; f/ P/ V
/*
$ ?3 N1 P; g6 }2 E( n9 m*convert int to hex char.
9 _. @5 E+ D4 L+ {*example:10 -> 'A',15 -> 'F'
" P% W6 b: ~  k8 ?*/ 7 E- K' Q" ^: y+ J7 c
char intToHexChar(int x);
; x% t3 H2 A# s! ~ ! y/ n, s; b" ?
/*
# p4 k4 C# T( r, C/ G) G*convert hex char to int.
/ ^0 r! p- {3 t; P1 Y# n+ j*example:'A' -> 10,'F' -> 15 , e4 s  Z  S: z
*/ . Z; S( C* H: s5 G! e5 o# G
int hexCharToInt(char hex); ( G1 o1 \" h& x/ Z) c
4 s% z/ t3 F0 Q6 G6 o
using std::string;
& {, {1 f6 ]0 G% _5 Y( K3 O, b/* % M4 l' d2 S$ s2 B9 d
*convert a byte array to hex string. 5 W! _/ @% `- l+ ~5 X" F# z
*hex string format example:"AF B0 80 7D"
8 V4 _, [; _- A/ z*/ 9 k: y( ]7 ?5 v6 Z& B& X
string bytesToHexString(const byte *in, size_t size);
; w; U, e* K  x, t 5 D( U8 C3 A2 E) L
/*
, `) J8 G( t; s$ H2 a, e/ J2 z*convert a hex string to a byte array.
5 W( d. K4 G9 m*hex string format example:"AF B0 80 7D"
0 d! d5 }! K. y3 k+ R; s6 X6 y*/   h. c+ Y4 i# [) C+ @, \( N
size_t hexStringToBytes(const string &str, byte *out); : I& u# F& v* z, J
* y4 u* T/ ]. k. s7 q/ H
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
" O5 e: Z* `- K7 j#include <vector>
3 `& r( @) B" z4 q) `
% i6 v9 r( v/ k- lusing namespace std; # @, I  n3 c! i5 _( k& ?# S! U: \

, Z. t. x3 P; c/ E, b. Q" N- c# Dchar intToHexChar(int x) {
  {7 b. l' |& l6 i4 }& \5 l    static const char HEX[16] = {
/ K- N, S6 P) B* `7 F2 O$ A        '0', '1', '2', '3',
. N( n; @2 w. C+ \4 z$ s6 v        '4', '5', '6', '7', ; u' P7 D7 k& i2 W5 v3 B
        '8', '9', 'A', 'B',
7 }7 G& \" i/ q: r0 B" g& A        'C', 'D', 'E', 'F'
& H7 n8 r, a& ^0 t( k    }; 2 u7 g( M. t/ a$ x, f/ U
    return HEX[x];
9 J5 A0 c7 f4 b/ c- [* O: q} 8 Y4 X( }$ e6 C- }1 x
! h: I7 h4 _& H5 k$ a: o
int hexCharToInt(char hex) {
) |4 j, f4 c# Y& k8 E9 ]    hex = toupper(hex);
# s0 H0 F& i. x/ Q. w5 T1 A' j    if (isdigit(hex))
" a7 ~% Q0 ^- ^! f        return (hex - '0');
" @3 |" `8 e( ^; u% F    if (isalpha(hex))
4 N7 b1 g; s9 i6 R3 ^1 b$ u        return (hex - 'A' + 10);
- W* z! O' e$ S7 S- j    return 0;
0 F# h( {& T+ u. W. a3 \* {6 s}
+ h7 I- R0 B; n9 b% e
' x9 t. h: E) k1 I% Z) T. s7 b8 J" |string bytesToHexString(const byte *in, size_t size) {
3 p, @  S0 S2 R9 w: u/ C8 r4 f' f    string str; : ?  J* ?! O& m* d; a1 H" _+ c
    for (size_t i = 0; i < size; ++i) { 2 @$ G$ g) t: {/ J& a
        int t = in[i]; 5 f# t5 F! ?4 V2 N# t
        int a = t / 16; , ~: m; S9 f$ C4 z
        int b = t % 16;
2 b, O. Q+ w3 `% G6 w, E        str.append(1, intToHexChar(a)); 4 d6 I3 P6 p% @& }
        str.append(1, intToHexChar(b)); & M; @6 f  o+ `7 a8 j, N
        if (i != size - 1) ' V- C( m, a! R: ]& F) H
            str.append(1, ' '); 4 K, a3 n# H  i, Q- a
    } . ~8 A, b8 V- S% M: X
    return str; # u$ `/ r! K: w0 R) S& k3 u" P
} 9 x' u2 }. P6 m1 H$ Z" }( d* ?

% v  q. _' x4 O: S" M. M# g9 N" Jsize_t hexStringToBytes(const string &str, byte *out) { " A( S5 m" w( M1 E
5 A) z3 E  P7 E: O4 L8 l
    vector<string> vec; 7 x) B; l* K" E. `
    string::size_type currPos = 0, prevPos = 0;
) d5 H- s2 ^6 \3 c2 a    while ((currPos = str.find(' ', prevPos)) != string::npos) { 2 o+ N# i& M. k/ C% P
        string b(str.substr(prevPos, currPos - prevPos));
2 U6 u3 z! J- L1 d        vec.push_back(b);
7 s  y+ w- v$ M2 J1 ]        prevPos = currPos + 1; 3 \. ^+ s. z) O* b+ k! ]' i
    }
+ `0 [& x  h: a3 d    if (prevPos < str.size()) {
. `+ p7 r) C* b8 O        string b(str.substr(prevPos));
; |, M4 b, x4 C; {        vec.push_back(b);
: C: ?5 p5 D" d. A, M5 r% s" k8 v    } # K* b+ `, L- ]* s6 Z
    typedef vector<string>::size_type sz_type;
' b, X! v, P/ i) O) E    sz_type size = vec.size(); 0 ^8 e/ H5 _; N0 l$ l# W: n9 a! u$ Y4 M
    for (sz_type i = 0; i < size; ++i) {
$ P) s! |9 \8 z0 y        int a = hexCharToInt(vec[i][0]); . j; V, c% L$ F, ]* N7 t- Z
        int b = hexCharToInt(vec[i][1]);
0 W$ d. z. m! M: H: B9 i* d& R! h        out[i] = a * 16 + b; 9 o' T* X# s6 H6 T" N8 v
    }
$ {* n  i, [  H$ z$ n    return size;
5 O0 y0 Q! Z! W& M. X}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H # N* s- v2 I6 z1 A  w
#define TEA_H 7 {# `) i0 z; Q* N% E

6 \" l2 c1 f3 v- w/*
3 q7 ?  B$ F* c9 P*for htonl,htonl # c/ y) n$ I6 z5 ^( A, `
*do remember link "ws2_32.lib"
, ^( y9 v" k# V- T*/
% c* U. l6 ?# e3 O. @#include <winsock2.h>
! ^- y9 F  f" i7 T, I2 Y" ^#include "util.h" ) v4 z1 I" n/ h+ ]& C8 P) @

) m+ ~. r: N: w0 d3 }, Kclass TEA { 2 V$ Z( r) k2 w( z1 M$ d9 a5 |7 k% I
public: 6 L0 Q, Z" x$ J2 j8 [4 D* B* H
    TEA(const byte *key, int round = 32, bool isNetByte = false); . T( e6 q: e8 i( Y6 J+ Q" Z% v
    TEA(const TEA &rhs); 8 X% Y) L1 N. d/ {4 O
    TEA& operator=(const TEA &rhs); % ?- o4 k- e" y9 |9 O& P& G) J
    void encrypt(const byte *in, byte *out);
$ i0 V% ^3 q% F6 X6 `; ?    void decrypt(const byte *in, byte *out); $ f, W  Q- @" ?& b& n/ I
private:
; W  i* Y5 H9 C$ U    void encrypt(const ulong *in, ulong *out); 3 h1 S& y1 |: T6 h2 ?, N  W1 p
    void decrypt(const ulong *in, ulong *out);
" I$ l5 H5 ~0 M# W+ }9 u+ x0 S7 D    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
: `9 A$ C' v3 T3 p& Z1 [    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
2 z. e: H: ^' V2 k- a1 a5 _& t* R+ jprivate: 6 H- A0 t8 V' D* ~' W. `5 w
    int _round; //iteration round to encrypt or decrypt 4 ~6 S0 R* s7 z
    bool _isNetByte; //whether input bytes come from network 7 T7 p- j: B$ Y! ]
    byte _key[16]; //encrypt or decrypt key 6 X. x' f3 {* I, H. {; t
}; 2 Q1 g  J$ k( g; N
" f; N  i$ f9 V+ Z/ @8 H
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" - b, s8 u) _: c- C$ O
2 #include <cstring> //for memcpy,memset 2 G# e; |5 _3 e2 _$ i) y. k1 U& Z; z
3  ! F/ {9 l+ W5 L" d! k9 e- F
4 using namespace std; 8 I4 @1 y* ?4 U/ w" a
5  2 X5 b5 F0 {* |7 ?% j6 y5 Q
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
' \$ P! k( w: `/ w2 m- \' \ 7 :_round(round)
, t+ Q" [$ K. A5 w 8 ,_isNetByte(isNetByte) {
, j' ]. V: D+ n, z4 L& v' o 9     if (key != 0) 3 [; K3 E6 v; i# N0 c1 F; x  `
10         memcpy(_key, key, 16);
0 P5 S- X3 }9 C* J) B# l11     else 1 z# C* }: l) S0 _; n
12         memset(_key, 0, 16); 5 I/ ?' m5 Y! G( i, g- @
13 } 4 ]2 |3 H6 o- z; S$ T/ ^
14  
6 C/ l. z! C" T- w  c15 TEA::TEA(const TEA &rhs)
1 p7 \! A1 N4 x6 @7 f/ K" A16 :_round(rhs._round)
% z2 @8 m! T7 G( K17 ,_isNetByte(rhs._isNetByte) {
+ P& n6 s- N3 W, K9 w18     memcpy(_key, rhs._key, 16); + C. T8 g) l) J
19 } + Z$ ~( n1 h9 _+ ~: B& o. s: p
20  
, x" |8 k6 Z) q# x$ L. N9 n. ]6 L21 TEA& TEA::operator=(const TEA &rhs) { 6 y3 ~# R4 _; H3 r# ^1 Z: g! n
22     if (&rhs != this) {
& o. x: N$ Q2 G% s3 ^* r23         _round = rhs._round; 3 ]! `# C2 u, U
24         _isNetByte = rhs._isNetByte;
0 `3 m3 \/ o: |% G+ B* u0 X! B6 p25         memcpy(_key, rhs._key, 16);
* ], R( w2 S8 b$ e0 S( }8 h26     } ) e3 w7 d/ h" c& _
27     return *this;
* w3 ~2 \* b. C! i  r28 }
3 ~. m( h5 [* q9 G5 D; T29  $ M6 O( R& T: H2 s
30 void TEA::encrypt(const byte *in, byte *out) { $ }8 a2 V5 x% `% k4 x2 i
31     encrypt((const ulong*)in, (ulong*)out);
/ b( _0 K* V2 E, l5 ?- b9 ]32 }
# w: V' {3 C# N; @4 W: o' R33  
" d0 G- k, D3 d; i. E1 C& N8 p34 void TEA::decrypt(const byte *in, byte *out) { / U! {! L8 L! |6 i. q
35     decrypt((const ulong*)in, (ulong*)out);
8 |; h' C; z9 U/ o$ C# D1 r  l5 d36 }
2 q; T+ R- o7 m- S. @% j- q4 @37  % `! o. J* Q' ~* ~
38 void TEA::encrypt(const ulong *in, ulong *out) {
: E" ]# F, ^5 L, T39  ; Y! V  E+ m6 t* _* d
40     ulong *k = (ulong*)_key; 4 e$ K' a5 k- O4 q% Y& W, P
41     register ulong y = ntoh(in[0]); 4 o. w6 U- N0 K) G- N" B5 u2 ?* M# {
42     register ulong z = ntoh(in[1]); * g2 i2 G; x4 @8 b, G! K5 r7 v2 S
43     register ulong a = ntoh(k[0]); + b( b8 q4 Z% y( @/ ^7 Q/ d' _
44     register ulong b = ntoh(k[1]); / q, }7 |1 {" c7 s
45     register ulong c = ntoh(k[2]); * u# V: N7 y) w- g. B( ?" }
46     register ulong d = ntoh(k[3]); - v; k: j# z( H0 h% p# @+ ^
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 4 u/ [- Y3 m0 Y4 x0 v( e  A
48     register int round = _round; " e  E3 J  P+ E, z3 K& r0 A) @
49     register ulong sum = 0;   w9 {" }4 q0 K# @7 N9 L* U$ {) l
50  , T% _9 T' z: [/ ]# k
51     while (round--) {    /* basic cycle start */
) p$ v; ^/ o' v/ c. [! W52         sum += delta;
$ J) J7 O- p. `53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); * {# o5 b3 @, B$ i* o& i
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); + |6 W4 u8 T3 _$ O  v% W( |* Q
55     }    /* end cycle */
2 G1 v2 D+ D' c# }2 r& K7 P56     out[0] = ntoh(y);
" v' g7 b  N  j) @& a- l7 H57     out[1] = ntoh(z);
! F! H1 c* A$ C+ W4 V58 }
7 |6 S- Z5 `5 L: B7 |$ {) {59  
! q$ g/ M% i7 f7 r* K- \+ I60 void TEA::decrypt(const ulong *in, ulong *out) {
& T- H& \, C  }0 ~61  
" G6 G" a' [, T8 |8 J62     ulong *k = (ulong*)_key;
& m8 u' x! \6 m7 z0 N63     register ulong y = ntoh(in[0]);
- J) C: c2 t& E& N4 t64     register ulong z = ntoh(in[1]);
7 r. S$ M# O( |; C4 p0 M65     register ulong a = ntoh(k[0]);
( [8 L; J/ d8 f/ p1 ^( `66     register ulong b = ntoh(k[1]); 2 o" v! X9 C; N4 B3 C% [
67     register ulong c = ntoh(k[2]); " w8 Y; b2 y5 _4 M' l  X0 W
68     register ulong d = ntoh(k[3]);
2 {8 z: f: x1 z  j" W3 I69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
2 E* g; T7 y- w# t7 a( U  E$ d70     register int round = _round; ) ~- }/ N) a* y! d( o1 @
71     register ulong sum = 0; " A! w. k* k$ m$ B" |
72  
" e' @  X/ Z/ ]* G  n73     if (round == 32)
1 z# U7 U/ v, B2 A# C74         sum = 0xC6EF3720; /* delta << 5*/
8 g* h! U; H% `5 F1 o' A/ }1 [4 }0 b75     else if (round == 16) 9 z# o( e5 a9 i1 D
76         sum = 0xE3779B90; /* delta << 4*/ 0 W) k6 j& D# d$ P% w: V
77     else ( J+ h: [4 X, e
78         sum = delta << static_cast<int>(logbase(2, round));
" b8 e# e1 y; m: |( T# B% Y! t79  ( P* f+ G: m: T) |- ?- h! F1 b
80     while (round--) {    /* basic cycle start */
* \% H: E& F2 a9 x9 S81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
/ c1 ], g1 g& ^8 I" S7 H7 z' y82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 5 B& I4 ]: H7 s) _6 o. ^
83         sum -= delta; % \" N  U& q# ^; S5 Y8 S0 \$ F
84     }    /* end cycle */ - X9 L0 _: T; S8 {% C8 n
85     out[0] = ntoh(y); 6 L9 e" t' H# B3 H# A
86     out[1] = ntoh(z); 9 i! z0 `9 ~9 J0 g/ [1 q2 [
87 }$ G+ F8 h  e: [- v8 D& ~

6 m) {9 F0 Y: ~9 K( q需要说明的是TEA的构造函数: " `  R; w3 Z; w# @) u# X* I$ A! ~& J
TEA(const byte *key, int round = 32, bool isNetByte = false); " \; d7 o2 f0 R$ V
1.key - 加密或解密用的128-bit(16byte)密钥。 8 |0 ^$ o5 k5 F$ H$ p5 L" @
2.round - 加密或解密的轮数,常用的有64,32,16。
, e! _  h' Q' X6 p3 _3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
) `' I+ Y9 o+ R  c) m/ M3 G7 E1 t# w! S+ g) j9 z% M: M
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
! f; @7 l4 a) |1 d6 E- T 2 #include "util.h" 6 _6 q1 H6 n6 ]* }9 F0 w+ y6 G8 g
3 #include <iostream> " w6 j  {$ L" O) F+ [
4  
! }  q! e2 T& W) M 5 using namespace std;
: ^$ v2 ^& O* ~. o0 I: \) P 6  
2 \. H* \0 F! \2 h1 w  w. N1 w  N 7 int main() {   s, m+ U1 V  d
8  
3 E6 l7 A8 j0 A4 O! W0 P- S 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 8 \" l1 G" p% V( d  v8 H# `: G
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); - v% u* [: `$ E
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
9 u  q6 @5 ?# V12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
" a8 ^1 z: f& b0 [& x! q0 D" N13  
! n. b7 s$ D- W7 |, d14     size_t size_in = hexStringToBytes(plainStr, plain); " Q" }6 X. h- Q
15     size_t size_key = hexStringToBytes(keyStr, key);
7 l9 u( M) S* h% W16  
% F! d* y$ T3 M8 J* Z: f  C# d1 z% L17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ! K9 z: ?9 j* ?( W8 k" h- t) c
18         return -1;
; o& l6 a& l: c5 `; ]19  , M$ R) o; M# `8 E. T& z5 l
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
* @8 |% h, e2 b3 a2 j9 `3 l21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
! U: t* ?% a, Q; h22  
. w5 W1 R; R7 ], j23     TEA tea(key, 16, true);
+ D1 S. j) p5 E24     tea.encrypt(plain, crypt);   X( c8 q/ R/ b, C6 c9 ~
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; $ H4 F8 H' S9 O) N+ L2 M- M: U; g
26  
' [! K' V0 |: x4 D! I) h* `* o27     tea.decrypt(crypt, plain); / J( t( C, K5 e( C
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
7 d7 ~1 h+ F! r& [2 h/ F29     return 0;
, n3 ^6 w% d. h; S/ k" R! B30 }( K+ |3 y1 S4 ]

. z; ~! a9 m& }1 @9 _本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
  X! u" `( p- g/ q5 c& I. h运行结果:
2 j* ~% O- L5 D3 W3 OPlain: AD DE E2 DB B3 E2 DB B3 0 `& l% }1 H% z5 N
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 - m# U1 O7 {9 t
Crypt: 3B 3B 4D 8C 24 3A FD F2
9 T  C" V$ Q+ i, r+ I$ h. UPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 22:03 , Processed in 0.018593 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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