找回密码
 注册
搜索
查看: 38339|回复: 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轮):$ t8 `/ ]. O/ d9 W( g2 w# c
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
$ _( C3 u, |* A, m; gTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
0 D" f4 V) o2 P+ M& O2 {7 }; e8 @之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 1 I+ C; y% K% E% E" y; k9 Z# [+ m
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
5 k# S( ]* x1 g; V' F3 \在 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. 4 h4 H' d% d% b# R" I. F' `
  2. void encrypt(unsigned long *v, unsigned long *k) {
    # d0 U9 I! m4 m6 z1 p" g5 v
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 2 }" ]4 I! J( V5 Y% w- n
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    " b/ M+ d' {$ W
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ & J7 w$ u" b) ^; z9 b: x
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ' l& j: I  k7 V( s  A6 ~( Y2 Z- n
  7.          sum += delta; : S* Z/ C) ], N# x& P% W
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 1 ?$ ^7 z! m' b8 X6 n# C
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    - s# @. e) H+ W: n' d
  10.      } 6 [; w* a- W( x5 T4 w' [
  11.      v[0]=y; $ a- d7 j+ [. S* u9 x0 C: W
  12.      v[1]=z;
    . n& l8 [( D* i0 {- j
  13. }
    % h; X+ }8 F: d$ A& |. H
  14.   
    1 v( K' D) K6 u8 }
  15. void decrypt(unsigned long *v, unsigned long *k) { ! R1 o0 D0 H, l( K8 m0 g
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 9 p6 L( M  P6 O9 G. D
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ # ^% i9 J  w7 t0 ?) m
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ * t6 [$ r! x: }: ^" V
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
      q) T9 B" A, H+ j; v
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # m" C/ ?; H: n3 s. `% K
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    " ?* b, d- W3 t/ o& s
  22.          sum -= delta;                                /* end cycle */ ! M1 i2 L! O" E
  23.      }
    . {6 E5 _8 z# J( o7 M1 F
  24.      v[0]=y; 4 |. l* K  R/ G  r7 d. L& O# F7 v9 l
  25.      v[1]=z; ( b, L) x4 O% z  ]4 e) m
  26. }
    4 B: W2 r) W! E* b2 _5 p
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 9 N; G6 _/ Y& e6 L0 [- J/ L4 i8 E
#define UTIL_H 7 _4 X) a, V" i4 r9 {( K

/ F% t4 [; g! \0 `# u/ W' ^3 D7 G#include <string> 8 X; q* v7 D* \8 \
#include <cmath> + i% O) o/ u3 N: @- k
#include <cstdlib> ; k! X( n8 D3 [! [" F
" c1 Q9 ?' i8 X% s) |9 o
typedef unsigned char byte; 5 n) W- {3 v8 v- g( F( m& p
typedef unsigned long ulong; ) o" Q5 Z+ ?2 w3 ]. L
& o) E; s& W$ e$ X3 S* U6 l1 c- x$ J
inline double logbase(double base, double x) { & o8 [* k6 ?" M' C/ X" N5 J' h
    return log(x)/log(base);
& i3 g8 |8 F. V, v: i" k2 v} + G* z  K$ E/ u: M

4 |3 F5 f# l& b. @. g; e7 y/*
- ?+ n# q, R; D7 F. }3 r9 J* U*convert int to hex char.
2 W& t6 J. y8 Q. x' ~*example:10 -> 'A',15 -> 'F'
% x# G4 r3 h8 o& X- M9 ?& E6 s0 ^*/ / t8 E7 Q4 A  A! m2 q
char intToHexChar(int x);
9 }* G$ f; |' x - K3 ?! y* S& d. H2 `
/* - q# ?; i- T# _( W
*convert hex char to int.
1 o+ Y" d, ?" y1 B. n% |4 L*example:'A' -> 10,'F' -> 15
( I! i' R6 ]( M8 W*/
0 U" h2 J' t- }3 _int hexCharToInt(char hex); . M. a  N( x' c) F) F5 S5 _4 Q  k9 a
: o! P( I1 \) D9 @, S2 R% o1 ~! J
using std::string;
4 e  Q$ v! w7 g" C  w/* / ?/ w, t# e$ Z+ _3 p
*convert a byte array to hex string. 4 G3 G6 t( j% s
*hex string format example:"AF B0 80 7D" 8 w. ~# s$ a  T7 ]! m& C$ o
*/
' ~, o6 o0 C5 d# }4 F5 astring bytesToHexString(const byte *in, size_t size);
9 A+ g) J/ ^# R; H% z 1 p- W  u+ g* Z# X; O( a8 Z' D
/* ' ]0 ?* j- l& b* K: f/ ^' i7 U
*convert a hex string to a byte array.
) n% f/ _0 K# n& y% I- n*hex string format example:"AF B0 80 7D"
. t5 E) k) o" H1 }! f* W*/
4 ]4 g. c/ c. t$ n) c! Lsize_t hexStringToBytes(const string &str, byte *out); 0 X) f1 Y7 I3 _- I
. {! P& f# e3 N& G0 c3 [1 C* g
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
7 K$ v+ w5 ?! e$ p#include <vector>
% Y6 Y0 l; k2 L, _1 z 4 A$ O' @% ?. q) Q! d  j( A5 e
using namespace std;
6 T8 R. _, O& v2 N5 z
/ n7 u! }$ x5 |/ V- s0 E1 echar intToHexChar(int x) {
% u% B, J; X. J6 W    static const char HEX[16] = { 2 k( G3 C# y% t0 w, z
        '0', '1', '2', '3', 4 m$ Q$ I  b- N2 x( q
        '4', '5', '6', '7', . i2 Q* V# C: B& o
        '8', '9', 'A', 'B', 2 v. A2 m4 {/ q* u2 P, S) S
        'C', 'D', 'E', 'F' : ]! \, [( U/ u+ l
    };
! G% g# y9 }! {" A' X0 O& W4 b* T+ R    return HEX[x]; / v) Q3 I! i, `* s  h3 x
}
' E8 e( d7 r" R9 k+ u: S . @& }* b6 F3 R( A
int hexCharToInt(char hex) {
; ~8 N. J7 o2 V4 N& k8 u- }    hex = toupper(hex); 2 P1 V; f' G3 i
    if (isdigit(hex)) 1 K, n7 ?2 H$ ]0 t2 ~. _
        return (hex - '0'); # f8 b! D. O# }* {) Y6 k
    if (isalpha(hex)) 8 O" G; u! U  Z3 t0 e! g% g
        return (hex - 'A' + 10);
5 w" r, M8 d! f# V6 O    return 0; ; R- I8 J$ D' z# N( e
}
" W* k% s* B: e1 o . }, u" m# w$ X) _' g
string bytesToHexString(const byte *in, size_t size) {
' ^( o7 v" g1 l# f    string str; . o4 i* v5 {# S  n+ H/ W# c% l
    for (size_t i = 0; i < size; ++i) { " j) u# }( w5 h( J8 g
        int t = in[i]; $ |6 V: ]3 ]- V- ]
        int a = t / 16;
. r2 v% }' P7 U% E7 s: B        int b = t % 16;
" a, R( f% n' Q1 v8 I% e        str.append(1, intToHexChar(a)); + v0 q' b; Q" \1 L4 E# z; G' U: u% n
        str.append(1, intToHexChar(b));
+ O* n: M3 H" U4 ^$ ?        if (i != size - 1)
, b" d$ [  I; }5 }  z            str.append(1, ' '); ' s4 a- s: Q! s6 ]( ^+ [, L8 y
    }
3 l9 N  N/ P0 W* p2 Y    return str; $ \2 v; J; X8 }% J0 Q
}
, a9 F9 u5 W; Q 5 L% P: F7 q0 F2 t% W) p
size_t hexStringToBytes(const string &str, byte *out) {
! f4 s6 \8 P4 l/ ?" O# \ 1 r9 G; {  C0 a0 X, P. K
    vector<string> vec;
. u( I' Q/ T" d( j( v# T7 K! \8 y. e; R    string::size_type currPos = 0, prevPos = 0; 2 S2 Z$ n0 O, p0 d+ f
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
1 @9 [: G: v; F: _        string b(str.substr(prevPos, currPos - prevPos));
% S3 s6 u; _% n$ N/ [8 m        vec.push_back(b);
5 V+ G, t& v0 s. x! l2 x8 Z        prevPos = currPos + 1;
% g* G7 O3 g$ Y2 d, S! k    }
0 A( S; e2 s$ W# @+ j6 {& d4 _    if (prevPos < str.size()) {
4 o  G5 w$ k: F( {1 I) e        string b(str.substr(prevPos));
; N7 U: N! n& k! c4 N! v        vec.push_back(b);
2 a, ~. @0 m7 x" z2 }1 ~3 x    } ( @+ ]: \" M! O* r. C8 `$ r; _0 z/ U1 K
    typedef vector<string>::size_type sz_type;
, o8 v4 X  V" ~5 W( U$ i    sz_type size = vec.size(); ( e$ X  G1 P4 ?; z! n3 [0 m
    for (sz_type i = 0; i < size; ++i) {
  j/ r& N4 B$ j' |8 \* k% B        int a = hexCharToInt(vec[i][0]); 0 I" R& g" g  ]6 f+ [$ _0 F# L
        int b = hexCharToInt(vec[i][1]); # n: B, k: W: W& i; s* e; @; x( C
        out[i] = a * 16 + b; % c5 w' N! v2 d- w
    }
9 w3 @& S/ B' L$ Y! ]    return size; 1 ~/ Q8 |! \+ K! q  }
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ) p' P: C. m, ]
#define TEA_H 3 B" W/ f( }( O# B7 K8 V9 |$ g: u  m0 d
& y, d0 o/ ~- B% b0 S
/*
% ^  `, H; c$ U; x: ^% ?3 G6 z3 L*for htonl,htonl
9 v$ Z4 U5 [$ |$ _, |*do remember link "ws2_32.lib" / N/ ~: e9 o) }' M
*/
$ g0 s& k' x+ V5 n: F3 ]' I#include <winsock2.h>
! i9 W3 s, S4 C' `9 ~, V# }#include "util.h" 7 ?! m2 c; U- t. K2 v! h
# L3 Q7 [; ^8 x( u
class TEA { 7 N6 s2 s# R) B# O0 n: w$ L
public:
1 ^+ y, c7 r6 [: ?    TEA(const byte *key, int round = 32, bool isNetByte = false);
2 X/ ]* L$ A+ T* E- w/ o4 J# P; s    TEA(const TEA &rhs);
9 o& F2 A0 \1 |    TEA& operator=(const TEA &rhs); 4 s" S- x0 V& ]2 a3 ^  S7 c
    void encrypt(const byte *in, byte *out); 3 w- a: }( q! p+ ?0 ^$ `. B1 N2 j
    void decrypt(const byte *in, byte *out);
& X6 z9 A7 I& w. a$ x. {private: - e, D. D  Z/ l
    void encrypt(const ulong *in, ulong *out);
) |0 F/ q, M) j# W8 Z% f    void decrypt(const ulong *in, ulong *out);
" x$ [$ l3 E' t  P    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 5 M& I/ n: @9 m0 {8 P% j
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ; W/ L* u# M! i! Z) Z
private: , y6 @8 c* B$ r( z: U
    int _round; //iteration round to encrypt or decrypt
, b% b$ g* O( E    bool _isNetByte; //whether input bytes come from network
3 Q: z& D( g5 c8 m3 y    byte _key[16]; //encrypt or decrypt key
3 w3 v+ a& E$ V  k% ~. g2 f};
* x  p& B( Q9 W+ K
( b9 `. T3 F' i3 b#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ' ~; N- K6 c# i# g+ R
2 #include <cstring> //for memcpy,memset
0 L: H  J" x# f- _: @ 3  
7 R$ Z; X) @0 u  X 4 using namespace std;
) @; j& j4 c0 }8 I 5  : @* f0 p  U. r
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) * K1 ~, I" u: r6 j
7 :_round(round) . X0 U4 B, _$ F
8 ,_isNetByte(isNetByte) {
7 l, D( B- z; @ 9     if (key != 0) $ D- C3 O) N. @/ N! O+ u. O
10         memcpy(_key, key, 16);
* E% r, X% {: f* m+ S0 }11     else
7 r1 s# a, w- c& X( R6 U- [12         memset(_key, 0, 16); ) l% Z' ]0 W5 R! S" T
13 }
- N9 k/ {+ r* t14  3 U, e$ o( X* x, V+ n
15 TEA::TEA(const TEA &rhs) 9 V. ?; H8 j6 w- H5 K
16 :_round(rhs._round) + Z$ ]7 O! _% f8 ?# b9 T
17 ,_isNetByte(rhs._isNetByte) {
4 u6 X2 N6 Q- b+ \4 d/ [  G18     memcpy(_key, rhs._key, 16);
+ {6 a( [. y. b: h, a+ o* I/ \% Q19 }
- e9 i! `7 O* `/ P, V20  ! u$ h  s2 u; }2 N2 \
21 TEA& TEA::operator=(const TEA &rhs) { : q+ }6 a# C' W/ R9 a: W" v: F
22     if (&rhs != this) { % L- F9 ~  @& k; i
23         _round = rhs._round;
9 s, v0 E8 w6 |# W2 ?8 r( p: R. }24         _isNetByte = rhs._isNetByte;
; n. g- r- [  s4 X% h& z5 H25         memcpy(_key, rhs._key, 16); & P+ b3 u6 A: B0 l$ \. a$ ^4 ?
26     }
3 c# I* E( r) y+ H7 s" @. B27     return *this;
/ @) p! ?1 g/ ?28 }
, f3 S: ]7 v  Y9 p: ]29  
2 X& S5 g( j2 E+ q/ ^30 void TEA::encrypt(const byte *in, byte *out) {
. |! y0 _) @5 ?% y5 \2 C+ R5 r7 Y: l& V31     encrypt((const ulong*)in, (ulong*)out); " _9 p# e% l  W9 Q1 E1 Q7 T$ w
32 }
, b% H5 W! `6 z. a/ g* I7 W0 N9 U0 v33  * B4 d8 ]( e( ~& r
34 void TEA::decrypt(const byte *in, byte *out) {
8 }! `$ V2 S5 Z* G35     decrypt((const ulong*)in, (ulong*)out); ; \3 F7 V3 [0 v6 y9 q8 U  o& L7 x4 j  a
36 }   v, B, Z; u9 @
37  * q# T9 L* `9 J) |- Q' q
38 void TEA::encrypt(const ulong *in, ulong *out) {
" }7 Q4 K$ `$ ^2 y& S0 F39  : {7 B( ]- U; u& C$ ?
40     ulong *k = (ulong*)_key;
/ g. ?8 _( ^. v! s( U7 i41     register ulong y = ntoh(in[0]); : h' r+ N4 V2 L$ c. `  ^' p
42     register ulong z = ntoh(in[1]);
4 j" [3 r' R* p5 p% q43     register ulong a = ntoh(k[0]);
# U; S4 y- d1 \# `- r1 N( m9 E44     register ulong b = ntoh(k[1]);
$ r; Z! g) U0 B2 x. D6 h/ x45     register ulong c = ntoh(k[2]);
- e3 x( ]/ R0 H" u- `' e" }46     register ulong d = ntoh(k[3]); ' G+ T3 \5 o; S* i3 H" z
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
4 a5 C5 A; y& a+ C; z. s1 z48     register int round = _round; , e+ j) Y. j3 ]  z- T3 Z' e$ |( D# ^
49     register ulong sum = 0;
+ Y9 M) m: F( O: j$ i" A3 V50  5 v/ z% n5 O: y( h- H
51     while (round--) {    /* basic cycle start */
. F0 r; H( E/ q* ^52         sum += delta; 3 j% I, T+ b. D( d3 E7 m* c
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
$ J2 k. l" H5 \2 Y1 I54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
; }+ F: V% i# f  ~0 r! ]! R$ t55     }    /* end cycle */
! W2 i$ X6 x. x8 I* v, x" n56     out[0] = ntoh(y);
; o% |2 B; Y# S- l57     out[1] = ntoh(z); 1 U- B2 ], d7 l: D2 {  x* b2 ]) j0 S& Z
58 }
3 A" p8 R7 \) n7 y- p59  * i& \) z& I! h+ O, c. n9 n9 V
60 void TEA::decrypt(const ulong *in, ulong *out) {
3 g6 T$ j: j) D) K61  2 _/ t$ I4 I: q5 D# _0 J% Q
62     ulong *k = (ulong*)_key; 1 J- s! N' w( a2 b
63     register ulong y = ntoh(in[0]);
" Y1 _, [( p7 y  s, ~64     register ulong z = ntoh(in[1]); $ R2 T+ N! l" v, v
65     register ulong a = ntoh(k[0]);
1 q# _+ T7 p8 S. y! H66     register ulong b = ntoh(k[1]); + X% ]( m$ F5 s7 @! Z1 b6 L( l
67     register ulong c = ntoh(k[2]);
' d' D  X2 i4 Y7 [* O; r+ f5 K68     register ulong d = ntoh(k[3]); : `& r) e3 K3 A; l" v
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ $ n1 Y$ {" D% J
70     register int round = _round; ' R2 U1 a# _. Q6 b. j3 _
71     register ulong sum = 0; ) h" ^8 S/ z4 Z* K
72  
. N3 ^$ W+ W7 x: K9 I73     if (round == 32)
7 K: `- _+ i3 L3 v3 e; D74         sum = 0xC6EF3720; /* delta << 5*/
1 [0 ]  w* B( q" Z. \. P; ~75     else if (round == 16)
) Z/ X8 W0 \6 g; i1 g76         sum = 0xE3779B90; /* delta << 4*/ 6 l' k3 v9 [2 v( ~6 W
77     else   C" R" R) o  ^
78         sum = delta << static_cast<int>(logbase(2, round)); ! }, X" \. j; y
79  
8 q2 q8 [0 }3 d9 P7 o80     while (round--) {    /* basic cycle start */
3 @2 O* y- t2 E3 v, d) W7 X. i' u81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 7 g4 {, Z) r- E$ y
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
8 S+ [2 B/ J7 q) W+ v83         sum -= delta;
" G/ D/ U/ V- d7 p0 g84     }    /* end cycle */
- _5 P- t/ }* q3 `& @85     out[0] = ntoh(y); # }4 K4 {- N+ J/ w" \' }1 y
86     out[1] = ntoh(z);
) K8 W! f0 d3 m6 S5 w( K. w6 N% z87 }; H$ {% z" y+ [) X/ V  D' ?
8 Y! O7 ~. v! d" {) p* z
需要说明的是TEA的构造函数: * e$ w$ `% m0 p$ Y, m
TEA(const byte *key, int round = 32, bool isNetByte = false); 4 F, b7 J+ U) h$ ?
1.key - 加密或解密用的128-bit(16byte)密钥。 # Z5 r# s2 I0 s( p0 r- q
2.round - 加密或解密的轮数,常用的有64,32,16。 ; Y/ Y! Q# j" `3 \
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! # X! Q- w2 m, w" F) G

9 }. P$ \; W, H9 J3 u( ~4 ^最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"   A3 m. }- d: P2 s1 y3 _
2 #include "util.h"
1 ?- B3 L1 j% M) Y5 O# l4 k& m 3 #include <iostream> * U; }' [/ E; m- L# f0 I4 U
4  
6 m! C% R0 r- f$ N- E 5 using namespace std; 1 R6 |/ G# s" b/ z# F' d2 N- v
6  0 k* M" c: p, x2 g$ O# x
7 int main() { : j4 d  |* \  i. c+ V& e" A
8  
  C8 S" C% G0 e; K. W- I( } 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
( b4 n  R9 q2 H+ c5 Z2 E10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); % @% O& e: f6 ?1 ~( C
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 6 w0 R6 U+ S; A% |* M
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ' G% e$ Y* Q- o, X8 G/ i6 }! a
13  
* f1 o0 q# P. p3 w" E5 W14     size_t size_in = hexStringToBytes(plainStr, plain); % _9 {0 s6 d9 v1 l
15     size_t size_key = hexStringToBytes(keyStr, key); + {& e" `3 y! ^
16  0 {3 L$ t9 R/ ]/ x
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
. h( J2 r; X( @. I0 Z18         return -1;
1 e# N, o9 e. o( Y/ s" q6 [6 ^19  
% y( c; \& ?9 a8 h20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 6 U2 _. N) D! ^
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 2 P) `4 R+ P8 M/ b2 u
22  2 v: x, q/ i+ f/ p7 i
23     TEA tea(key, 16, true);
: ]- S, `0 N" ^* x24     tea.encrypt(plain, crypt); 8 q6 ~! Y/ g* Q- i& k4 J& {
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
! ]; ~' n5 [% R/ B26  2 z0 a" h, C" f- f# d
27     tea.decrypt(crypt, plain);
- V  x5 `9 C6 s8 E' Y28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) Z7 }+ c- o6 b4 y29     return 0;
( i$ b2 Q! I5 i7 T30 }
1 |: ?' ^# e  K$ E# K
4 j0 T  o( I7 `0 t本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
# Z8 @! Y  v( ~1 ^, g8 m& N运行结果: - Q" {. j1 n9 t, F: O
Plain: AD DE E2 DB B3 E2 DB B3 2 W2 U$ D# `0 x& U
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 % x8 B5 `+ v% k; i, m
Crypt: 3B 3B 4D 8C 24 3A FD F2 3 ]8 j8 y9 E& O" g
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-3 16:35 , Processed in 0.021050 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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