找回密码
 注册
搜索
查看: 37412|回复: 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轮):) C3 d8 `* W7 I! n0 n
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
) z4 A' _3 i7 E4 ?5 OTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
7 e% c  h# ^" M, U" s+ Z# D2 P7 g之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
: O. f6 g/ ]8 Z+ u在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
: q& K, t5 Y! f# U( y在 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. , \) X4 s" p% I# d
  2. void encrypt(unsigned long *v, unsigned long *k) { ( ^# S7 Y' m( P0 C6 j* J3 l
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ( E# D$ a) u# n. p6 Y1 A
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ' H! u) i- z4 H5 I5 M1 E
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ ! x: W6 S2 x: @) v, G8 C; v
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ # m- p$ J! ?7 @6 [
  7.          sum += delta;
    " i+ c1 q3 I( M$ Z% j) P
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); " _2 [! n. B4 \5 ~# W' o7 g/ L
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    1 b/ a5 v" m/ j4 ?5 c5 i& s
  10.      } 4 @3 _7 u  O' O; Z
  11.      v[0]=y; ( S2 z9 o- B8 f1 c6 D; E
  12.      v[1]=z;
      i* }* I1 y; j. k) D7 Q
  13. } & c- F- X0 u& p/ V
  14.   
    1 q% A0 C7 {: s0 _+ P
  15. void decrypt(unsigned long *v, unsigned long *k) { : o6 l) F( I. |0 z" X6 K
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ # u! v" q! I3 x+ ^1 L" r
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    / w+ U8 T2 k- Y5 J+ s
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ; k% E# c6 t  e) @0 T! B& Y
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    6 X2 I6 L: m5 ]& l% n& X0 I
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 8 n" Y! `9 z( b6 P) H% _
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    3 L% p# x' }' g, k8 P
  22.          sum -= delta;                                /* end cycle */ / s' _( S6 ?* q: b, R) [% e6 N
  23.      } . f! a5 W3 L' W! B1 y$ K; `
  24.      v[0]=y; * d4 w  S' l; _* R# g. P
  25.      v[1]=z; : M) g# Q) R- y& j0 }2 e) r9 t
  26. }# o7 Q8 s% Q8 |7 v
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
5 }( v1 g6 }# r8 J# x#define UTIL_H % h9 r0 C' U" \
; W. o- H' }1 ]% i/ w6 P% J& z; |
#include <string> 2 o$ r& n- }/ D3 t  B% m
#include <cmath>
3 |7 i; b  u* A* }/ [  d#include <cstdlib> ' m) X  k" ]) a$ P4 \
" q' H. r. F3 c- ~) u" k, n% }
typedef unsigned char byte; 3 p. t  p1 \# ^% C, o6 o% f
typedef unsigned long ulong; 6 ~3 |+ @) U5 [: c

% ~2 N) x6 ^$ _4 y! f3 oinline double logbase(double base, double x) { 4 `( S# M/ L+ I4 k' [+ M
    return log(x)/log(base); ' y% d' g+ H5 @- c. [+ m" g
}
1 _# W, e2 `. d6 T% Q" N ; _6 T* i7 G, \# F7 T
/*
0 z  P+ Y: A9 p" ^, ~*convert int to hex char. . P, P: p; K% R, j( h
*example:10 -> 'A',15 -> 'F'
! {# d' L. k, R  b( _  p*/ ; n/ E: U" \" g+ w' M6 k' C$ [9 K
char intToHexChar(int x);
; G8 X6 m. b1 ?4 g% Y9 d$ P# S
8 [' K: c$ H% m* s% G+ U8 d/*
$ K5 P8 V' K3 p' i- ~*convert hex char to int. ; l' ]2 ^5 l: X+ b' L
*example:'A' -> 10,'F' -> 15 0 W4 `9 `& L) l
*/
0 F+ ^6 T+ j, z: C) oint hexCharToInt(char hex);
) i* t  L. k3 p9 A $ K( v. _. A4 _8 q& x$ V- {
using std::string;
8 J1 _3 L. M7 o/* ; E3 a4 g  ~1 I9 Y, d7 e- N
*convert a byte array to hex string.
9 \5 X1 r" O6 ^! N+ W8 w9 t*hex string format example:"AF B0 80 7D" 9 Z) d" |$ a' n7 A, W9 ~6 [
*/
& ?9 y: r: M) e7 [. z1 r& {string bytesToHexString(const byte *in, size_t size);
' I  r/ q! @' n, F% Z* r" W: g , S; Y' ]1 q* Q' I
/* 3 Z0 J( m. H& E. D; N; e
*convert a hex string to a byte array.
) Q* ?& E* y$ `8 n0 d*hex string format example:"AF B0 80 7D" ! [6 m. G  c7 N: k, e# s
*/
  S7 p' d  B, {' |/ Psize_t hexStringToBytes(const string &str, byte *out); - t3 y# I4 F0 a9 Y
# m2 X. u: Y' \+ z1 F2 h! m7 z! k
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
& V* n4 s6 I1 T" }% N! f#include <vector>
: d# t0 Q% O* Y. t# A8 w, Y! j( p
7 s# a: D- O4 [8 |' dusing namespace std;
, M% Q6 r2 X# i" g
& ?$ y- s* i. \. U3 p' o/ hchar intToHexChar(int x) { - P: L, C1 a4 L& y+ F) O0 }( V
    static const char HEX[16] = {
% g" {- z' Q6 m& y        '0', '1', '2', '3', 9 e7 Z" F5 z, y5 ?$ s2 i5 j' N
        '4', '5', '6', '7', # d5 K: f" k" \
        '8', '9', 'A', 'B',
4 n: N/ K) j$ o) m; R& g        'C', 'D', 'E', 'F'
" l$ S) R7 s. p  b1 s5 H  @    };
9 _4 _7 |9 N1 Z' J, _    return HEX[x]; + D8 u* \% h/ R% O0 g! I
}
: m. X% {, \; `1 v, @
  d; D/ N9 @& S& N+ Xint hexCharToInt(char hex) {
2 p' w/ ^9 I0 T& Z& T: \% ?    hex = toupper(hex);
2 v) P: @0 G  Z& M- i    if (isdigit(hex))
  {; p, H3 D; P. x        return (hex - '0'); 0 L, Y( R2 M* `6 u7 d. \
    if (isalpha(hex))
9 E# t1 L5 x3 _/ Z& f( O& [        return (hex - 'A' + 10); & E4 ?6 k  c1 M) s
    return 0;
% r7 d; L$ S. E/ Z7 ~% a+ Z}
# f$ a' ]; `/ o; _5 ~ : W( U/ ^" V5 @
string bytesToHexString(const byte *in, size_t size) { - O3 u1 |2 ?6 o. B+ y/ s
    string str;
  K7 s* t, _- T7 }    for (size_t i = 0; i < size; ++i) { ) W5 m4 ?$ `. d1 i0 h+ g3 r  O
        int t = in[i]; 7 L8 W3 u+ s* b# f; F9 r
        int a = t / 16;
, L9 u8 i6 F! S1 V( }3 a9 u! _! n' b        int b = t % 16;
, C! k# E7 d9 _6 F        str.append(1, intToHexChar(a)); % m3 n" B; v- l: D. n
        str.append(1, intToHexChar(b));
5 H! M% E( r, E* m9 m' X        if (i != size - 1)
, B  r  ^, h, k  m0 n            str.append(1, ' '); : a4 t( h( J; L5 i. C1 ?% C# H
    } ) u! I  s% R; P" W* [7 T
    return str;
- B2 F" i3 Y# j}
- @. W4 w; j8 g  z. d# D5 S4 V9 f
$ J* r7 s& b3 T9 A' A/ z* L8 tsize_t hexStringToBytes(const string &str, byte *out) {   F& ~8 ?3 A% d) S7 W

: [: O( L. s9 w0 n7 J" q    vector<string> vec; , J0 o! b9 F9 b' V/ s
    string::size_type currPos = 0, prevPos = 0;
: Z; e, C& S# |) `: w6 W    while ((currPos = str.find(' ', prevPos)) != string::npos) {
9 n- z  k* s& k' E' C" [! c        string b(str.substr(prevPos, currPos - prevPos)); " U0 E0 P- L  r4 _3 x' S
        vec.push_back(b);
' I2 O8 W, l1 F( N2 U        prevPos = currPos + 1;
/ K1 u' X  ~- {+ {4 B$ g- Q+ U    }
1 g/ [$ R8 t2 O( j" R' z    if (prevPos < str.size()) {
& X2 ^2 Y  V3 `. `8 B        string b(str.substr(prevPos));
& W; K" h0 y7 d' {" ^        vec.push_back(b); . t2 o9 q+ y+ w  O
    }
  v- e, s4 F+ w; n# `% o    typedef vector<string>::size_type sz_type;
; x' q( ^6 b6 P* V: w    sz_type size = vec.size(); " A, k5 E! E* ]6 d: u
    for (sz_type i = 0; i < size; ++i) {
, _7 v; y5 I3 _6 E5 S5 z) O5 {5 W( `* f; H        int a = hexCharToInt(vec[i][0]);
! F% d! G  }  [        int b = hexCharToInt(vec[i][1]);
8 y& M/ d& _, o; o        out[i] = a * 16 + b;
% `' }4 M2 Y( f/ b    }
# X: I1 y% g) M# Y# N9 M) h2 b. C/ B. H    return size; 1 O" ]+ F1 A  j& m; B, j. E8 m: h3 t
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H * P2 v1 M: }5 ?9 `- M
#define TEA_H
- i3 Z5 h$ y# Y6 I3 n  ? $ M3 d9 q3 }% G
/*
, _1 f  a) d* Q7 {4 ]7 ]& @8 u*for htonl,htonl
- H# |( Q0 i6 `5 D; m, n*do remember link "ws2_32.lib" ; v- B. N2 r. A; r2 d7 t/ a( b
*/ : Y% ^2 N* N+ p! x$ Y
#include <winsock2.h> 8 c% N9 F- d1 o# j1 J, j# ?9 w; F
#include "util.h"
9 S* g, s; V) M9 _
: C  w+ i* j0 w* a8 }. P3 bclass TEA {
: m! O5 c! ]/ p4 Z8 b: j0 D# Jpublic:
. Y+ a; {1 e9 F( \  y    TEA(const byte *key, int round = 32, bool isNetByte = false); + m( C( `8 B$ q# b; M- L
    TEA(const TEA &rhs); # Q0 G+ p/ I# @! `
    TEA& operator=(const TEA &rhs); 4 A7 v' [6 D- ^3 x  w& y
    void encrypt(const byte *in, byte *out); & ?; u$ K6 G7 W9 v) g1 L
    void decrypt(const byte *in, byte *out);
+ v5 d- ?! t7 \% @1 p/ g& `, v6 kprivate: 7 m& x) H; M+ {$ b
    void encrypt(const ulong *in, ulong *out); % D* L  M7 i: ~' Q
    void decrypt(const ulong *in, ulong *out); ' s' T, _# I1 r6 G1 ]- F( h! N" O! n
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } " I6 j- c+ ~/ f
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } : f* g% ~8 r) ~$ Y) C4 g
private:
# z# s/ E* J0 c7 Y. ~    int _round; //iteration round to encrypt or decrypt
' C: n7 T& C* g2 r, i& V$ f/ U    bool _isNetByte; //whether input bytes come from network : V! H/ \, T' ?2 {# I7 e
    byte _key[16]; //encrypt or decrypt key
' V0 o: C0 E$ K5 }# S}; . a1 }8 m$ D! K8 u; x9 ~

9 v' m5 J' E4 \3 M#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
# J" o3 r) e/ l5 _. `; z; | 2 #include <cstring> //for memcpy,memset
! U/ w9 X* X8 l  ` 3  
  X$ }% o" z) w- g2 F2 L 4 using namespace std;
- w5 a# P+ F) @& m: U 5  : v3 K  B5 {0 w/ N2 P9 h
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) , f+ I5 L* X; `" `
7 :_round(round)
9 _; B+ `% `5 ]. R' m: B/ l 8 ,_isNetByte(isNetByte) { 8 {' H% z5 ]' s& ?
9     if (key != 0)
" R0 [& ]. t/ C$ E: f4 s10         memcpy(_key, key, 16);
5 O9 U. ]4 s3 G- r4 B. B- g6 T11     else
$ h9 Q% }$ k$ m12         memset(_key, 0, 16); 3 f4 b; S+ i2 r: D3 R! U* Q
13 } ( J6 J) q! s' z% f: I9 \
14  * f$ U& r% F6 }
15 TEA::TEA(const TEA &rhs)
0 f2 Z6 s; v8 r16 :_round(rhs._round)
+ h9 T+ R* U& J# _& I$ n1 t17 ,_isNetByte(rhs._isNetByte) { + {# v. Z! q0 P: k6 E- |
18     memcpy(_key, rhs._key, 16);
( w& L- s5 U1 ~& J% l! w6 t  K19 } . V8 N! r7 e: E8 T
20  7 \$ g; n3 p& ^6 P% t4 h' n
21 TEA& TEA::operator=(const TEA &rhs) { 7 x0 w' G; `, J
22     if (&rhs != this) {
( P4 I2 c5 _, N  I5 |& O23         _round = rhs._round; ) A$ l" B; x. P0 S
24         _isNetByte = rhs._isNetByte; 7 i& U* n( c8 X" H' e
25         memcpy(_key, rhs._key, 16); , j; @8 d2 U& @: v
26     }
2 t+ L( ~$ J- ~+ q. s( Z# ?2 d27     return *this; . L" s- }# a1 z+ ?
28 }
% y7 W# z- @6 b4 f3 M- |* V29  
8 J7 f' a* O. N5 r; e30 void TEA::encrypt(const byte *in, byte *out) {
5 P7 `+ k$ A2 {( m4 f! T6 ~31     encrypt((const ulong*)in, (ulong*)out); 3 E$ K1 l# a; u# v4 S/ x: d
32 }
/ W# g$ F, z6 m8 }) E6 W33  6 _4 X% a8 p; F5 n$ {$ C& T+ F
34 void TEA::decrypt(const byte *in, byte *out) {
1 D( }" c4 H6 Z" D! l- d35     decrypt((const ulong*)in, (ulong*)out); 3 K! |' v6 }6 R* k5 r
36 }
' h( Z2 V; ?5 E# T. D  H37  8 G1 \9 V: I8 L
38 void TEA::encrypt(const ulong *in, ulong *out) {
8 b2 s; A  u/ \. G& v2 H39  9 I1 H  H) i( P
40     ulong *k = (ulong*)_key;
# ]! a  E& C9 h3 T41     register ulong y = ntoh(in[0]);
: C' t  C( D) ?) U3 C+ o) v42     register ulong z = ntoh(in[1]); ' c% u2 a3 W) r; Z' x$ v
43     register ulong a = ntoh(k[0]);
+ Q9 W, K, y; ~# r2 |8 \44     register ulong b = ntoh(k[1]); ' F5 F% [1 P5 q" T5 |
45     register ulong c = ntoh(k[2]);
5 M# j, N; a8 p: U/ z2 t+ V46     register ulong d = ntoh(k[3]); ! ?( S* U" j  J' L6 G" u2 N- W
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ * g6 h8 A  U" y3 P: g
48     register int round = _round; 0 _. [( i/ O! _- ^9 u% D5 X( B
49     register ulong sum = 0; . e7 w; s# I  h. ?! q1 b6 W
50  ' P& d5 t( d) f' \- J. K% b
51     while (round--) {    /* basic cycle start */ 1 Q% q: c) O+ D, p3 t. n. R/ s
52         sum += delta;
  }0 E+ l. }8 H53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 2 b) Y; @- r$ g
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
- z$ D; P% t. m  w7 J; K( B. x1 A55     }    /* end cycle */
. l( H0 R1 b" L) t0 ~* k56     out[0] = ntoh(y); % T# k  w( ^+ q
57     out[1] = ntoh(z);
1 A* _/ A$ I* i58 } . A0 a# F& ~: b" p6 u7 }
59  ( |  y" M/ T. ^6 `9 y  H
60 void TEA::decrypt(const ulong *in, ulong *out) { 5 H7 j( ~& \8 H7 v2 q7 b) W
61  ' U* r5 {) ?7 w! l
62     ulong *k = (ulong*)_key; 2 g0 o# K$ `. T
63     register ulong y = ntoh(in[0]);
% |5 e+ ]- f8 Q8 t1 z8 t! T2 @64     register ulong z = ntoh(in[1]);
# Z! ^1 V' n1 b: g: j# ?6 G65     register ulong a = ntoh(k[0]); ; K1 E: k! y8 w! c
66     register ulong b = ntoh(k[1]);
0 x4 f% ~! R+ h" I67     register ulong c = ntoh(k[2]); $ A# b& `2 K) S2 T/ C
68     register ulong d = ntoh(k[3]);
; ]  J0 e! l% j0 B7 e2 I69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ * r, T0 [; R( H# X+ `1 a# j
70     register int round = _round; $ F2 |4 T2 u" s0 ?
71     register ulong sum = 0;
. u" L1 ]. p& h  P3 a* ?72  
0 R" G$ @4 w$ Z$ ~( Q73     if (round == 32) 7 D5 u" F' e8 \5 L1 n6 y6 A7 T
74         sum = 0xC6EF3720; /* delta << 5*/ % p3 q$ q4 ]! u1 }$ Z8 P
75     else if (round == 16)
" J8 C2 }, g) L2 i( Q4 N76         sum = 0xE3779B90; /* delta << 4*/
- N8 s2 k/ n) X, @& Y77     else 5 ?" J! s2 d, C6 Y. z( n! j; J& I# T
78         sum = delta << static_cast<int>(logbase(2, round));
0 h7 V# j$ Y& k$ t3 z79  ( }% m! {3 r6 D" ^- W# a0 b3 e. O
80     while (round--) {    /* basic cycle start */ # S* j0 L1 B/ o# q7 ^$ k# s. P
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); " n: _" p+ j/ s7 h3 c9 [5 U9 e0 A' k
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); : M  c4 A1 |- a6 j2 C
83         sum -= delta; 0 f( {( u* b+ _$ R& p& u
84     }    /* end cycle */
1 ]# v& f4 T! \85     out[0] = ntoh(y);
& _* O' u* z2 n% T* j4 c" ]& p3 d6 m86     out[1] = ntoh(z); 4 T  I% J3 i+ F9 E: K
87 }
- k' \( }# m. f$ k" N% |
* H: P) i* \/ l: i需要说明的是TEA的构造函数: 9 E, X1 Y. ~$ ?# \8 U
TEA(const byte *key, int round = 32, bool isNetByte = false);
8 {% j( X1 d3 u  e0 ?1.key - 加密或解密用的128-bit(16byte)密钥。
; T$ n5 _1 R( B. Z% q) d  O2.round - 加密或解密的轮数,常用的有64,32,16。   J: x! q# p7 [) x! u4 M
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 2 x# N0 h2 A8 S! P1 o8 m6 ]
8 C3 ^. |6 \& G" h
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
1 [  T' B2 l4 q( `# g 2 #include "util.h" 1 ]0 h# F; `4 U$ ^1 r
3 #include <iostream> 7 Z8 e2 A7 a- K9 X" O; Y# w
4  ! ?( B' _  |: L2 g) z
5 using namespace std; 3 Q4 V" |5 @+ R# p3 @% g
6  
) n, @! ^7 V$ r6 ]$ t, F 7 int main() { + U, a2 ^, h# U
8  6 q7 d. t3 S9 m$ v  }% R
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 4 w7 S$ i& V- T( J/ p' i
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
2 t" ~1 f0 N" G, c5 ]2 ?6 _) r11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ; C& }/ A! G) L9 F
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
" Z) r' F1 A$ ~! \5 A; p13  8 H# a& r2 j( ]& t6 q
14     size_t size_in = hexStringToBytes(plainStr, plain);
  _/ b* T/ V; ~) l# l- l/ F15     size_t size_key = hexStringToBytes(keyStr, key);
- f, f' y- N* V! H3 q  e- B; U16  . n' U, r# y3 p4 [% i9 @# Y
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
* W/ O  m/ V- a8 k) Z5 ]18         return -1;
% U) F- u% R. e( F1 o7 X19  
: [( h1 T/ w5 }5 b8 e9 x. _2 C2 @20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
. f0 {- O' J( ]. U# _21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ' w* O# f5 W6 k5 E$ m
22  
5 H; G/ y* d  {0 w, p  \% T23     TEA tea(key, 16, true);
" ]5 v  n# K& k+ E24     tea.encrypt(plain, crypt); 8 K4 D8 B: ?- d' o/ G$ f
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 0 \6 |+ l' X* @
26    P: F5 s& @. T: `6 V+ Z
27     tea.decrypt(crypt, plain); : f, d+ m& ]7 |
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) B2 M, K. n: E9 d29     return 0;
2 C/ V: t4 \  D, `* T0 ^30 }; B- A7 {, b& [; f! O
: _# y5 i4 z6 e6 O0 j# r
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx. P: ?# R. k2 t3 j5 |
运行结果:
! H* G: [$ q# J( z3 tPlain: AD DE E2 DB B3 E2 DB B3
! n) [0 g0 D. c! m! f$ k9 T( qKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
4 k& R) }3 J5 Z- MCrypt: 3B 3B 4D 8C 24 3A FD F2
$ u: O4 |3 [4 iPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 22:59 , Processed in 0.026330 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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