找回密码
 注册
搜索
查看: 37538|回复: 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轮):/ |$ I' p% A" T; X" ~
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。   G* }* q! o" q/ x0 Y3 e
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 * n' R4 W. X5 b: p
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 + ]6 n6 O# r' y5 d6 ^5 q9 e# K
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 / e/ V! S9 y/ N) `7 b/ j
在 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. + F8 S6 k. e5 c& J3 T4 N
  2. void encrypt(unsigned long *v, unsigned long *k) {
    1 g" D  l0 z( I! X; m0 K! d
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    & f. g/ @3 ^! k7 i" S; Y
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    / c: v2 f8 ?- y5 r9 n6 `
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    % `$ a. \- {. `9 c- V( x! G0 ~6 g
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    2 T5 t5 k! n" ^" Y
  7.          sum += delta; # j9 z3 H6 o! G4 {; ~) o# f( P
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    / i3 s5 q$ J0 o9 p  L4 r# F' T/ x
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 3 ~  H4 b$ y7 {3 M; k
  10.      }
    . {* l3 a" q! m) J4 c8 ^
  11.      v[0]=y; 5 K2 K% I1 l, L3 B
  12.      v[1]=z;
      k% F: g4 h! l1 }! N" [& }
  13. }
    , I; |: z6 [9 P
  14.   3 `2 f* _. |* M9 s* o$ C/ r0 Q
  15. void decrypt(unsigned long *v, unsigned long *k) { $ m& i, p" a( ^1 O. k
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    7 G% x) p. f5 s5 Y4 N/ ^# I
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 7 j6 s- q0 j4 g/ p+ M: |
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ - }7 v) C, F1 e1 f8 E, ]$ }
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    1 r2 ~6 ]+ r/ B, d
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    1 P" L$ c6 ^, O" S6 X- b
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); + g# C. L8 P& P0 \- z7 t
  22.          sum -= delta;                                /* end cycle */
    ) ]% I3 d3 R+ Q: V
  23.      }
    " B6 R$ z6 ^0 d8 K) o2 I; g
  24.      v[0]=y; ) {7 h0 X5 R8 F$ ~5 G' R
  25.      v[1]=z;
    ( [9 I; m* C+ l# {/ }0 A+ {7 g
  26. }0 U* u9 k5 `8 q, P. l
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
+ K' @7 _- [" ^# h, o& K#define UTIL_H
; ]9 k3 F! j' ^# n$ E1 y7 A+ k% X. |+ G  x* _
#include <string>
  L2 D* ]* I  t+ y0 F#include <cmath> 5 Y. G8 y' a2 b  P9 X8 |
#include <cstdlib>
7 w# ?. s" h( O# g" u * L8 ^5 ?5 T: Q3 z2 A) _  G
typedef unsigned char byte; ! h* E7 |( x; ]8 J0 S
typedef unsigned long ulong; 7 y+ e) ~: b& B) D# y" o

6 Q5 O/ ^2 O6 L6 h9 e4 Ainline double logbase(double base, double x) { , A: A7 Z. p2 O! y: Z0 K3 W
    return log(x)/log(base);
# r' g0 k, ?1 ?! V: l}
9 F. l/ g, D+ L
9 y. g: m# c, |( z/ J0 @/* : C5 x5 G5 n0 z  \. T
*convert int to hex char. + _! ?! A+ q4 c+ R7 A
*example:10 -> 'A',15 -> 'F'
8 C8 Z3 _9 G7 K*/
' H/ E& E/ q1 u3 wchar intToHexChar(int x);
# ~8 q6 s+ ]' f2 P# c. Q2 p
# D' b7 n5 R- _* Z# O. A2 K3 o/* + m$ @/ h! Y$ m. T/ \) H& E
*convert hex char to int. 5 C! L/ W; M4 b! y4 @
*example:'A' -> 10,'F' -> 15
, g! r- A& a# W8 R) y: `2 _*/
& A+ C, `7 ~. }; cint hexCharToInt(char hex);
" U, ?( y) u, z5 W1 s0 Z
/ k% b+ n8 _& F5 Qusing std::string; 6 c- w3 I" w& E7 {8 k( E& [
/* ; W! w4 H6 B( z( Y9 }! V$ z
*convert a byte array to hex string.   c: Z  Q  r% v, p/ n, z( p
*hex string format example:"AF B0 80 7D" 5 F, ~8 j0 @+ m+ K3 u3 D$ F
*/
& A+ v6 G) K" {$ Y4 s: L2 ostring bytesToHexString(const byte *in, size_t size); " l# u% f! C; @+ C  n

+ y* K' s  r$ p4 c/*
: V9 p) I6 G6 N  C1 b*convert a hex string to a byte array.
2 o/ m) z0 s" |*hex string format example:"AF B0 80 7D"
1 \) x+ b( l" e' G9 @*/
* y# w7 W. d' y8 c* T# Ksize_t hexStringToBytes(const string &str, byte *out); . M) ~5 }" I0 n' @/ b8 U+ Z5 p4 I

/ o8 h% e2 K: L" ]; l9 O. K#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" % O* \. z3 T% m: T
#include <vector>
; S4 H$ x4 C! t) V; s" X3 c
% a7 e1 z0 v/ Cusing namespace std; 7 }, j% {2 P3 O& D/ R! t5 P

& G  c! Y1 Q7 t" A8 a% y) [+ Mchar intToHexChar(int x) {
4 u  c! ?" J& u, h. ?% d1 A    static const char HEX[16] = { " O) }5 }& L4 V9 o, t
        '0', '1', '2', '3',
: z) ?' H; \1 j, G) T/ g% j5 l8 H        '4', '5', '6', '7',
7 L; k/ J" U* c( @; M        '8', '9', 'A', 'B', ) B, y6 D/ |% J  S; e
        'C', 'D', 'E', 'F' 7 L* d* f- L- f2 R
    }; ) D. R6 s# W* w
    return HEX[x]; : u* ?. t$ P, s! h. E& k" s
} ( j) _( G$ a8 v9 k; z/ u
0 E- G0 @! m! @* E5 ^8 X
int hexCharToInt(char hex) {
# z3 @2 Y0 C; m    hex = toupper(hex);
8 o; Z2 Z7 r4 ]0 T; T6 u    if (isdigit(hex)) # Q3 @3 f. P# c% z. o
        return (hex - '0');
. x8 V/ w  @+ m) |, o  V    if (isalpha(hex))
: b% H! x8 D6 n( `9 @        return (hex - 'A' + 10); * y1 j# c8 w8 I0 y+ A, j
    return 0;   k0 S1 ~) J( |! ~
} & v; q& _, k2 Q; Q2 s

0 _9 ^5 \* d0 j4 }% j0 O9 L- r. \string bytesToHexString(const byte *in, size_t size) { # m# a+ b, b- Z# d1 ]( Q- e% ?( m
    string str;
( L/ g" l9 J9 \5 f" e6 s    for (size_t i = 0; i < size; ++i) {
+ ~% H1 y6 G, G% U  F) C        int t = in[i]; % g3 r; w) _; _8 a* |1 E
        int a = t / 16; " ~( u7 ]$ y. Y
        int b = t % 16;
3 ~% L* g; Y5 O1 I6 b6 j# D1 m        str.append(1, intToHexChar(a));   X- x& D1 |9 N! Y6 D
        str.append(1, intToHexChar(b));
3 c% ~+ e' b* L. F/ B' h        if (i != size - 1)
+ r+ `. n& g  ]9 e            str.append(1, ' ');
8 o7 O. e( l/ r2 d3 t6 y2 z2 u$ t    } , X3 |! w4 N$ `
    return str;
& ^6 G/ `9 ^$ I} ! u1 w9 b6 }# K& Z/ K

$ n! K% D- B: x" G" `5 g, Y0 ^size_t hexStringToBytes(const string &str, byte *out) {
& p) f: ?+ i3 G3 S
1 @0 ?/ Z% Y* P$ E5 g/ \. L1 L    vector<string> vec;
( _6 j0 Z( e) j4 i, K! r    string::size_type currPos = 0, prevPos = 0; % g5 x3 z! k1 q
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 4 z4 X1 d  I' D- T7 P
        string b(str.substr(prevPos, currPos - prevPos));
6 r* W( p7 ?! P, U0 P. O- h        vec.push_back(b); ) o% s- n- L" Z/ Q
        prevPos = currPos + 1;
1 f/ I* Q, p* R" N6 K  r* E0 v    } $ s6 ~6 a% R& A4 r- q
    if (prevPos < str.size()) { $ n' R7 }8 T7 m" p
        string b(str.substr(prevPos)); 3 M9 d% w9 T9 V1 c
        vec.push_back(b);
; e3 ^# |$ J6 z9 E: y2 P/ _, @9 `. h- v    } * @- J8 x' N( D
    typedef vector<string>::size_type sz_type; $ w" G7 X8 f- l* ~7 Z  X8 D4 t
    sz_type size = vec.size(); ! \, C% F6 y/ R7 c: ?& U. H+ J" ^# X( s
    for (sz_type i = 0; i < size; ++i) {
  E5 M8 C6 U; a" X$ [7 Q+ m6 ^        int a = hexCharToInt(vec[i][0]); / x( P7 i1 ]9 `; |
        int b = hexCharToInt(vec[i][1]); , ]: X5 G# Y! i7 J/ a' d/ E  }
        out[i] = a * 16 + b; 4 l0 i# c6 k( k
    }
  J* v# |4 a! E' @; J$ H    return size;
0 l6 y2 e- t5 D1 e( j}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H : Q: K& D, v. j+ N/ }
#define TEA_H
3 r) ?  @( ?: I/ c. U1 j  }/ k* h: d : {! \6 y9 g4 M" }+ p8 D
/* ( v/ e: r% T  w3 D4 a
*for htonl,htonl
+ l% B$ T! S% M9 r8 F/ U  ?1 S; J0 @*do remember link "ws2_32.lib"
6 ]% p8 W! g5 o0 A9 |*/ # n3 u  {& ]8 R5 R# N  }  u! [
#include <winsock2.h> 3 }; l3 p5 ~  ]3 C1 s
#include "util.h"
4 [, R8 z8 ?& y* ?
9 J" p) r' C* Q/ C: o9 j; Qclass TEA { 3 e( F, Q; L! q) i- ~- j
public: ) |& z9 m2 P* o& y5 V# n
    TEA(const byte *key, int round = 32, bool isNetByte = false); ) h2 g( I1 W! j" r
    TEA(const TEA &rhs);
" s. w! E' l; M    TEA& operator=(const TEA &rhs);
" T8 {: R! U7 G2 P0 \" T4 _# b    void encrypt(const byte *in, byte *out);
' I7 G+ e6 n; ~    void decrypt(const byte *in, byte *out);
* c% v$ |6 y. l) ?- H2 Q; }. K5 Fprivate:
2 {, c6 b0 _# B; U    void encrypt(const ulong *in, ulong *out);
5 ]: L" @# X" {  f( c5 x) C    void decrypt(const ulong *in, ulong *out);
4 T% V$ r0 y% P; ?1 u3 R    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 3 L8 l: j# N: ]4 a% x
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } # q+ y4 q% Z9 p
private: 1 h( a0 _/ W! `/ V, e
    int _round; //iteration round to encrypt or decrypt - b! T. M* d& j& C# `
    bool _isNetByte; //whether input bytes come from network
% O1 c8 [0 p+ N8 [" B    byte _key[16]; //encrypt or decrypt key
% b$ t8 G$ ~2 ~4 q' b}; 6 o) Z7 K1 g( x% Z/ F% F" k
, R: w6 F; V/ x( X$ p  ?6 @
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 9 I2 d- A* j5 t+ {
2 #include <cstring> //for memcpy,memset
* a# H4 R. s5 }$ M# ~$ A 3  
) y! M0 [$ ~* f4 Q7 y 4 using namespace std;
1 B& G6 B4 Z* p 5  
% m7 i+ u4 d! B) V' Y 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) . [- |) i) H: l& k0 b% m
7 :_round(round)
' R' F1 {! j9 v$ \# @4 @ 8 ,_isNetByte(isNetByte) {
6 s# M1 A* d6 O 9     if (key != 0)
# R$ w7 I9 `& k* J1 q1 y  i+ Y$ V10         memcpy(_key, key, 16); - k7 Z! F, R5 h. n" _
11     else
+ `& s# d- u3 ^6 K5 U12         memset(_key, 0, 16); : ?6 u& b7 z* _! m( S$ F+ m: l0 @
13 }
3 s$ k9 S: s8 h& ?14  8 ?& @; f) a* w( g2 F. D
15 TEA::TEA(const TEA &rhs)
# W* l5 s# h# ^0 x- `4 h16 :_round(rhs._round)
2 A' K7 ?$ E) Q8 o9 {2 J4 z# D& U17 ,_isNetByte(rhs._isNetByte) { * f! s8 Q, a  P$ ^
18     memcpy(_key, rhs._key, 16);
  O: d6 L% v, ^19 }
2 b- w9 U8 b) l/ O20  
+ X) o5 S3 W3 Z; v; o2 w21 TEA& TEA::operator=(const TEA &rhs) { 7 X  b1 D0 E+ y1 J- U
22     if (&rhs != this) { ( n' @0 _0 e' Y$ w  ~1 G. i" s
23         _round = rhs._round;
8 |  \1 f- p2 S; m5 N24         _isNetByte = rhs._isNetByte; , Y3 [, J+ I$ [
25         memcpy(_key, rhs._key, 16); 6 R0 V5 a, D' v. G
26     }
) E' f3 G, J/ p4 d: ?8 j27     return *this; 4 _& P9 `+ _" [6 v4 p  A6 S
28 }
5 _2 y1 F0 B6 W& J4 i" K29  
' [1 i( Q; x3 |4 E" x+ X30 void TEA::encrypt(const byte *in, byte *out) { 3 E+ A' q. D$ ~; i* H" N! O
31     encrypt((const ulong*)in, (ulong*)out); , D; B; c& Y; ?6 Y* p4 @
32 } 8 T7 {# m# k  W9 B7 s; D
33  
* Y" @6 [1 A0 J" l+ O34 void TEA::decrypt(const byte *in, byte *out) { # D+ }6 Q& [& h: e( K
35     decrypt((const ulong*)in, (ulong*)out); 0 R' o1 i8 ?+ M- d# L! F7 y
36 } ( c9 e( v6 T* k9 ?
37  : R4 |/ x: [. p2 z# e1 |
38 void TEA::encrypt(const ulong *in, ulong *out) { 6 g* z9 |" F, h; e' ~4 S
39  
) O" m0 x7 q1 k% C7 u+ a$ C40     ulong *k = (ulong*)_key; 2 b& J. c1 }0 M* a; H, e" e9 D* K3 e
41     register ulong y = ntoh(in[0]);
/ \9 x9 ]( M3 ~3 t2 y42     register ulong z = ntoh(in[1]); 5 h7 V' @! u$ C" ]1 }9 X  ?
43     register ulong a = ntoh(k[0]); ; O3 ^+ T% }: }* b
44     register ulong b = ntoh(k[1]); 5 A% Q: e7 |- [3 i* M3 E& m
45     register ulong c = ntoh(k[2]);
/ C+ ]$ A: P, Y46     register ulong d = ntoh(k[3]);
; ]! M7 s9 h3 H& _3 |47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
1 H% E( @8 Q0 X) S48     register int round = _round;
8 e4 A0 m( s) g& j# @49     register ulong sum = 0;
. ~* y( H% {& y7 i5 |* R50  
+ V# S7 q; `' x/ w; {2 u9 @. E51     while (round--) {    /* basic cycle start */   Q* X- v. `* F# I" h
52         sum += delta;
1 x# U( j& ~/ t' g53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ; p; N8 P4 U$ m  s% N8 t* A. W0 `
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);   y+ n/ X1 `" O6 l5 N; t; }# G; p4 s, c
55     }    /* end cycle */
. `+ U8 S2 t; k: y! Q& R0 j. x56     out[0] = ntoh(y);
  `: c' T9 B' ]57     out[1] = ntoh(z);
5 A" w8 c6 M& F( j" O58 }
2 N' q( m) n; `6 f# U59  : h5 c- K% y7 H: q6 f3 W4 `; _
60 void TEA::decrypt(const ulong *in, ulong *out) { , `: m+ F! C  K/ P) L" C
61  : t  A0 K; B. Y2 P) Y: E
62     ulong *k = (ulong*)_key; $ _" r2 c6 R$ M, R5 x" p  i
63     register ulong y = ntoh(in[0]);
2 f- {, b# _, W- O' F0 ]64     register ulong z = ntoh(in[1]);
; x" J: g$ F+ ]65     register ulong a = ntoh(k[0]);
  |# P3 m- Q( @, N- L2 `- A66     register ulong b = ntoh(k[1]);
, T$ w4 n. u9 ]1 p% E+ R67     register ulong c = ntoh(k[2]); 4 [  K% ~6 ?$ q* K9 B/ g9 p/ y
68     register ulong d = ntoh(k[3]);
. A0 \$ r7 j  Y; d69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
" N8 R# n+ B' w- ]+ a1 o70     register int round = _round;
$ c% a4 n9 z4 W; `) f  B/ L7 t6 G71     register ulong sum = 0; - N3 P! ~+ f. m
72  4 R: y: Y8 }0 B3 }# Z) f
73     if (round == 32) 2 Z# q) S* z. E3 ^' E5 V
74         sum = 0xC6EF3720; /* delta << 5*/
- E. L# M# b6 T5 D$ V, f2 C- }75     else if (round == 16) * d! G0 }8 Y( J3 E4 e
76         sum = 0xE3779B90; /* delta << 4*/
% U* d5 j, m/ w- R: J* o+ r- ^77     else 9 K# X/ e& g3 C- |$ y% r
78         sum = delta << static_cast<int>(logbase(2, round)); % I& O' ~, p- u' {; b' v
79  0 z& m. y" ?( N% _9 t
80     while (round--) {    /* basic cycle start */
! j7 D$ v5 }) a81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
9 @3 S; m; K+ k. c% }5 d82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ( I4 E& s  I1 ^# {- x
83         sum -= delta;
' V- G% J; f2 n! {8 S6 }84     }    /* end cycle */ , o5 [: G+ o2 Z" f, m
85     out[0] = ntoh(y);   e: A  P3 \4 P7 n
86     out[1] = ntoh(z);
. t* Z) A4 \8 L5 J87 }
. l5 b2 g; _! |8 y
/ S6 y' d/ f2 b% u+ e& o7 s+ k需要说明的是TEA的构造函数: 7 ]" j) v! D/ l) J" X( j9 q: p
TEA(const byte *key, int round = 32, bool isNetByte = false); 2 H+ Q+ W3 m3 v4 j6 Y
1.key - 加密或解密用的128-bit(16byte)密钥。 " e: u$ _, C+ ?
2.round - 加密或解密的轮数,常用的有64,32,16。 ( H9 r# U+ H8 \0 q( ?1 D
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
; r. }: q- A- r# B2 \# h# ^
: t% o4 J* C" N" s" g& ^& T最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
' q2 ^. i1 v/ K. |/ f  v 2 #include "util.h"
  I, ]3 B0 b% F0 n) y0 S/ R 3 #include <iostream> & U) }- t# S5 P2 R
4  0 F- U) b& P" g) t" j* ]
5 using namespace std; * J5 i6 |$ q: ~( ?% H
6  
8 q5 O3 _) T; u 7 int main() { " T6 k+ L/ u; _. R4 x4 z7 D( v
8  / n/ k% d: x. N5 l  u) J- w2 a
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
6 H, r. D' A7 T; j+ H* x10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
, m$ A: o7 n8 d" }! p11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; + K' _+ \" g' g* D9 f4 x( s
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; - j: h# H$ ~) \  b' e  T3 l
13  $ M! H6 P& i" _7 c6 i
14     size_t size_in = hexStringToBytes(plainStr, plain); 4 p2 y0 i  C( K8 N
15     size_t size_key = hexStringToBytes(keyStr, key);
; f: [5 u9 j! p3 J' O/ {! c16  , X  Q& l8 F' c- U8 a, n6 T
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
8 D& T7 y$ @1 I7 i+ x% S& j- |18         return -1;
5 u; a! _7 O4 y3 B19  
% L+ s% O( [) y4 N20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
) B( A7 s7 C5 U) |, v7 G21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; & w' V$ s& ?% Q8 S: o
22  
0 m; X* K+ W0 ]5 u) h' q23     TEA tea(key, 16, true);
7 h% d% w% b7 ~9 C4 c% ~24     tea.encrypt(plain, crypt);
, y% u* ~4 J. H" X/ ^9 Z25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
6 x5 g+ Y+ z+ a1 A1 [26  " h/ C) o; K/ H, P7 S3 S) j
27     tea.decrypt(crypt, plain);
; v* t' w0 M- l1 c* A0 f% T28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
& D: i( ?5 H  e) j$ n29     return 0;
9 b2 L  a/ p5 G# B& k( h8 {" M30 }$ B, I; R( q# i  c  Y+ X
: z4 [3 J. _7 ^* p+ U
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
& u6 V7 n2 I& @3 `# _; |- j; ]运行结果:
6 r) P1 a5 W8 X7 b1 h5 u; J$ j9 q) aPlain: AD DE E2 DB B3 E2 DB B3
5 \; L. F  U& O1 F1 Q8 \Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 % ?1 @: C5 G0 h0 H
Crypt: 3B 3B 4D 8C 24 3A FD F2 " g/ s: l, Y/ r% I  y. B' Y( J% U
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 22:51 , Processed in 0.022482 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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