找回密码
 注册
搜索
查看: 37291|回复: 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轮):
% [# S) v% D7 Q* N1 {微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
4 m' p* B. q' k/ rTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。   ^$ |9 I" U" C* i' E2 N+ z  B
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
% ^" m% S- y% F, |9 s. }在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
+ A4 l* A+ u/ h8 h, P在 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 ~0 d5 M9 V, e  y: Y) Y
  2. void encrypt(unsigned long *v, unsigned long *k) { 5 i6 N! b( d. H% n" h4 @! C$ q
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ) e' ?# s* _5 l* L: g$ M' A7 C
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    - e* R/ i4 t4 S" I7 p. c" B* H
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ; W4 g5 i* L4 f8 o! D: c2 U
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    , E* C6 v0 @- H$ I
  7.          sum += delta;
    ' h$ R+ A; M( S+ {
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 3 X5 f" h" S# S1 C. o2 F
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ , O  W0 A, J/ i
  10.      } ( r5 c: \$ J- v2 J& g0 o1 B& _/ |
  11.      v[0]=y; * `3 S$ O8 K4 I: C7 {3 |3 b
  12.      v[1]=z; 0 a/ K2 ^/ |" i1 {
  13. }
    * h0 `4 K$ Q' x
  14.   
    ) s) \& a1 ~% s# ?+ {
  15. void decrypt(unsigned long *v, unsigned long *k) {
    & S8 w" ?) k3 B+ p; F# a" |/ ~
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ " I) h  w7 A9 _: l# p" E* |
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ & ~; e+ P# a. {' X; _0 y
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    3 q: ^. E6 m2 I  p( f8 G
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 3 g2 x4 {* E( {2 @2 ^
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 5 h' P# c  r& N: H  m" D
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    6 i% s2 H! I- ]) ]8 g
  22.          sum -= delta;                                /* end cycle */
    # A- F5 |" Q) @& \- ~
  23.      }
    ! B7 i1 U& _! V& M/ i5 N
  24.      v[0]=y;
    ( s# w. F. J% \/ N: Y; u. G4 y9 q
  25.      v[1]=z;
    1 G1 c5 [2 ]6 q; v! `, q
  26. }. g7 Y1 Z% |3 r# T8 Z& |5 a
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H " n: C( G1 T7 n1 E; u
#define UTIL_H 5 p! T; k# m; z: A# x! b5 ], v0 V" ~! m

# v5 Z6 Q% U' v9 O#include <string> 8 o( b6 T( w' N' t8 P
#include <cmath>
0 e2 D) M- |. z6 ?4 D# `#include <cstdlib> / w- @! {% X4 g/ X/ c) f9 V0 M

+ W; g$ R/ t* x& I  \. G9 C( [typedef unsigned char byte;
9 W% b% h: h0 m* D3 e- Qtypedef unsigned long ulong; $ L: t$ e9 @. g% n) k6 L; f8 _" T

7 U4 p  G; M+ W  W8 @3 |inline double logbase(double base, double x) { 6 O* J% Z! T- P
    return log(x)/log(base);
4 f! _! S# [0 X( G) H0 \} ) _: g+ f: h; E
$ Q4 k5 u3 y+ L$ l$ j1 |
/*
9 t3 F+ K3 Q! L4 e*convert int to hex char. 8 y! b( G7 Z; N5 P, X9 S
*example:10 -> 'A',15 -> 'F' 6 M% K" o9 d% p8 ?" _
*/
; |9 Z5 @  O$ J4 Jchar intToHexChar(int x);
! r; o/ p8 \4 v6 @2 A
' i: d$ z' ^, [9 S* o1 [+ T% M5 R" p2 m/*
+ r# ^% W2 s0 U5 r*convert hex char to int.
% A  I" w/ Y& E9 n4 d*example:'A' -> 10,'F' -> 15
- j9 t* K% J. H- V. X! `* P" A*/ . y! P# O8 q; Q; E
int hexCharToInt(char hex); # g% N0 @1 O1 O' Y3 y" \
2 G/ U( _4 ~/ d* j! b
using std::string; & `" x2 w7 K5 W
/* " s0 [7 V" }, m) X* q
*convert a byte array to hex string.
( D' u* K% ]  t8 p4 q*hex string format example:"AF B0 80 7D"
' A; U, W6 e+ o* r*/
7 ^9 C8 v- I# M! L2 ^! S7 Istring bytesToHexString(const byte *in, size_t size); % {% u$ M+ E$ D! \2 y
0 D& \2 c! w; H3 p
/*
0 r: l3 C9 w; D*convert a hex string to a byte array. 7 H, M4 O+ {3 i6 \& z4 A9 w
*hex string format example:"AF B0 80 7D" 0 u8 ]+ j6 f4 S( b( h# _
*/
; x; l+ p& N+ s/ G2 n6 _size_t hexStringToBytes(const string &str, byte *out); * {3 V+ @( R" Y: S9 m' L

$ h* a/ w3 n: P- ?. c#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
. g, s& j6 D  l: S+ l#include <vector>   T$ c$ y& ?% a1 x* R, j
+ w' A6 v; g5 ]) k  i- N$ O$ V6 O
using namespace std;
2 R1 z% l) t7 y
+ p2 V/ Z2 u9 M& P" nchar intToHexChar(int x) {
& c" b7 F3 e( G( [+ o    static const char HEX[16] = {
1 w% K& I) A( s8 `$ Q        '0', '1', '2', '3', - S# o$ f& l, E' x/ _5 R7 @0 X6 [
        '4', '5', '6', '7',
) W6 }+ x' u' u9 h; S: W- p2 M% O        '8', '9', 'A', 'B',
  B7 [, l; M# ~$ S$ t        'C', 'D', 'E', 'F'
7 I  y1 `# ~( Z; b  V, b    }; ) E* B' j" ^; O% n* P( D
    return HEX[x]; * F8 N2 R) Z% l$ ]  Y8 Y1 [
} 3 S& X( y- ?7 |! M

$ o) n- s$ b) Sint hexCharToInt(char hex) {
0 m4 J2 q. k! b- f0 I. Y8 @    hex = toupper(hex); 3 }0 x: a( Q) U1 f) A6 S; V
    if (isdigit(hex)) : c% ?7 [& [6 r$ O  n4 l
        return (hex - '0');
& N4 k; M5 {7 A- ~) M  f# l' F0 \9 c    if (isalpha(hex))
' l8 C+ H: {1 g$ k" ^        return (hex - 'A' + 10); # m( ^8 n  w9 F3 B# \4 U( C
    return 0; # O; C/ @* D# l* X
} 9 l# s, [) f; g5 R  l9 Y: o0 \
" V% c0 ~! A% j7 e; S
string bytesToHexString(const byte *in, size_t size) {
6 C. f' t$ K4 x    string str; . L; U! N  ^' ~# J' w2 b) w
    for (size_t i = 0; i < size; ++i) { ' K7 G6 w5 T) t
        int t = in[i]; ! ?4 ]. w% A$ B) H" S
        int a = t / 16;
& ?# m+ t/ i7 }: B, R1 ?: w        int b = t % 16;
4 B8 [7 l5 L) H; ^' ?1 g        str.append(1, intToHexChar(a)); , W; p/ q/ q1 e
        str.append(1, intToHexChar(b));
( B$ A4 O+ V' l/ F# p6 J& n        if (i != size - 1) / Q; n0 H( b, g- B" I9 D
            str.append(1, ' ');
6 I" ]) Q  ?1 |* S0 ^    } # ^. M' S/ ~4 [3 _' e
    return str;
1 L$ X& d3 S  p0 h* C} 8 z) J7 v, j+ K6 N1 H" k

3 g2 x8 D4 \5 n; R# S  ?9 Zsize_t hexStringToBytes(const string &str, byte *out) {
& Z' I% b1 ~. h& ]4 c. ]6 L
/ z, ?3 V+ `6 I" Y/ K    vector<string> vec; ; l! ~! F: {- ~: I
    string::size_type currPos = 0, prevPos = 0;
( U5 S6 A% J; {6 c    while ((currPos = str.find(' ', prevPos)) != string::npos) { ; s$ N+ n2 ~$ S; v0 k
        string b(str.substr(prevPos, currPos - prevPos));
4 v* X% M/ T  R* S  ^        vec.push_back(b); ' d0 Q* B$ U. d( s
        prevPos = currPos + 1; + ^, S6 f% U& N* E
    }
5 |; L9 e+ u  l; `. N& D: i    if (prevPos < str.size()) { 0 e" k4 U/ H( T' ]; N8 z
        string b(str.substr(prevPos));
6 G/ s  N7 i" h$ D        vec.push_back(b);
$ i# @, I9 }9 }; h4 H) p  c0 `    } ( _0 M4 j, X4 X0 x: [
    typedef vector<string>::size_type sz_type; 2 z" N& i! h( H3 m2 I1 z
    sz_type size = vec.size(); 5 h7 h3 Q% x- u! j! o- t1 {0 f
    for (sz_type i = 0; i < size; ++i) { 4 u. _- |3 y3 ?6 }: x% W
        int a = hexCharToInt(vec[i][0]);
, g4 I1 C/ E, k1 W  v& {8 H        int b = hexCharToInt(vec[i][1]); % K+ |/ S, V+ @2 }: k2 `
        out[i] = a * 16 + b; ' O+ @+ x  G: \: B  m: K
    } 8 U3 o# H4 S% H- v
    return size; ) J- L5 `( N  J. s9 m/ ]
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 5 b" V8 v1 T/ u& [9 b' c% b
#define TEA_H 3 T! ]# L( q) ]; s. V
8 p  d. d% b, H; D2 M% y) L
/*
  T  K3 b: y0 K- W$ ]! P*for htonl,htonl
) ^. Q1 p7 e0 H& O1 @7 I3 c. a4 f8 e$ ?*do remember link "ws2_32.lib" # k4 K4 f, M/ Z0 O; y* U8 m4 p% f
*/
. \" I( Y+ J; J$ @#include <winsock2.h>
& e+ g& I' x7 p& s" ]7 z#include "util.h"
. l. z& _$ v3 z: U $ Y$ v+ |) X$ p. R, G
class TEA { 8 m# U8 u" G+ Y
public: , _5 {4 L2 U4 g, |" a3 w# e
    TEA(const byte *key, int round = 32, bool isNetByte = false);
6 C8 V! U. @0 Q* |- S; H7 k4 q- w    TEA(const TEA &rhs);
& t; o, u. _6 i7 y6 ^+ w    TEA& operator=(const TEA &rhs);
# R; Y3 u! F" w: ]4 B" |+ _    void encrypt(const byte *in, byte *out);
+ P; ?# |6 A6 A" h    void decrypt(const byte *in, byte *out);
! z, F" B3 J8 k4 p( G8 ]# @5 gprivate:
6 Q! w4 W9 E3 J( J9 F    void encrypt(const ulong *in, ulong *out); 5 k$ D- b& F# r9 V( C+ m
    void decrypt(const ulong *in, ulong *out);
/ O+ V0 s" {, H( ^    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
) p/ E# a* O7 {+ i    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
0 a; l$ T1 _& r/ \private: 0 S/ B* k; z! K* C& |9 L8 G
    int _round; //iteration round to encrypt or decrypt
8 m) |! |# o3 Y0 a2 ?" f% x    bool _isNetByte; //whether input bytes come from network % g5 x! ^5 ^# H$ @% ^: L+ F
    byte _key[16]; //encrypt or decrypt key
  S5 {" J) R7 M3 I5 z+ m}; ; l( }5 F' N! N/ k
4 E" Y# A* j: l0 X& ~
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ! J6 d5 n+ V8 u: m; v% D
2 #include <cstring> //for memcpy,memset
% S9 f; d. A( s$ m6 A- M3 b% _ 3  / l4 \2 b3 n) |- O. H+ i; n
4 using namespace std; ) P4 @4 `/ S3 k- z3 _
5  1 `" Z5 D5 W0 e* S: \% A3 ^' _
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) + h/ ]+ u7 f. |! f4 f
7 :_round(round)
$ X1 I1 t* ?# @" e) `0 G3 V2 ^ 8 ,_isNetByte(isNetByte) {
4 N0 C5 x; u. F& k* s$ y/ y( f4 e) k 9     if (key != 0)
- A: }9 c) X7 O, a10         memcpy(_key, key, 16);
% z" d; r  P/ M2 c  }11     else + }- F& r- g" Z2 K  b% d
12         memset(_key, 0, 16); 8 P0 g  l' w8 b5 Q5 p
13 }
5 k+ v6 q1 `& b" M% v) j& e( Z14  
4 i: @! N. W! j3 X1 T15 TEA::TEA(const TEA &rhs) 5 _* x+ N4 a) w6 q
16 :_round(rhs._round)
* M" O5 U% r% P6 L7 S) w& q" d  _17 ,_isNetByte(rhs._isNetByte) {
/ h7 J8 {5 v8 |2 T9 `. n18     memcpy(_key, rhs._key, 16);
5 X1 T$ j+ {( B: Q( G; Z. f19 } 7 L; l2 n" X1 T. _
20  ' \  z  d$ M0 T) d% x
21 TEA& TEA::operator=(const TEA &rhs) { 5 z$ j: I6 K) o+ J( [+ l; {: Z* p) e
22     if (&rhs != this) {
+ ]6 A: S6 F' V3 r; p3 k23         _round = rhs._round; ; ]- B0 _$ f9 |6 I! _  h$ [% I$ n
24         _isNetByte = rhs._isNetByte; 7 p9 q. y. q( _! T
25         memcpy(_key, rhs._key, 16); 2 N0 `1 w7 _8 k/ q
26     }
7 u( R* R% u  O/ k  a- \, `27     return *this; + E) D* H: k: S6 N
28 }
4 I% S! s* J( O& }7 P6 d+ G29  . ]" u; o0 d" l$ y
30 void TEA::encrypt(const byte *in, byte *out) {
9 A' c" J4 I( J9 j2 I2 E$ ]31     encrypt((const ulong*)in, (ulong*)out); " w5 s" l" W0 c( @+ k7 O( h
32 } 1 w5 o) {# }/ ~' F  [5 y+ S
33  
2 x5 ]; U! t2 ^, C9 F; N34 void TEA::decrypt(const byte *in, byte *out) {
1 P3 H' y4 _  x; O) Q; e" i. |35     decrypt((const ulong*)in, (ulong*)out); ' M, p) p! d1 L4 M3 D- k4 o
36 } * N8 K9 U0 ]3 I6 r  T/ e
37  # C, B! f+ M- g5 ?- N; \
38 void TEA::encrypt(const ulong *in, ulong *out) { ; F) `" U8 s+ n1 ~! @2 X1 k/ q+ I
39  
* R) P/ [4 R4 P$ k40     ulong *k = (ulong*)_key; 6 }, e, L9 }  t4 m% [% [7 `
41     register ulong y = ntoh(in[0]);
9 ^8 V% E  x- \& N, y: @1 `42     register ulong z = ntoh(in[1]);
& C" {8 a' B4 A& S( U( g43     register ulong a = ntoh(k[0]);
/ A7 |% `4 _: Y6 Q! s4 X# c! h  s44     register ulong b = ntoh(k[1]); 1 x, d5 s3 P) m" E3 }' l8 v
45     register ulong c = ntoh(k[2]);
8 P4 O& d- I! K0 D& c" p; Y9 T! x$ w( S46     register ulong d = ntoh(k[3]);
1 D8 F" T) Z) x- e7 x47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ! m8 o8 a# k, @% `7 R7 ]# j
48     register int round = _round;
/ l5 P# [5 |% \' {/ P: k49     register ulong sum = 0; 7 D7 I% V/ s% W& S3 D( A
50  
& W' U1 @1 W2 f7 z& N51     while (round--) {    /* basic cycle start */
9 O2 z/ G1 k4 r) o52         sum += delta; * V9 B! z$ \* [- j- O
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ' E1 W9 p1 g3 z' C% u7 `  P6 P: I# t
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
( n8 n# a, }: H7 m/ X55     }    /* end cycle */ 9 l" {/ y" v2 H& a9 b+ n
56     out[0] = ntoh(y);
' n7 F* p5 b- ~* {; O57     out[1] = ntoh(z); 8 I) m- h5 n5 a! W% Z8 |/ _
58 }
3 Z% `( V$ z) |9 C, P" q59  ! W2 B0 g2 m$ u1 l- o) t- g
60 void TEA::decrypt(const ulong *in, ulong *out) { + V3 W9 A4 S, d$ X
61  0 Y3 B1 C0 N  c" q
62     ulong *k = (ulong*)_key;
/ m. @' K( ?( u63     register ulong y = ntoh(in[0]); " v% W" T' E" b/ ~; l
64     register ulong z = ntoh(in[1]); 3 _6 O" Q4 L  X) l8 T) D0 Y
65     register ulong a = ntoh(k[0]);
/ w$ h6 e+ u+ N66     register ulong b = ntoh(k[1]);
* r- _% k- U. [8 e' |67     register ulong c = ntoh(k[2]);
/ ~5 U2 L! a# z# L1 u! N68     register ulong d = ntoh(k[3]); 0 G& U# F; W+ j' {9 D3 c6 v
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ * a% f$ G+ P5 m" j  z, \" i
70     register int round = _round; : u# B$ H  Z3 k
71     register ulong sum = 0;
4 n7 L3 z6 T' e/ T72  
* O" m* t$ Y* r( j4 Q5 w0 K4 _" u' U: q73     if (round == 32) / n2 Z' L0 O. I' z; X# _& p
74         sum = 0xC6EF3720; /* delta << 5*/
$ \+ G6 o1 p# r8 w; Q! _6 i6 b75     else if (round == 16) 0 c* y; Q4 R) H( q8 c3 m
76         sum = 0xE3779B90; /* delta << 4*/ 4 I- S+ G3 X  r* Y& m8 }4 M
77     else 3 G+ G5 V: z; C, m4 }' R
78         sum = delta << static_cast<int>(logbase(2, round)); 0 G% B6 q: Z* n3 y
79  9 ]3 d4 e  }3 K- q7 w, ^' Q: j' D
80     while (round--) {    /* basic cycle start */ 9 t' Q1 E! Z- n, I: a3 r
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); / o2 a$ p& ~7 v  Q
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
" ~, p, b* l& z$ b4 G# C  n83         sum -= delta; 6 Y" L. K1 m! T# ?7 j9 N/ S
84     }    /* end cycle */
8 C* r/ W5 @" _$ _85     out[0] = ntoh(y);
# s: Q; @; F8 K) k86     out[1] = ntoh(z);
6 f; |* }% j8 h0 H- L5 u# N) `87 }) c% u- K4 E( ~( |+ |. r
3 G- [8 u* u8 T, `, s/ ]" F; O% d
需要说明的是TEA的构造函数: 0 ]: ?2 w1 W! b( g+ U
TEA(const byte *key, int round = 32, bool isNetByte = false);
4 h+ Z/ e1 D) V; p5 @1.key - 加密或解密用的128-bit(16byte)密钥。 * ]( w. B$ Y( P  ~
2.round - 加密或解密的轮数,常用的有64,32,16。
9 b6 n- v0 u: q+ a  o3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
% e" ]. o- e) R' \# P2 e: ^* ~/ n7 l9 ~
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" & K) r' D) V0 M7 o% r
2 #include "util.h" : {$ |7 @  k% {2 J
3 #include <iostream>
& o; [; ]: X# Z( e) X. ? 4  $ W& t- Y# ?3 R+ }
5 using namespace std;
+ J& V( g/ q9 `" K 6  # v1 O6 \2 Z- b. f% y
7 int main() {
! A- T* e; [" Y3 B 8  8 P+ c, G+ H0 w4 g0 A* ]1 O
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 2 v  O& o1 u! S2 J2 M4 x
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
3 Z* d. n6 R+ I# ^- P) _11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; % i) g# X) [& B% V3 ~
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
3 v/ ]$ f0 U- W) j9 `" @( m13  # F- P3 }7 a+ Y7 \
14     size_t size_in = hexStringToBytes(plainStr, plain);
) X. ]! u* P  X15     size_t size_key = hexStringToBytes(keyStr, key);
5 V, O4 M' t# Y1 ?( C3 P/ \( E+ g16  / s4 ?& G! y* N& q4 ^1 `
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
- W! O4 E- p# `; T% l18         return -1;
& v8 O( U: V* P19  0 }. ^' T/ ~% S& ^* ]: d0 g
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
! |! y8 O% y/ o- X21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; - A% I% _; w. k# \, B
22  * O$ y& c1 v  {( T
23     TEA tea(key, 16, true);
$ h/ D; ?5 j9 y- C) t$ F1 g24     tea.encrypt(plain, crypt);
. }. g8 w1 G. m$ _* h& W& \25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
/ K( e$ @0 b: ?0 B" g26  
. p9 Q# ~8 M) E- U; K: F" A% s# |, |/ T27     tea.decrypt(crypt, plain); 6 W2 M& {9 \( D$ @& D5 C& D7 B0 y
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; + H- n" `9 V% `5 m- O  a
29     return 0; / l. V: ]% s* @$ Y4 i* i. u) E2 g
30 }
; g& K6 R. Z$ n4 J3 ^- B) F7 m" V4 c& L) C) |) E7 W( K
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx$ [, i! f9 k& p/ C0 |
运行结果: * e( R0 t' Z7 H9 H$ n+ m
Plain: AD DE E2 DB B3 E2 DB B3
: Q: J5 t( j) ~5 [, |6 iKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
. {0 e  y/ w; }Crypt: 3B 3B 4D 8C 24 3A FD F2 " V) H/ b! C; ]9 U' ~" i" [; [
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-23 09:03 , Processed in 0.019406 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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