找回密码
 注册
搜索
查看: 37738|回复: 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轮):
5 G* q4 Y$ K, y( d- B+ _. H/ T& T微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
* k6 D* p1 q# F8 o* r) E# X* H/ W# {TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
% n: a. ^. L$ S  r之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 2 L4 V% B% w: P2 ?6 X0 r# d! l0 p
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - e8 _8 e4 h2 F
在 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. & g# O# |4 k( T7 a3 T$ y
  2. void encrypt(unsigned long *v, unsigned long *k) { . i, L, @( a  A& v& d5 r
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    , a; J( g2 s& n  U+ e/ b
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ . u' d2 I: m6 ^8 R
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ / @3 l' [* p! S" t  W: i
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    0 l- u3 z! Q# h3 n* J
  7.          sum += delta;
    ' w9 h) h# ~4 h
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    - h( Z2 n7 S% W/ i5 M* i$ y: G
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 9 n& B" C$ G* l. W  h. R
  10.      } . O9 l( s5 S$ E8 l' e( n
  11.      v[0]=y; / p( f1 U1 L2 G9 t+ m8 O- s1 W8 \
  12.      v[1]=z; 3 d+ ^& y$ W* r  b: n# T
  13. } # C( A4 E; S, e0 W1 ?
  14.   & z. s# K6 H) ?
  15. void decrypt(unsigned long *v, unsigned long *k) { & x- `+ P$ N% r5 k( d" U" P
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) H5 g- L. x( t+ s$ s! c/ m
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    + m7 Z; r+ D% l' ]+ y2 D( Q2 V
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ # |; M8 e! z! \+ v5 p8 V  a& s7 Z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 6 S; _$ U5 F$ m1 f
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 7 o+ T' Z" h$ j- Y. ?
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    6 o- Z2 A, a, C$ g4 x
  22.          sum -= delta;                                /* end cycle */
    ( J! @- P5 s+ e3 J: C5 U" K( {  W
  23.      }
    ! @$ H2 {  p3 f/ N
  24.      v[0]=y; 6 {3 A, b) v  S
  25.      v[1]=z; ( O* n! H8 V7 ~3 B. _; O
  26. }1 J; n- i$ B6 w/ L- Z2 i
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
( s, Z  }5 X  f! p# Q2 H5 h#define UTIL_H
& C$ k6 t# t5 U, ~2 \
9 f' f8 t: _& E8 t#include <string> $ n5 w' ^$ k  T- g6 K, D% d& a* ], u
#include <cmath> " k" s) Z1 j- o4 d) f
#include <cstdlib> # P4 ~) [2 w; h' H1 N
- [7 U# s  {* r8 K( d
typedef unsigned char byte;
: C9 X' Q6 l9 m+ Z; gtypedef unsigned long ulong;
0 h' ?$ ~* R4 k: Y% }& Y' H $ \2 W: `- G; ~7 K! ~5 C
inline double logbase(double base, double x) {
0 x4 x9 B! W( X) q7 y( E    return log(x)/log(base); . l2 h* o. `* E
}
0 P) u2 F& w6 x( E2 m6 i# R! D
- c( L3 j1 Y/ D& M- q- _/*
2 R+ h& X" c7 t; m  q7 a*convert int to hex char.
3 y  e" k: U! q4 G) a*example:10 -> 'A',15 -> 'F'
$ X  w2 v9 y" q( V. X*/
( J, l" b2 a8 S: fchar intToHexChar(int x);
7 G1 \4 H  b- l' ^3 q# [( | % h6 k/ f4 w$ ]
/* 6 O" m6 I2 M9 |+ {9 E! B& p
*convert hex char to int. & o+ r) _" ]9 w9 B
*example:'A' -> 10,'F' -> 15
1 @: r6 R! _" b8 ~  U( B- q*/
. z! \1 `: M, i" p! sint hexCharToInt(char hex);
8 V" A- d) f) A1 ? 7 ?3 I  S* L9 k$ Q. N6 I- _6 k
using std::string;
8 a3 V5 a+ P6 @! L% b/* 5 \+ G' s) |' @9 O/ \
*convert a byte array to hex string.
$ a' @& F! b( c; q! e3 z/ d/ N; [*hex string format example:"AF B0 80 7D" ; f( y% ~# \5 [
*/
7 u: t7 G' x  i6 j# ~5 L9 wstring bytesToHexString(const byte *in, size_t size);
8 ?  ]8 j( J, H. Y- }% z4 s ; s# h" L. Q! I: A$ N
/*
+ h4 c4 d3 {/ E5 j6 `8 @*convert a hex string to a byte array.
3 I8 \7 p0 B' [, }*hex string format example:"AF B0 80 7D" 8 q' F1 X. k3 w3 t' x* \4 Q
*/ : k5 p5 k, S' e* b
size_t hexStringToBytes(const string &str, byte *out);
8 J# M. ]; {5 ]* S8 g2 c
) f% C+ Q9 R1 Q& p1 `#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
/ c7 g4 B- X1 ?. x: l6 I' F" ?. N#include <vector>
' Y% J- ^8 _. p4 I% b
) o/ t' a0 _$ w. k4 T' c' a1 _using namespace std; $ N- b' K% M" ~' e: V

( H" W( B  |' v- H+ P* {' z: b, Fchar intToHexChar(int x) {
6 h; C( Y5 O/ G% f4 d    static const char HEX[16] = { / D0 r3 e9 }0 f; d: \2 _
        '0', '1', '2', '3',
$ M3 e* K- x# m7 T        '4', '5', '6', '7', 5 a+ r6 t* y* y3 v  a  G
        '8', '9', 'A', 'B',
* E$ v1 m1 N) E. z" y        'C', 'D', 'E', 'F' $ k% ?6 B* X4 L% p4 u
    }; 0 w6 C1 j) D  r* O9 }" }& Y
    return HEX[x];
* c( i7 d4 K6 O/ B  d3 ~}
4 y) f1 @# w& b+ `; e2 r . h8 |9 A: S' M6 B
int hexCharToInt(char hex) { 6 ~. [; A6 }# f0 {9 a6 c7 {4 Y
    hex = toupper(hex); 1 L; ~: ]1 X! \# S" y  g7 u$ P
    if (isdigit(hex))   J# t' z! }8 x+ O& a' }
        return (hex - '0');
- K; X4 N  W7 t  S4 ]" b    if (isalpha(hex))
8 V8 |0 ]3 d7 x8 E  {5 u" Y8 ^, e        return (hex - 'A' + 10);
. n( B+ D, }$ C/ g; |1 ~! U    return 0; 0 Y  C; u, H' ]# D& f
} ( y( T* t) c6 |  U

& g; n: N5 T/ Q$ Cstring bytesToHexString(const byte *in, size_t size) {
) E; t4 C2 A! t& b    string str; ' p, W% b% n0 {' G6 `
    for (size_t i = 0; i < size; ++i) {
! v5 a0 \6 \8 k' A  b" T        int t = in[i]; + y  }; P( @8 P8 a5 P. q  K& e
        int a = t / 16;
) |9 x) \8 {, g: m' f        int b = t % 16; " w3 E% T# R& L5 Z! z9 J  Q
        str.append(1, intToHexChar(a));
0 m* A0 T9 h+ \        str.append(1, intToHexChar(b));
2 d/ o& f, g7 ^, V0 _/ K/ ]        if (i != size - 1)
7 R9 Q+ \) z2 M2 i/ V            str.append(1, ' '); , l8 T1 z4 g8 s( `$ X2 B
    } 5 o) z. A( s9 w8 ]
    return str; 1 }+ n4 f! ?( e' k! ~+ y% ?
} " T5 l/ N9 ]% D6 x* j1 w, W$ R% x
3 c% ?+ X  G: R. V) s% ]8 _
size_t hexStringToBytes(const string &str, byte *out) { 5 ?8 K# H8 o% Z1 Q, m
: ~, U- a& o2 o7 A
    vector<string> vec;
. l& |" u$ f; l3 Z    string::size_type currPos = 0, prevPos = 0; / s/ s" I6 |1 L
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 9 b7 M1 r. N, T" F8 A) G
        string b(str.substr(prevPos, currPos - prevPos)); - h7 ?- d- T5 W) H& x! c5 R$ R0 b
        vec.push_back(b);
+ f' P5 ?. z. K: R; _$ a        prevPos = currPos + 1; ; q8 [9 V( Z  f# j6 H, G* V) C
    }
" F; C' t/ k* ^! v2 n    if (prevPos < str.size()) {
: M; j" k  y3 I2 a* ~, F- p        string b(str.substr(prevPos)); 2 f6 U) X  |% f  k! N
        vec.push_back(b);
0 n0 J+ H# R' F    }
3 O7 w  r7 \7 o6 T# B5 C/ n5 c/ a    typedef vector<string>::size_type sz_type; 9 j0 a' R5 L& p. k9 Z
    sz_type size = vec.size(); + D3 e# J3 S& _, t! z) W/ e
    for (sz_type i = 0; i < size; ++i) {
- g/ x2 N* J4 O! q        int a = hexCharToInt(vec[i][0]); - k& [# I) l2 }
        int b = hexCharToInt(vec[i][1]);
' i: I& v5 g) d! \! ^        out[i] = a * 16 + b;
- r3 \0 j" q5 l3 V2 ^    } - q& q/ o# d; M7 a% H3 _( M
    return size;   z) F* X! b" X9 z) _1 k
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H + H' J( V3 b/ a2 _1 a1 r
#define TEA_H . Q+ L4 U) l$ V. i/ S9 k
6 i: p6 a7 D; C  F8 n" F
/* % ^% I. N$ G% f' x5 m+ v1 {
*for htonl,htonl
' Q& c7 _' \2 E, N$ s, h' t% q*do remember link "ws2_32.lib"
( J8 P" V! o# {9 S*/ 9 X/ L1 ~6 c3 ~# ^- X# y
#include <winsock2.h>
/ H  C# ^& x" l$ |#include "util.h" ! @' M/ S7 a& Z( ~* e4 A

4 X  k  @& b3 I3 V1 C3 M5 Dclass TEA {
2 c" A4 h! Y) ^0 Z0 e) u! {public:
, L) @# E) p. s, ?, y    TEA(const byte *key, int round = 32, bool isNetByte = false); + d! ~2 {: ^0 ?% P) h! F
    TEA(const TEA &rhs);
! o: P0 M# C' O8 y% W0 G5 z    TEA& operator=(const TEA &rhs); & r$ i- I5 |* Z% d' ^+ q; M
    void encrypt(const byte *in, byte *out);
; C4 A- X4 `- H0 A0 l. i2 E: |* N/ N    void decrypt(const byte *in, byte *out);
9 N$ z+ g  ?& c, {1 {2 oprivate: ( E% L5 Z- d- Y* [& I  B
    void encrypt(const ulong *in, ulong *out); $ F( I8 [; n, @1 u) K
    void decrypt(const ulong *in, ulong *out); - r7 h' _7 g( I! r% d# x# Y
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
+ c" N2 K0 E! {  \* ^    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
+ i6 ?6 V' ]' V0 X8 Dprivate:   O9 j0 T; g/ h" P
    int _round; //iteration round to encrypt or decrypt ! E( c% `+ j% k
    bool _isNetByte; //whether input bytes come from network
  p$ S6 h( V2 Q: U5 ^$ S    byte _key[16]; //encrypt or decrypt key
7 x9 J, _8 D& Y4 m. _% n4 {/ Q6 _* c}; 5 s+ @% E- Z5 H+ h9 O8 L; p
  Y4 `" n5 O4 G) Z
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" : I4 Y  f$ J( I
2 #include <cstring> //for memcpy,memset ) n8 @% B& G! x. p8 n" @% F
3  , S3 l8 i8 K( @7 D( t* ?+ J+ {3 e$ A$ e( N
4 using namespace std; # n4 |+ z8 v1 z) i+ d
5  " r8 V* [5 Q+ N0 E4 o" @$ E
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
7 `4 W" ]" H: A2 A0 C- M% b( Y 7 :_round(round)
9 N! r* _& M( S& y& [8 ]# l 8 ,_isNetByte(isNetByte) {
7 W5 z9 M. t* y* H. q 9     if (key != 0) ; n) U' n) y4 S# S* R6 M8 {
10         memcpy(_key, key, 16);
( h$ e* T: X4 \" V0 H' v# e; ~7 A& B9 t11     else - i+ v; B2 r& Y% p
12         memset(_key, 0, 16); ; w) k( H9 h+ ^0 m% ~
13 }
9 K/ }) Y* K! U) V9 `1 W14  
/ G" ^6 o7 h, |15 TEA::TEA(const TEA &rhs)
4 M: t& ^! W1 Y* ^; u4 q2 D16 :_round(rhs._round)
3 _- |$ M' j4 {' b17 ,_isNetByte(rhs._isNetByte) { ' Q) o5 [5 ^6 h
18     memcpy(_key, rhs._key, 16);
3 I4 T" `5 k$ J1 e19 }
8 p& R$ I6 x5 C' k20  
) x) H5 O5 y; ]$ R9 ~% K4 D" e3 @5 J21 TEA& TEA::operator=(const TEA &rhs) {
1 M3 b9 |( q9 I5 ]; Y6 Z. Y) w22     if (&rhs != this) { & H5 F+ f7 w- L
23         _round = rhs._round; 5 M) ]- X/ f; H4 V
24         _isNetByte = rhs._isNetByte; 1 l2 U0 \: Y8 }$ e
25         memcpy(_key, rhs._key, 16); * q3 g4 _# r2 v: p
26     }
- A& |3 C8 f" s. {4 @27     return *this;
# p' h1 z5 e1 o, T( c: V+ i8 J28 } # t! r* M6 _! y8 Z2 j9 R
29  
: z! M1 q2 p5 k8 z6 i7 C30 void TEA::encrypt(const byte *in, byte *out) {
& Q: o1 p8 Q7 m/ V! l9 @31     encrypt((const ulong*)in, (ulong*)out);
$ x* V, m& \& k3 T32 } , m" z4 u5 Z3 g1 X
33  2 {+ ?  a" Z$ `# H7 r
34 void TEA::decrypt(const byte *in, byte *out) {
+ h  i8 G+ r* B) n& ]$ q35     decrypt((const ulong*)in, (ulong*)out);
  g* D) x1 p  x7 U9 N$ r( ^36 }   Z! G4 s; ~- D2 Q$ w; Y$ M, }
37  
3 ^! J. y8 `# J1 ?% z/ G% o38 void TEA::encrypt(const ulong *in, ulong *out) { / c. W9 G& Z" U2 y/ H1 b% D% M
39  ' s9 C2 ^  C6 g; _  ?
40     ulong *k = (ulong*)_key; 0 R3 ]4 i% M: y- t3 a
41     register ulong y = ntoh(in[0]); 1 w2 T5 e' y; b" D" ?: V
42     register ulong z = ntoh(in[1]);
5 d1 ]/ x8 `+ M" T, e2 a6 t43     register ulong a = ntoh(k[0]);
8 k) O+ b, q; v44     register ulong b = ntoh(k[1]);   U/ I9 \) Z+ x# F. C0 y
45     register ulong c = ntoh(k[2]);
* Q( S: i, ]' B46     register ulong d = ntoh(k[3]); ( y1 J( }- p  j9 J: s
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
- j4 N/ o0 Q5 C. y  X8 l48     register int round = _round; ) q% d2 l+ A- X4 K$ x# h* |& N9 }
49     register ulong sum = 0;
1 r- i3 z; h; O( |3 i* g' |50  
9 A; c4 R+ r/ x% q) ]& s, o51     while (round--) {    /* basic cycle start */   _$ F" q2 Q+ g( N; H, L  b
52         sum += delta;
3 E' q) G+ |# U- F+ a53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
& {: ]4 ]' ]0 R) q- x54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
9 L8 I/ L( b5 T6 L' ]; r55     }    /* end cycle */ * A" o1 w5 W# W  g/ h
56     out[0] = ntoh(y); * R4 X# _' X* j* R8 g6 n1 Q/ f
57     out[1] = ntoh(z);
* `0 w6 V+ p( x58 }
( Z2 [4 c, Y5 W+ W59  
0 |7 A5 b) s# I4 O60 void TEA::decrypt(const ulong *in, ulong *out) { 2 k- o# ~/ I1 s- N# t) j$ [, Z+ O
61  
% a' E& Z& a- u) Y' Z" W62     ulong *k = (ulong*)_key; * K/ l( n9 r' K- [1 N6 j1 L, ]
63     register ulong y = ntoh(in[0]);
0 Y* V+ B3 l4 ~! J6 n: r- |; C( ?64     register ulong z = ntoh(in[1]);
4 g: F7 W6 |; o7 ^6 l65     register ulong a = ntoh(k[0]);
9 [( x5 Q% P2 i0 y66     register ulong b = ntoh(k[1]);
4 s* {3 k/ o: W8 t3 u( n1 }' ]67     register ulong c = ntoh(k[2]);
8 O" l; [0 O' p6 |4 L68     register ulong d = ntoh(k[3]);
( R$ T8 l# l5 f" q/ {- v69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
& N% l: t, V$ x) q; t" w6 @70     register int round = _round;
$ y( f; G  M# O0 T" ^71     register ulong sum = 0; 4 x1 n7 u8 q& ]: d  S
72  " t6 D0 X0 r8 a: s& i/ `6 H
73     if (round == 32)   n: Z( @% e! u  S4 P
74         sum = 0xC6EF3720; /* delta << 5*/
% m2 e/ ^2 }+ A* t' A# @75     else if (round == 16) ) k1 r0 e6 Z0 \8 W4 N% u% r5 f
76         sum = 0xE3779B90; /* delta << 4*/
) K+ {9 a$ L- U4 [/ m77     else
4 {/ P! X, H' ?) z78         sum = delta << static_cast<int>(logbase(2, round));
" I) N. B% P! L" T1 a$ s0 }+ t79  & V" }/ l. p: s, K3 R1 e5 y: {8 q0 Q
80     while (round--) {    /* basic cycle start */
, O0 U9 X, }' r2 v6 [3 ^$ C81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
/ D6 j1 [4 ?+ F82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 0 Z5 Y( ~' ~0 ?3 u$ r, f! Q! P
83         sum -= delta;
% u. d& X" t( u' {3 c( H84     }    /* end cycle */
: V- W% M$ t( v* H4 R" a* M8 p85     out[0] = ntoh(y);
; |5 h6 ^) ^* d86     out[1] = ntoh(z);
' {$ M& o- ?4 y! C  I! B8 z87 }8 s' w( d7 N. K3 S
. J+ m$ `/ i+ X
需要说明的是TEA的构造函数:
2 a7 z& o8 y% h  r6 wTEA(const byte *key, int round = 32, bool isNetByte = false); 0 ~: x) y+ e  |! e
1.key - 加密或解密用的128-bit(16byte)密钥。
0 _/ x/ x* t0 ~2.round - 加密或解密的轮数,常用的有64,32,16。 6 V3 f$ O: ?" n( Q& E. h3 Z
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
! m" I; U& O9 h! k
% q# k% H% y2 d4 O& R! Q4 [4 Q! N) D最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" " _2 ?6 m) V6 W3 I" T
2 #include "util.h"
! t/ G$ l! F8 L' Q1 f 3 #include <iostream> 4 Y$ x- j  B0 W( G3 T
4  8 g4 U" I7 d- I/ D% ~$ ?
5 using namespace std;
4 O4 q/ g2 h0 f, y! G+ p- b 6  
' @+ u3 n1 m, a 7 int main() {
% `4 R  K! U( G0 y* y/ L 8  
( C+ t# V6 J$ V+ n" @3 l' E# O 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
" z1 k2 w% o% b8 ?  m10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
8 E2 ]2 Y- W% R) P/ o11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
1 F) r; z3 d9 ?0 p' e' j) E12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
7 z" u! K% t7 Z( H0 o13  
' [, n* p+ A$ |: Z, p. ^14     size_t size_in = hexStringToBytes(plainStr, plain);
) \/ m; e- r9 Y2 N1 I1 A1 Z8 t15     size_t size_key = hexStringToBytes(keyStr, key);
! j2 E, E/ `: |* _16  8 Q) W; b2 `( M7 a
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) - [8 m& h* k; @2 q' X
18         return -1; " `/ j0 K" d( e) [. ?
19  
, B7 @& v1 Z% [& S) a+ {20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
  W  ~7 q/ h! A# M$ V2 Y* M7 {& X21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;   N4 k0 I, s; j: H& Z9 p: h/ M
22  
! z; p: o0 P# u2 d5 C- _/ u% D23     TEA tea(key, 16, true); ; p. U8 e% R9 p  _
24     tea.encrypt(plain, crypt);
7 q' k! a) P- }3 _0 R5 T25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; $ `" d) Z+ y5 F4 Y
26  
4 t1 P2 I* y) L+ S% [$ u3 L27     tea.decrypt(crypt, plain);
1 K% `0 ]2 U% U1 d5 ?! ^28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 8 p- u  }% D! m. }
29     return 0; + e! L" Q& h1 g7 b; X, V& }
30 }
+ o1 B% e! p2 p5 c1 Q# W7 J* x; U& `$ S
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx8 A2 O! B" H0 j3 C0 v
运行结果: * T8 N' O& ?5 _4 v
Plain: AD DE E2 DB B3 E2 DB B3
; j- ~& K$ ]/ ?5 _Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
- K/ W0 \7 W* g% @7 U0 h$ hCrypt: 3B 3B 4D 8C 24 3A FD F2
% W. r$ K& x7 g' R1 EPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 13:46 , Processed in 0.022084 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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