找回密码
 注册
搜索
查看: 37356|回复: 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轮):- ~3 W+ d' T) A
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ) |6 M6 i' Z) d2 K* d
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 & `2 Y7 Y4 Q5 ~0 Y, Y/ d. ]3 c- f
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
! [0 Q6 D4 M. t6 {9 q4 H+ S在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 . ]; g; S  O1 R& v$ S4 u
在 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. ; g/ i# X+ b: h+ R. v
  2. void encrypt(unsigned long *v, unsigned long *k) { ( N2 n( N. H+ l5 \! o2 Q4 g
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 9 K0 l4 }* y9 g; j7 j, O) `, D
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    " n3 ?9 [' M% o/ [1 U- L7 c6 m
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ % I* E" I# M! W+ ?+ H+ @
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ , Q# \, w9 ]5 k3 u
  7.          sum += delta;
    ) C7 V# `* k- ?3 `* f9 F$ v
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 1 ?4 G6 O7 ^1 d& t
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ , D7 E4 c1 k4 e/ S6 @
  10.      } - ?  p) J4 O5 E# J9 E
  11.      v[0]=y; * U2 ]* m# w+ {
  12.      v[1]=z; ' ]; w- J& p3 W, I/ H" K
  13. }
    ) v6 d7 {; z; k# \( `
  14.   
    7 S- b" J8 v6 F, D1 ~
  15. void decrypt(unsigned long *v, unsigned long *k) { # y1 I8 _* L  P7 B9 A
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    4 M' w" O0 Y% {
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    7 {+ T/ Z) i3 q9 d
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    1 T/ o$ A% ^7 l( D" d, @; @9 Z4 o
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 9 H+ ^& n: ]. }+ t& A
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # c. l% Y6 E- L3 Z" n
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); + V- R- z, v# [( I0 D* ~
  22.          sum -= delta;                                /* end cycle */
    6 M8 o; q7 F/ w2 ^
  23.      }
    * Y. g) F1 W9 p7 m  }7 F2 e
  24.      v[0]=y; 0 _3 C- g! D3 a1 W! `
  25.      v[1]=z; ) J5 I1 C- H* Y. [- x
  26. }
    , D" M5 N7 z. T- E- d
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
0 {* }7 G; g" c$ \" s1 L#define UTIL_H
1 G# i. M4 ]" i: H+ u' U
6 `: p/ d6 S8 o$ l  Z( V#include <string>
" b9 D! }' S; C  `1 l#include <cmath>
8 w8 a/ ?0 u8 I0 R#include <cstdlib>
  R7 R2 e! H- y8 e( l" e , U/ p+ ^+ A3 I
typedef unsigned char byte;
0 i( H# u5 I5 Itypedef unsigned long ulong; # I8 E* n$ K+ C7 l

! {: t7 {& X# W3 ^* tinline double logbase(double base, double x) {
/ c: R1 P, x5 d9 P# v& ~    return log(x)/log(base);
) B( w& l% T0 H( G( q1 ~5 \  ^  K6 ~}
% A) E" w: v, ?3 A: U $ @9 d; p4 U4 o% S  H, v
/*
) L: f8 ^7 A) {8 a*convert int to hex char. , R1 ^% F0 o" L
*example:10 -> 'A',15 -> 'F'
, `% L6 L, F6 I) S3 ^' `*/ % s+ i7 q; O* e) g) I; y
char intToHexChar(int x);
$ ~" t3 g; m+ v
" q+ W$ n1 [: `3 Y' Q/* ( Q1 M+ y6 _( ?
*convert hex char to int.
7 G& K, e1 A! i* G*example:'A' -> 10,'F' -> 15 7 |# q, ?( q, Z+ \) |
*/
# u: Y$ n* h" g6 rint hexCharToInt(char hex); # @3 Q9 k2 I- j+ V1 z: V' H/ I
: U7 N7 v: K  H) V1 Y" P
using std::string;
6 q4 E& A, }9 R/ V4 O9 O2 A/* ! U& ^, [; w7 g1 M2 k
*convert a byte array to hex string.
+ T3 |) ]5 [& [/ ^% N*hex string format example:"AF B0 80 7D" / y/ M+ H# C3 I' n- }4 T+ q1 u
*/ 5 q' H1 v: f- f9 s
string bytesToHexString(const byte *in, size_t size); ; W" q+ h6 k5 t0 X% X$ B& q/ d7 @7 {2 O( a
  _( c# Y. `0 i' N4 x+ \
/*
+ ~4 w, `6 u6 o3 h3 o; O) g; k*convert a hex string to a byte array. * F7 Q2 D- j9 o$ \: O* N) k( u
*hex string format example:"AF B0 80 7D" 7 B1 a2 O& t- M" ^' X
*/
; m# \1 M1 G+ t. ]/ l6 Wsize_t hexStringToBytes(const string &str, byte *out);
% w/ e& K+ }* b5 c; Q . N/ i9 k& |3 o& C( C" G2 ^
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
' \( \9 y! S% N5 q7 j7 B. ~/ g#include <vector>
9 g  ^/ w. g  G# n: a7 @
: Y2 C6 t. @) I1 y' d0 v! s+ pusing namespace std;
5 f$ x5 b. I, F7 ~5 e% |
& m' B6 s# n" j6 G) ]3 F4 Fchar intToHexChar(int x) {
* R1 k  z% y! w* m    static const char HEX[16] = { 8 |/ k# g  Y5 e: A3 w; n
        '0', '1', '2', '3', 4 Z  ]' P/ B/ M# z$ \$ }
        '4', '5', '6', '7',
1 N8 F5 U' W9 e1 |/ a) e        '8', '9', 'A', 'B', 5 V0 `5 D4 ~$ |1 c8 a; s0 z& k6 e& W; L& f% I
        'C', 'D', 'E', 'F'
$ I# B8 O# W$ v. ?. }    }; $ q9 n5 m* H% }5 {% s6 G/ X
    return HEX[x]; - I/ z5 d7 M7 s7 \2 A
}
! [% j; }, G. e5 K; A
, ?0 _8 ?. a+ d6 ]int hexCharToInt(char hex) {
7 E8 O# {' N" P! A0 n; O% e% A    hex = toupper(hex);
9 o; ?$ Z! h: O0 m3 p    if (isdigit(hex))
1 T, ^2 v2 H2 c1 k7 z  ?# W        return (hex - '0');
' \) \# h; F% S! n) ~0 Q2 x    if (isalpha(hex))
, I  ^+ o1 ]/ n0 _3 z/ ]        return (hex - 'A' + 10);
5 T/ I. f3 Z, }    return 0;
0 Z- ]4 J3 o5 ~4 d2 G4 B1 j} * \5 N- m% y6 ?- b" B- q
( Z. T1 a" V4 |2 Z- L- k
string bytesToHexString(const byte *in, size_t size) {
8 R7 }8 A6 d( c  A    string str;
1 A% v2 N# ?( L& e+ U& O( Z0 s    for (size_t i = 0; i < size; ++i) { : h, ]4 M' t% \, c8 J* m
        int t = in[i]; 4 y1 C. J' P1 w$ Q- h3 K6 @) u
        int a = t / 16;
$ U- `0 V+ X4 U' @. i        int b = t % 16;
3 T# b  w$ O/ G, O8 q8 Y+ k1 |        str.append(1, intToHexChar(a));
4 ]% P0 t$ h' k5 Y9 ^        str.append(1, intToHexChar(b)); 8 W, Z6 a3 U: x6 }
        if (i != size - 1) + w- b+ F1 m% o% `
            str.append(1, ' '); 8 T6 `; q) ]) E! x# l: t' H6 K3 Q
    } 6 b6 A( ?$ b& h4 @! Z* A
    return str;
9 J) Z! Q+ A& j( w}
9 J3 U; U- U7 ^# |2 A0 J( ]" n
" p/ _! G/ o7 L* Lsize_t hexStringToBytes(const string &str, byte *out) {
, M% q3 o' R- |# ~3 k; i# o
" C2 K. d9 p# X8 z" w    vector<string> vec;
& ~9 q% f' P9 {" I1 ^% S0 A$ h    string::size_type currPos = 0, prevPos = 0; # M( q8 G# n* n( o
    while ((currPos = str.find(' ', prevPos)) != string::npos) { / {% V2 s: q3 S/ X5 a* o$ I! a
        string b(str.substr(prevPos, currPos - prevPos)); 7 @  J; _2 O9 ?+ |
        vec.push_back(b); % m( d! D8 [8 @/ Y% j) M
        prevPos = currPos + 1;
; c  x6 a& t  r, p: P" \% D    }
; p' _. T8 o4 m/ Z7 ?* A    if (prevPos < str.size()) { 5 C9 N2 a! b( i. b, b2 ^
        string b(str.substr(prevPos)); 5 m/ m" e" ?) f$ H: L$ E" ]+ x
        vec.push_back(b);   t8 P. x( }5 h
    }
9 m' J% R' @0 l# S& v    typedef vector<string>::size_type sz_type;
0 f$ s; q+ |* U+ b7 Y    sz_type size = vec.size(); % |( t8 m" _. b' T
    for (sz_type i = 0; i < size; ++i) { ; g, ~& h) V0 Q4 a6 h, u1 ^2 q
        int a = hexCharToInt(vec[i][0]);
1 v6 `& z5 x9 E2 E        int b = hexCharToInt(vec[i][1]); ! Y5 i, G' T7 O( s' S
        out[i] = a * 16 + b;
6 G' G- G' Y  z5 D1 T    }
1 k' l( I: O+ S5 |    return size;
3 [7 b- e" F* o7 \/ D}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 1 z7 l& m, E% G6 L
#define TEA_H
5 b" Z3 [4 G& R7 H; E" | ' B6 I; S& Z# N+ [$ _& ~4 t
/* 9 \' {' q1 y, I5 u" I; C4 Q" S9 f' u2 p
*for htonl,htonl " s1 t' f8 B% n3 o
*do remember link "ws2_32.lib"
* n! b8 c( D5 Y9 O/ e* F*/ + D: ]2 a+ l; a9 [+ {% o  w/ V( B7 F
#include <winsock2.h>
  C& n5 r& Y# ^. X#include "util.h"
8 @1 {8 ~4 ^: r5 h9 W $ V. T! {4 ]! R; j; u9 g
class TEA { $ {  W5 s; c- r9 r
public: 7 M* c+ c2 E* `
    TEA(const byte *key, int round = 32, bool isNetByte = false); 0 i  @% I' {9 T3 e0 E+ Y
    TEA(const TEA &rhs);
" Z$ M" a% `8 e    TEA& operator=(const TEA &rhs);
- |4 s: x$ \/ a7 q    void encrypt(const byte *in, byte *out); 9 s: x) S# O! _" l
    void decrypt(const byte *in, byte *out);
, K$ Y+ ?/ h4 ?2 Rprivate: : I) Y9 U) K" W" e# n
    void encrypt(const ulong *in, ulong *out); 6 E7 s9 X( I$ c; s
    void decrypt(const ulong *in, ulong *out);
: L& I+ E. N# z8 T( ~: w2 D8 [6 S    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
3 x1 X$ X( A% R4 l+ n* ?    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 2 t8 M$ F- k/ Z0 A
private: - ^; w# ~7 M& J; f9 Q, T- u* D# F
    int _round; //iteration round to encrypt or decrypt
3 V6 d4 w/ k& _6 h  h$ ]    bool _isNetByte; //whether input bytes come from network % c6 D2 R& A  q' ~; ], _1 Q1 ^
    byte _key[16]; //encrypt or decrypt key 8 s" Y7 W. N  l! R7 L
};
+ g, |6 F. R& m$ z$ ~( d . @7 H3 N' f  Y7 Y
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 0 A% S  m7 [9 Y6 y$ ]
2 #include <cstring> //for memcpy,memset
3 j& V" |* T( s2 P( s& L" O: ?+ U2 k 3  
2 o0 c, U& q! a2 r2 X5 D 4 using namespace std; - e+ Q$ p( u& g. L" g1 x6 {: E9 A
5  
5 I3 L& n6 ^* A. S0 } 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
" b: W( A- A% E" ? 7 :_round(round) 9 K( |' c2 D0 Z' P; j9 u4 c# X0 n
8 ,_isNetByte(isNetByte) { " r* o9 G% f; g7 P$ g4 d( D/ B
9     if (key != 0)
" W1 y) t3 }( S3 [  T10         memcpy(_key, key, 16);
$ z' l' F6 o  j# z4 V11     else
* [" |8 ~- s. Y) c) D; H12         memset(_key, 0, 16);
' B1 x+ N4 S4 }# a6 M' z6 c13 }
4 E+ S# v. Q, T* y: ]14  $ C# n, Q7 ^, N
15 TEA::TEA(const TEA &rhs) 0 A3 J  Z/ t& c, h  t1 l
16 :_round(rhs._round)
# Z0 ^8 C1 c5 ]) ^- X; N+ h17 ,_isNetByte(rhs._isNetByte) { ' u$ R/ Y. o7 H5 [- Z1 }" I2 {
18     memcpy(_key, rhs._key, 16); / u# o( w+ ]4 ]
19 }
' {' C/ ~  M9 E; b' A! j20  
( K  r8 e( O. X21 TEA& TEA::operator=(const TEA &rhs) { " l/ w+ ~$ ~* v! I
22     if (&rhs != this) { + r) j8 K/ b+ ^, e% M) F
23         _round = rhs._round; ; E5 S; R8 d0 M# i4 i4 Q, `# `
24         _isNetByte = rhs._isNetByte; , w" y( B4 |; M) X
25         memcpy(_key, rhs._key, 16);
8 X8 p3 S; w, K26     }
7 u' M7 ?4 v& B$ I27     return *this; # q9 N; @9 v5 g9 k& U& Y
28 } 3 N9 O; t2 t! F3 ^' c
29  
. ~: V# x/ ~, d! j2 a7 I30 void TEA::encrypt(const byte *in, byte *out) { ( c) v* \( O) R: D
31     encrypt((const ulong*)in, (ulong*)out);
! H- g- f2 Y% k" a8 G6 m+ f32 }
3 z+ y4 N, \2 ]7 _33  
9 i4 g' W& B7 B# I# `34 void TEA::decrypt(const byte *in, byte *out) {
& S3 X4 L( x  \  }3 T4 z4 @7 G" p4 Y35     decrypt((const ulong*)in, (ulong*)out); 5 p% J7 G# y# y) I  S( p( w9 }( G
36 }
; }! G& f. l+ p: k* j5 t37  
2 }2 i! V* N% Z# e( U38 void TEA::encrypt(const ulong *in, ulong *out) { 3 y8 o: b( p' o# B" M2 K+ p; M1 r
39  ' |! D# O& z6 l
40     ulong *k = (ulong*)_key; . B( x7 ]) g5 P
41     register ulong y = ntoh(in[0]);
7 n5 x! O5 U4 N0 m42     register ulong z = ntoh(in[1]);
/ S* v3 t6 }$ D$ N; l% m43     register ulong a = ntoh(k[0]); + ~& w$ p- r1 z7 _# v( }8 @) `' @8 v
44     register ulong b = ntoh(k[1]); 4 r1 z- H+ b3 E9 S$ I
45     register ulong c = ntoh(k[2]);
6 s# ]) o) _; @! D# d$ I; r6 r46     register ulong d = ntoh(k[3]); : K1 |8 L$ W" U: Q2 `
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ C" t' B# _# s- h1 h% B, T9 ~. S& A, g( n48     register int round = _round;   f: `$ w! B' E( t' k$ P' @
49     register ulong sum = 0;
1 ~9 W3 P* N5 G7 z" X! ~/ l50  
/ R  I/ M+ k2 y: P, z+ X3 }51     while (round--) {    /* basic cycle start */
1 N. ]6 d* x9 w5 x( }' q$ b: U52         sum += delta;
% z. O0 t% m- C! q) n! s# s53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
7 G) o% ~4 v8 e- E5 v0 F54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 5 r- d9 m/ t- |0 j: P
55     }    /* end cycle */ / ], P' Y6 [9 D) k. z
56     out[0] = ntoh(y); 8 S  [- p9 U3 K
57     out[1] = ntoh(z);
4 y: Y5 N5 O1 U7 @0 i58 } 5 R8 j$ }! D. w" Q2 W( k; I
59  7 O2 o6 F9 d' {& e, r, o% `
60 void TEA::decrypt(const ulong *in, ulong *out) { ; x& s3 G# V6 |; @/ z
61  4 v3 o5 c; \% ^5 o* K
62     ulong *k = (ulong*)_key; 2 O  U& X5 y& |6 d: n! @
63     register ulong y = ntoh(in[0]); 1 v: n! X+ ?) c$ l
64     register ulong z = ntoh(in[1]); ( ^* T7 R1 A8 u- Q7 w
65     register ulong a = ntoh(k[0]);
2 S2 a7 m2 q% b+ I1 H1 }66     register ulong b = ntoh(k[1]); 6 k0 ^+ B8 Z* G0 H: J# X
67     register ulong c = ntoh(k[2]);
% k  I% X4 o  u2 l# H2 \( f68     register ulong d = ntoh(k[3]); * m+ C, _8 ?8 c% l# M
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
9 |1 `5 B  u; Y, A! c. V$ \70     register int round = _round; 0 D3 e" K% z, ~, ?2 h$ ?
71     register ulong sum = 0; 9 J& X( V7 |2 k* y  e7 k- R
72  
( I- `+ c5 z, J8 l- F2 A' g# F73     if (round == 32) 7 W' R$ h1 M1 M4 g1 L
74         sum = 0xC6EF3720; /* delta << 5*/
6 o' O4 B- G7 y/ M75     else if (round == 16)
; Z3 T0 h* I. Z' X. E  `' I76         sum = 0xE3779B90; /* delta << 4*/
  ?0 V+ B- G  w77     else
: M6 Q& X6 b( r7 _2 k7 a78         sum = delta << static_cast<int>(logbase(2, round)); ! g  F$ O4 h5 M( e9 j
79  . e* h# ^2 N+ l5 O
80     while (round--) {    /* basic cycle start */ , F0 e0 \( G- ?
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); $ L8 B* h! P/ g
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
1 ?/ Q+ e+ ^, \# E" b+ `6 O83         sum -= delta; : d3 f6 D: A: Q8 {
84     }    /* end cycle */
" ]0 D" ]0 O8 q. D  y( R3 ?85     out[0] = ntoh(y); & j$ i' S5 ]! ?. n
86     out[1] = ntoh(z);
+ D0 ]3 Q4 h# @, ^4 y6 Q87 }
* O. c  `( L, [/ C  V3 j* U5 l6 K" _* r! e( }6 P
需要说明的是TEA的构造函数:
# p/ k, b1 g# N: Q  ]+ Z( sTEA(const byte *key, int round = 32, bool isNetByte = false); + H& V7 B* u. E: h
1.key - 加密或解密用的128-bit(16byte)密钥。 # w4 Y6 ^1 x1 A  ?2 z. ?4 `0 N
2.round - 加密或解密的轮数,常用的有64,32,16。
1 O' F% d2 i$ h- f; C3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
- ^- H+ S  `* s; {; a! k* ^4 {8 }
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
) x2 b$ {9 ~2 q5 J 2 #include "util.h"
! A; J: o! U" w$ Z5 e# S: D2 P 3 #include <iostream> $ w6 D8 W. Z& _7 j8 _8 E
4  $ D' d2 ]( ^6 o3 U# T+ E0 h) [0 J
5 using namespace std;
4 x1 T0 f! ^) \0 S/ g( j# H: H 6  
# Q$ M" v3 i" B% ^ 7 int main() { 7 d& N" p+ D1 x4 ?
8  0 C3 n, i+ ]1 b7 X' f* X, |6 O7 ^
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 4 x- P+ X7 M5 r( v/ H" [: e
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
0 p1 @! \9 q* y4 Q0 L. J. x11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; & }8 c7 g) a+ f6 Y' J
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
1 e$ P: ^# q& _5 r13  
9 i1 |" H4 g& ]14     size_t size_in = hexStringToBytes(plainStr, plain); ! @9 D* N- H0 V4 }) D  T) T+ g1 W+ X
15     size_t size_key = hexStringToBytes(keyStr, key);
. [+ ]* q1 w$ ]0 r# B! ]16  9 w5 F. B4 w4 f5 a+ l$ U. k9 S
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
7 j$ D3 T+ K5 ^8 l7 p18         return -1;
# q) [( X8 [$ x; X% B' h# }19  
) C! L; _* R9 o9 U$ P20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; / |: I" @8 ^6 {
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; % F# I* q" I; v3 A# O. T
22  
+ ~0 R% Q) j. U$ z" t23     TEA tea(key, 16, true); ! V# w3 c/ \3 q9 T
24     tea.encrypt(plain, crypt); ) N3 ^9 I5 K% ~- Z4 b
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 1 u0 y, H; j& f. I# M
26  
8 v8 @; O4 N: j) P9 X27     tea.decrypt(crypt, plain); & L( e8 ?4 n! E9 e4 E, P
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 6 ]0 t$ t' U  t1 b' \( x
29     return 0;
! A( Q# r. x( A) c1 P9 V' F30 }
5 S2 b3 A" y+ Q) J: F6 s# _+ B2 P, h! h  S8 F
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
* |' v! m. o$ x  O' L! ]% P运行结果: 1 k) e; L, w& ]( p3 U$ x7 k
Plain: AD DE E2 DB B3 E2 DB B3 " J1 }7 d( u' G1 m$ y7 ]+ z0 O
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 " O( \5 W+ n  b
Crypt: 3B 3B 4D 8C 24 3A FD F2 & Y8 m$ `7 c$ V& I0 D4 G: L
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 16:51 , Processed in 0.029642 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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