找回密码
 注册
搜索
查看: 37336|回复: 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轮):9 O+ V$ K2 T' R4 {
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
; V# e' t/ J+ ?, c! ?" wTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 # H& k! a! ?+ e& X! C
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 , `% Q2 h& Q. E+ h! L* w
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 + R1 A+ y* ]* J! b% z1 M4 V
在 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. ; w- C6 p4 Q9 G, W0 c
  2. void encrypt(unsigned long *v, unsigned long *k) {
    - S0 P( @& s9 |0 v
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ / _' G& k; k4 `/ M+ Y4 z
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ( D3 C. i& S, k7 z8 d
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ ( y% C, y, j& Z3 }' h3 R+ B
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 0 j- B2 ?6 O- ]( _. H" r/ \$ p
  7.          sum += delta;
    # ~8 v! L  h: |& f! \  j% d
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ( n& L* z2 _0 Q' C9 }, o$ T
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ' H& U( @! b, O- P$ \
  10.      } 3 r, o" Z; E; C9 R, o
  11.      v[0]=y;
    + L/ z$ b% y! k" p0 N
  12.      v[1]=z; 2 w0 L& ]! w' _
  13. }
      I, D0 b! [$ l  j' G6 c: u+ B
  14.   4 g, F0 q9 n, l8 B% Y; ]$ s' }- w$ t- t
  15. void decrypt(unsigned long *v, unsigned long *k) {
    7 b1 ~6 {7 T$ i; G
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    & G- f; Y3 w4 v
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    - C7 |: m' l- a+ I( b) \
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 4 |6 B! g& [. ~3 }% e) Q" C
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    + K! ?8 {* Y7 M( X9 V, W
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); , h& n/ j" q% C9 o7 v
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ m+ B4 ]3 @; @, l+ J: a5 \0 s! ~
  22.          sum -= delta;                                /* end cycle */   |/ ?+ o+ W4 s2 Y$ U
  23.      } - s! l: Z- \  C& x8 F9 o
  24.      v[0]=y;
    ! j4 [1 f5 E+ y0 X- p
  25.      v[1]=z;
      R) o! {& _! O- I% w; U$ l
  26. }
    ! x2 @9 Z* |% N1 l+ A8 ?1 [
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H : O+ U2 p. E% K5 J; @0 H
#define UTIL_H : Z. Y+ E6 V* @' V

4 u6 y$ e0 Q% t$ i: {#include <string> 0 r' b3 e' y7 o8 D
#include <cmath> 4 f2 s7 I  _) n1 v( D1 ~
#include <cstdlib> ' P; I" S' {  D' d6 N! g3 l
& w( I/ f' j" Z0 x) t9 }1 q5 D  e
typedef unsigned char byte;
/ S5 U; f+ c+ utypedef unsigned long ulong;
& T4 Q% Z. G5 ]
% `4 J: F$ x; o$ d) ~. W/ a# Uinline double logbase(double base, double x) {
2 l+ S+ [& ?& l7 n* I2 m    return log(x)/log(base); " I1 {4 N" T/ \, \; m
} + K# c, {7 y$ M( Q

- W2 y5 K* b9 i- [1 \: A, R/* 8 \/ N0 V. @1 a' R- |9 D
*convert int to hex char.
- t+ b+ M9 R4 J( H9 h7 h( A*example:10 -> 'A',15 -> 'F' * B2 s+ i- i; R
*/ 9 j2 K& }4 W+ a! @% b
char intToHexChar(int x);
$ t3 U& Q" g5 O( H
# r7 x2 ]) [) t% e' x/*
# t  ?7 C3 {" F" x' f*convert hex char to int. 6 o, t* `: I7 {/ s
*example:'A' -> 10,'F' -> 15 8 T  W. S+ q% f- f$ [+ Z
*/ 5 o" a7 I3 Y6 @. Q. r2 @
int hexCharToInt(char hex); 5 `+ o. X9 c7 @( c

5 {5 Q2 m2 G" lusing std::string; . f: I$ t. \7 ~: p+ Y& B, Y# J0 I1 X4 ^5 }
/* $ W; b1 F; d3 O7 w& q8 W7 c
*convert a byte array to hex string. 3 e8 q0 k2 p+ L2 H8 ?' m% c& A# T
*hex string format example:"AF B0 80 7D"
* W9 k8 Y1 t$ i* K. J*/ 8 O$ s, Y; u% Q& d6 T; U9 a
string bytesToHexString(const byte *in, size_t size);
4 s7 O6 a* c' f3 m- {, p6 V / Z" x6 K8 P7 o; A& r
/*
; ^6 S' s; \* ~*convert a hex string to a byte array. & k& S/ T$ H2 h* Z! k, d
*hex string format example:"AF B0 80 7D"
% C7 j0 S# M3 C*/
; o  v; ?- I: G2 Ksize_t hexStringToBytes(const string &str, byte *out);
5 @% s) H3 c; x8 {) P 6 B- O* Q; Y: ?# J' J7 c7 G' s& `" j( Z5 H
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
9 A" `) B+ d% k7 V5 l) v#include <vector> + \, ^/ F5 F* q& D. j) v4 O/ E7 y
8 p! w$ F( a7 P" q
using namespace std; 4 d& m, f0 P/ h2 D7 }; f
0 V! P5 [% {  O8 k6 [* A) a
char intToHexChar(int x) { 0 O$ w8 O7 _4 d7 c% l  ^$ x
    static const char HEX[16] = {
% U8 Y- l- q6 {6 G        '0', '1', '2', '3', 5 d% e; {$ K; K% d5 ~
        '4', '5', '6', '7',
. i0 o- {- X8 ?        '8', '9', 'A', 'B', ' a. \9 `" G1 `* F5 o9 ~  W% S
        'C', 'D', 'E', 'F'
3 P. Z3 o! i2 r" {4 B: `    };
6 w. t7 M$ |' [# \    return HEX[x]; ! ]6 y# j8 R3 I$ e8 B
} / I7 \0 |5 l$ L" g$ M0 W; B) y
+ d5 k1 g% G' I0 @& j* d
int hexCharToInt(char hex) { & Y. z3 N: u: O% M4 N5 V9 w1 c' Y
    hex = toupper(hex); 1 f; t( {+ p; d( b8 B3 H( c
    if (isdigit(hex)) ' q$ g% G8 C, x; H6 x5 @, |/ c
        return (hex - '0'); , L! R, y4 C0 Y" s
    if (isalpha(hex))
- u: q, r! w# T( B2 e" i        return (hex - 'A' + 10);
7 E+ M. A9 C( s    return 0; 6 A; w7 P' b- b- m; A. n" n
} 4 |7 Z9 r4 K4 y0 b/ t. W

+ N  L5 T. v2 L4 wstring bytesToHexString(const byte *in, size_t size) { & _, k. v  f4 v
    string str;
$ z& \7 _. U# Z9 I$ C' t# z    for (size_t i = 0; i < size; ++i) {
* R* y; |: k3 ~  K" a        int t = in[i];
% Q8 x! M, B  j/ t% }# v        int a = t / 16; & t+ L5 o% U7 G& l
        int b = t % 16;
$ R1 h% i1 F! ]8 e        str.append(1, intToHexChar(a));
* @5 M( o( ]. a& v2 n7 ]. M- G2 _# ~. x3 E        str.append(1, intToHexChar(b));
$ A/ Q- g% R4 N0 y; N        if (i != size - 1)   X2 O" A0 d2 v& _7 T4 \5 W+ ^0 n: C
            str.append(1, ' ');
8 F6 c# k" @! m- f6 @8 T* J4 b    } + Q- }$ J5 i$ c) ^: p+ P
    return str; + b$ t5 c9 z0 |: M, ~* ^
}
+ t( Y4 C4 r) C2 Q5 H2 r ) K: G# j$ W. P% J  f
size_t hexStringToBytes(const string &str, byte *out) { 4 P; M; V1 |3 }

. g5 u7 p6 R% N- o. {    vector<string> vec; 6 m; \  E( R$ Z9 \
    string::size_type currPos = 0, prevPos = 0; ! W- ]5 D# _  H7 ~
    while ((currPos = str.find(' ', prevPos)) != string::npos) { . H" ^) D; d" d5 ?0 v
        string b(str.substr(prevPos, currPos - prevPos)); 9 H" P1 U1 w. J/ w- Z+ I" U
        vec.push_back(b); ; V% I; u9 B9 }9 {+ s4 _
        prevPos = currPos + 1;
) D& h, B# `) P. T    } 9 a2 a/ e  ~$ [6 v
    if (prevPos < str.size()) { 0 B. e7 A8 I, u$ u
        string b(str.substr(prevPos)); ( h7 J. G3 G+ K2 i" x6 ^
        vec.push_back(b);
$ s" _0 u" _! K4 |, @    } & g/ b5 G, P8 S, _3 c8 T
    typedef vector<string>::size_type sz_type; ' @) r$ U/ U; T3 q4 x1 Y
    sz_type size = vec.size();
/ ]3 ]$ b/ P- ?) \    for (sz_type i = 0; i < size; ++i) {
( v* M7 @  l* M* l3 ~6 {* R+ S: s        int a = hexCharToInt(vec[i][0]);
" k3 p: ^" S8 W! A6 U) A2 K& h/ I        int b = hexCharToInt(vec[i][1]);
5 P/ O. j0 H. B7 `        out[i] = a * 16 + b; ; U6 e6 `4 }. n2 s$ D
    } $ [( d7 E; c' a2 u
    return size;
6 A+ @0 E% U+ q5 j: A}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
6 V- J" b% I+ G: a& A% Q1 a4 I" y. [#define TEA_H
3 l/ s' }! q5 Q6 W4 G7 G; G 0 d6 o+ z" e* R- t9 i
/* : n& b* U4 D( a) t5 x9 g
*for htonl,htonl - u3 l4 i) f1 n, @1 ~, h! z
*do remember link "ws2_32.lib" 5 ~2 V" n9 D+ P; Q' M# K
*/
; O' Y# N4 R! l#include <winsock2.h> : f2 Y: g% a! \0 Q% y  c
#include "util.h" 8 Y, f  h. x# `. D* I: m3 s

1 o& R6 P5 \6 Q$ u1 d1 S* ]! L( Gclass TEA { 4 n9 A3 l/ V, `4 S& T. p; C. Q
public: 1 Z3 @( g5 z6 s) E+ O
    TEA(const byte *key, int round = 32, bool isNetByte = false); ! J( x5 w6 }; |8 ^1 S& O
    TEA(const TEA &rhs); 7 d4 [$ T4 i- ]; Q: [
    TEA& operator=(const TEA &rhs); & m. T4 p% k) C  M5 s3 p
    void encrypt(const byte *in, byte *out);
" c  Z0 z  D+ w6 N    void decrypt(const byte *in, byte *out); 2 o- R: Q8 r( z1 `: g. U
private: - |2 Q) t3 d( ]- t
    void encrypt(const ulong *in, ulong *out);
9 \# o6 M8 w+ Z! \6 V- z, d/ v, y    void decrypt(const ulong *in, ulong *out); 4 H8 |$ Q2 i5 k5 s+ z5 |
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
. a2 |  r- R7 N; Y    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
1 ^2 t2 y4 X9 O8 W6 F# n: [private: ( V( z6 J! i( V! c; P) D7 h
    int _round; //iteration round to encrypt or decrypt # z8 M2 V9 D. P, S0 B
    bool _isNetByte; //whether input bytes come from network
" }; Y0 e4 h* s2 j    byte _key[16]; //encrypt or decrypt key
& v" |) O2 M4 G. R};
4 `  y3 U" E9 j( D9 ]  p : z( a8 {4 D! o4 Y; V2 P: c( x" z$ s
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" + F! T" G5 K5 ]4 h
2 #include <cstring> //for memcpy,memset
' t$ G) s! g* f8 U7 t 3  
; [8 k7 `- q' M8 B# O6 X 4 using namespace std;
0 d( c5 |# ^7 u( A 5  5 g  x9 Z' X, @! i& c3 T, P
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 0 A" E2 c. y; O2 v; ?: }0 j
7 :_round(round) . k1 x& g% j( w9 g& o
8 ,_isNetByte(isNetByte) { ( }6 v2 M3 `7 m; b
9     if (key != 0) # m  y; S6 m  ^' E
10         memcpy(_key, key, 16); 3 Y1 k, N, k* g/ p0 m6 I6 o
11     else
+ K7 X5 Z5 [( ?/ d+ b- ]12         memset(_key, 0, 16);
% p% V9 r- ?* O13 }
0 R/ D8 _7 |( x* ~# `14  & K. x, k: g, }9 _2 X' C
15 TEA::TEA(const TEA &rhs) 7 j! k: U; J( |% p! P9 |
16 :_round(rhs._round)
& V& E) S" P: a17 ,_isNetByte(rhs._isNetByte) {
& z; u, {+ u. j5 U18     memcpy(_key, rhs._key, 16); / T6 M; M( {8 c0 K' v8 ?
19 } 0 X: K4 [0 l) `$ _4 i1 G
20  
: w5 f7 r$ Z( F* b' l* p/ J4 p) s4 c21 TEA& TEA::operator=(const TEA &rhs) { 3 T( h4 t5 g0 m8 Q+ w
22     if (&rhs != this) {
7 g; }& ~0 v5 P0 Q, u  O) v23         _round = rhs._round; * S# c, y! ~. |
24         _isNetByte = rhs._isNetByte; # t# u/ ]6 x- n0 P6 Z3 Y8 R1 j
25         memcpy(_key, rhs._key, 16);
# Z. h: g, X7 {4 c26     }
* F+ o5 z; P0 T  X$ V1 \" D27     return *this;
* d3 E0 {) X7 e1 Y: S6 x28 } - j" y& m( R" }& y& a- P
29  
9 u  }; p, X# h2 ?3 j# z30 void TEA::encrypt(const byte *in, byte *out) { & s) A6 w4 }; }/ ]: T; Q
31     encrypt((const ulong*)in, (ulong*)out); " f4 p" M2 @  O
32 } 5 Q4 y2 Q/ a8 }
33  ! M# P) t3 i& K
34 void TEA::decrypt(const byte *in, byte *out) { & m2 f! U" y1 \; O. C" K* m1 B
35     decrypt((const ulong*)in, (ulong*)out); ! s& S: \; Q( D2 s8 h
36 }
+ b: Y0 A1 Z! c37  
: |! }) t* F3 \; R' d; I: ~) M38 void TEA::encrypt(const ulong *in, ulong *out) {
  }6 S8 b% M3 K- ~39  
, H9 Y( K: w* t40     ulong *k = (ulong*)_key;
. S5 Q3 h' C6 j3 J; ]41     register ulong y = ntoh(in[0]);
$ i3 h, ~0 |$ P* E6 K; Z' E42     register ulong z = ntoh(in[1]); 4 d' [) S; w: L0 o! y1 U
43     register ulong a = ntoh(k[0]); - d# M' j6 f- Y/ u8 }5 ?/ Q
44     register ulong b = ntoh(k[1]);
! o* [0 ~2 h' r  Q$ f( b45     register ulong c = ntoh(k[2]);
4 A7 z, c1 o, h! s46     register ulong d = ntoh(k[3]); & V8 W9 p! j- C  k: H
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */   V3 B  {* e  V: t! w
48     register int round = _round; ' S& X) T  i& U( M7 A
49     register ulong sum = 0;
9 s' B; a: a6 v' C. }5 }50  # m% U* R* A8 C3 Z2 W5 ?
51     while (round--) {    /* basic cycle start */
( I% R  ?% B3 [- C/ ]52         sum += delta; ( C- \9 e' V  l* T
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
9 W0 W5 D& |( r$ Z- U3 l54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
1 U' ]+ g% o" R8 R55     }    /* end cycle */
3 ?( q4 b; w, N( H1 ^56     out[0] = ntoh(y);
) v6 v0 c& k2 h. x- v  Z57     out[1] = ntoh(z);
9 J8 `# P9 ?& t% {58 }
" ?  P, l* I+ p59  " `- g6 O# D$ c/ D* L/ X6 `
60 void TEA::decrypt(const ulong *in, ulong *out) {
6 f/ `, E. K: @# u61  
0 `$ D& R9 ~- {+ e' \1 v, Y62     ulong *k = (ulong*)_key;
- m# k8 M: @0 Y/ n# R0 y63     register ulong y = ntoh(in[0]);
2 f' q! }% Z4 s( b64     register ulong z = ntoh(in[1]);
0 e5 E) Z, H* |* A2 c+ p' h1 u4 O( M65     register ulong a = ntoh(k[0]);
+ k+ L- i; ?6 P7 O! d' P1 U/ |66     register ulong b = ntoh(k[1]); % z8 E- f' M+ l# d1 ^
67     register ulong c = ntoh(k[2]); 9 o' q0 T+ W9 b/ X* }6 Y+ W
68     register ulong d = ntoh(k[3]); 7 r" M5 h' x! |* q$ {# m8 t
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
7 K, N* o' s( D7 _* [70     register int round = _round; ; }6 h8 \8 S% X" ^
71     register ulong sum = 0;
- ^, a; l/ r2 G" R3 Y  W( W72  6 B9 a0 O! k5 [( C
73     if (round == 32) 7 p! @/ i! K" Z6 r$ _% {2 h
74         sum = 0xC6EF3720; /* delta << 5*/ " o" O& A+ ]7 O; y- n! E, _' V* E( |
75     else if (round == 16) 5 W8 h, r8 U. O! w
76         sum = 0xE3779B90; /* delta << 4*/ ) W; H4 V( c; I& E8 R
77     else
* P# E% F) ?  e78         sum = delta << static_cast<int>(logbase(2, round));
, |2 g6 ]0 L- B; j6 _: f' X3 `/ W79  * V2 w, O+ o( ~+ X3 D
80     while (round--) {    /* basic cycle start */
4 P7 y' K! J& L' m0 L2 R1 X( f7 p3 b81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
2 H4 H% N- S% D8 @3 a82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); : P- {& Q2 E$ q( ~3 S% Q
83         sum -= delta; % V6 H* U# C0 ~' _' J0 {. T
84     }    /* end cycle */ - m' x, [' Y/ W6 e) s1 [
85     out[0] = ntoh(y); 0 R  e6 ~' ~+ A2 U2 B9 d- @: y# W/ z
86     out[1] = ntoh(z); 1 F1 V( _1 T3 Z# P, T
87 }  I6 [. ]* T; n2 ~$ p

- Y3 H  B. U2 v; R! `# W, |4 ?7 |+ a" O需要说明的是TEA的构造函数:
% K/ H: S! }8 j" W5 }& T) u) V  fTEA(const byte *key, int round = 32, bool isNetByte = false);
' j0 B4 [* j7 y: K& H1.key - 加密或解密用的128-bit(16byte)密钥。
1 C1 }; ^0 g1 H+ y: f2.round - 加密或解密的轮数,常用的有64,32,16。
# A9 g1 I( b/ c0 I3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 9 ^4 }7 j7 E+ M: F
/ ^4 L: @# S4 T; T. S- W; t
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ( S. P9 m& h% g2 O( x
2 #include "util.h" 1 R2 k- y$ r8 Y. D  u6 Q
3 #include <iostream>
( w1 S  z+ E! J: K( G: l) i' ~- l* ] 4  3 D) \* }4 k# M7 d8 q
5 using namespace std; 1 H# z. v3 ?2 r6 N
6  % c" w0 ]8 J6 ?& g, a
7 int main() { 2 ]) t6 y9 o  W/ b9 h+ Q$ W' E
8  
! H- B5 Z( D9 U8 q, u  }3 F% D& b 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
3 \$ Z4 q' O: y8 Q9 u; {9 h10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); + l, Z  Z( Y) ]- H. ^1 c" L
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
$ j1 v* Q! q3 C. L9 e* E6 v% Q: r12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 4 w/ q$ o( Z3 v1 U7 u
13  
! W6 |, \& w7 |+ q) W14     size_t size_in = hexStringToBytes(plainStr, plain); % M% T! j0 {, h: ?" B( E
15     size_t size_key = hexStringToBytes(keyStr, key); : W$ z, `5 e. ?! {: E% J1 I3 t
16  
( `: u, a6 Z& ]. V# f7 N17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
- F" _0 c5 J# f0 ~18         return -1;
9 b6 c3 d: p& i6 e' \: ]. h19  : ?7 R2 e! P8 q0 P- u
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; # e$ l6 [1 h' T" }
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 6 m! A% Z' H' m. Q% \8 x+ X! P9 i
22  
, z% _, r. B+ e' n' _& x  o) h7 U23     TEA tea(key, 16, true);
( z: U3 q: b+ l! J% \6 s! E24     tea.encrypt(plain, crypt); 0 r' x1 B8 A4 E7 j7 t* t- ?
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
, v6 E- C0 f2 K1 e  H, ~" I3 H/ \, K26  
( C( x7 l5 g, x  U) p6 I+ ~* p27     tea.decrypt(crypt, plain);
6 t( j# n0 c2 E) l5 O! N28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
- l* \; ]2 i# b" \: X29     return 0; ( Y+ o5 @  e4 u6 V
30 }
: y4 l. [+ c. b% u
! j3 n- G5 W( `: H本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx, a3 x. o, p  y$ r3 T
运行结果: . @" t2 P' v; e# _
Plain: AD DE E2 DB B3 E2 DB B3
0 b; @- g9 O0 |8 tKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
( E) ], M4 d0 i9 ZCrypt: 3B 3B 4D 8C 24 3A FD F2
3 s2 r7 {) U6 b8 ZPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 17:05 , Processed in 0.022936 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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