找回密码
 注册
搜索
查看: 37319|回复: 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轮):8 u  c$ U3 [2 O$ ~. G/ ]* C; v2 L
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
* A) `2 \, I% ~& d: b+ g) gTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 , K% `& Q: U+ l5 U
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 + I8 \  q/ `6 |2 O" _- Y
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
# H6 I$ m3 b6 P' y6 ]7 E在 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. & s9 u( [  ?" {' I
  2. void encrypt(unsigned long *v, unsigned long *k) {
    & g6 W! }; x/ B& P; x8 c( g
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ * |- n' Z, d# ]) a, @+ U/ F
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ + h7 B, C$ U9 n
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 7 M8 t  M9 o8 @
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    , e) `# r/ j; p$ ]( c
  7.          sum += delta;
    ) w4 y& H( d- w) V" p" X
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    - A& |1 x* a7 o$ m4 B
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    % }* E+ N" w; u3 A+ ?, N( a
  10.      } ; t) C+ p* ^& U3 J8 E0 C% T7 N$ j
  11.      v[0]=y; 3 H2 _9 O. b! s/ ~+ E# |+ c
  12.      v[1]=z;
    5 G% F* y# ]( O) m
  13. }
    6 P. B/ s6 }6 Z; h: v, x& q$ ]
  14.   
    9 W+ m0 T. N  G, ^  p. I" v
  15. void decrypt(unsigned long *v, unsigned long *k) {
    3 E( e) f$ ]1 T6 q4 |8 r# F' P- ~
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ - m% p. P6 ?1 t4 Z: \' A* E
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ # B% ~$ ~" k( j  k1 `
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 4 V( _0 W- C* k5 B0 m" k
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    7 C& U! W& d- K4 k
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 0 w; P6 C2 N1 h3 C* U% @( z
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 6 N9 |! S3 V* H9 r- L: @! R! z/ G
  22.          sum -= delta;                                /* end cycle */
    & s2 w2 O1 t; W
  23.      }
    7 E7 \2 y4 f7 P7 k5 s/ [
  24.      v[0]=y; 2 ^- A  \- M$ U! }5 u
  25.      v[1]=z;
    ( d; R) P% F1 ~2 w: w# D6 t
  26. }; j" \5 ?' ]2 V% c; n: o
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
* M8 W: Y- a# @: }, y2 s#define UTIL_H - L) x2 [9 k! T; V

+ R( F. e) D& g9 A; L- Q#include <string> . X0 {' P$ B% S/ @1 I
#include <cmath> ! S0 I( z: L: [! F0 n
#include <cstdlib> ( `3 e, K. T5 U5 I9 A) h
+ s/ {3 g+ V$ f& E; ~6 y# t
typedef unsigned char byte; 6 E' ~2 f( {8 _  G6 `6 D, }+ ?
typedef unsigned long ulong; / S! c7 ?2 M) j5 J) f, r$ q

7 G3 ~2 b) m0 p" G% `! J. {4 c0 Winline double logbase(double base, double x) {
& y3 \/ F- Q1 b) H    return log(x)/log(base);
) r5 ~; O! u3 f9 D  q3 T} ; n9 o2 E4 Z* _6 u8 t

! u& N& l% ^0 U$ m. o' l/*
4 ^; f8 a' d+ n) S*convert int to hex char.
* d; {2 w# l0 G+ M6 X*example:10 -> 'A',15 -> 'F' , N3 S# B5 @7 n: }, k0 V- R" h8 w( L
*/ ( I. v, L# A! w- G9 j
char intToHexChar(int x); . ^; H# R2 }( K0 r! N
  A! W  P6 z3 [
/*
% Y( g: a/ @" M3 R* p# _*convert hex char to int.
. ^  @$ ~; I9 ]8 |- s' N- V*example:'A' -> 10,'F' -> 15 & s) [( H! u- t2 a) F
*/
' ^6 x( X7 ~2 ~' D  ^# uint hexCharToInt(char hex);
. D  ]/ ^5 Y- [3 R! g0 c : w! V7 \+ H) c) B
using std::string;
1 H( b) L: l+ t5 \! ~: F& d/*
3 c5 B% ]! o6 I  _3 i1 ]) K3 {*convert a byte array to hex string. 1 M, X8 w0 t% C: O2 H
*hex string format example:"AF B0 80 7D" 2 r! s& c9 W' P, j- x1 c
*/
( _; o" j, R: A- b' X9 istring bytesToHexString(const byte *in, size_t size); $ I0 v4 h" Q: P" M, {

7 R% o% e! F! k% ~: S/*
, l- m( d4 g; v, z. h# K*convert a hex string to a byte array.
4 u% |, y7 w2 I) z7 t- n*hex string format example:"AF B0 80 7D" . r* E) N8 O. O9 b
*/ + {0 w& K; q4 Z
size_t hexStringToBytes(const string &str, byte *out); 5 K& J1 p" {6 h5 T# s& Z+ A
6 w- p. H/ w3 Q+ k1 E4 Z' q, Q- n
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
0 ?0 J, l0 T6 Q5 W7 ]1 W4 z#include <vector>
" ?* M8 E0 m4 \5 q: I; {! }) {/ ~ / f6 i" _( p9 k! U
using namespace std; 1 e) ?# R% ?* g% [) R" U: a

5 G4 ]5 B% m5 c3 I( _3 Qchar intToHexChar(int x) { 6 g! c* g5 ^3 r" W+ e1 g. I* ^
    static const char HEX[16] = {
, i1 k' s! I% s! ^        '0', '1', '2', '3',
2 n7 }8 v' ]0 ?& @4 V1 H* G9 R* q        '4', '5', '6', '7', 8 e0 ^' V0 ]) ?
        '8', '9', 'A', 'B',
" R! \3 T+ w" b. \+ z; d3 e1 c$ U        'C', 'D', 'E', 'F' 5 C- M: K' T5 @$ B+ C) b
    }; % d  V; V0 i9 v# ~9 j
    return HEX[x]; 5 }& v0 W: L# o/ |+ L: F
} ) c3 G! t% ^( \7 D2 O0 D* K
; W; S5 e  j: |& B
int hexCharToInt(char hex) {
: Q( v, Z' |& x8 m. G9 n: r  I    hex = toupper(hex); 9 Z5 i: Q8 {0 @
    if (isdigit(hex)) / O6 o( F: G/ g% p9 Z8 l
        return (hex - '0');
5 ]# X' C! H% m# |0 }1 A8 @1 y    if (isalpha(hex))
' L6 `0 S% |( z3 `% w# s        return (hex - 'A' + 10);
& U2 R+ v+ U3 b( p0 i) S2 y    return 0;
) R, v) T$ g( }( ?3 y} ) ]6 v, C/ ]  b" A0 y
0 m6 m2 d% u4 e! m# b! _5 `
string bytesToHexString(const byte *in, size_t size) { ; R. c; P" I6 B( b5 P
    string str;
9 t& f" m6 l& Y, ^7 u% V" T    for (size_t i = 0; i < size; ++i) { 1 r. [  k, G3 |! ], F; [7 |5 K
        int t = in[i];
. c$ A. s" g" W/ w. S$ |) `  T        int a = t / 16; 5 ~, S$ `; K8 V- }, N5 r
        int b = t % 16;
9 A; b& R# K: f8 _3 P4 e        str.append(1, intToHexChar(a));
' c% u" G4 m2 v2 b0 L2 [# \        str.append(1, intToHexChar(b)); 1 c8 `+ W0 g, ^. ?9 j9 d
        if (i != size - 1)
* A5 S2 Z& ?0 ?" b4 U$ C            str.append(1, ' '); 3 v9 I1 B  z) F: Q! c/ {
    }
# k: L. c1 ]& |& [    return str;
/ ?4 O  |9 K! O* f}
- M+ d  ]& r$ t9 y! K9 T ; O! Y, W# R$ V# a; j0 r: j* d0 J
size_t hexStringToBytes(const string &str, byte *out) { 7 u+ {' u$ ?; k% m+ t9 w. ^
1 T8 ?: j0 _8 _3 y
    vector<string> vec;
' w$ p2 |. s0 d    string::size_type currPos = 0, prevPos = 0;
. Q9 _5 [% S# I# h    while ((currPos = str.find(' ', prevPos)) != string::npos) {
% E' t2 g5 E9 Y) _5 \        string b(str.substr(prevPos, currPos - prevPos)); + A; U! k! E  L7 P* m: J. h
        vec.push_back(b);
/ \" M, O. Z8 Z, ?# S6 d        prevPos = currPos + 1;
% V, M0 O+ Y5 S    }
3 L, m+ N! b9 P6 g/ z5 t    if (prevPos < str.size()) { 5 g0 I) |7 q! T9 C: \' \& w% d: _
        string b(str.substr(prevPos));
; Y( \( h: u2 ]7 q( P1 n8 a! p        vec.push_back(b);
- G+ }: D( V+ ^! ]    } $ b& Y3 b- H/ e
    typedef vector<string>::size_type sz_type; 2 q' A4 J& U' V; M- J8 V* h% b8 n
    sz_type size = vec.size(); * W! u" i; _+ o* Y4 m. |, H2 w
    for (sz_type i = 0; i < size; ++i) { 3 L# G& h- @* N7 l( u( H
        int a = hexCharToInt(vec[i][0]);
0 s( [! f. H: H        int b = hexCharToInt(vec[i][1]);
0 R( L/ ]: ^: a9 H8 ]& y8 s        out[i] = a * 16 + b; ! X! N! H. M+ q" R' H1 e
    }
5 l' e0 B" y7 c) `( ~    return size; 7 P* p, k' \- Y' M3 B' Q4 x
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ' ^: E' @( X) {" y3 Q6 x! J
#define TEA_H % }- G% h' T! w* a$ _
/ p4 n1 E# N( G4 Z+ C
/*
8 ^  b1 f! w" ]4 d+ x. I* _) v, y" i*for htonl,htonl
- A# r# e3 V- }& Y( C: y*do remember link "ws2_32.lib"
, ?& r' c3 i! Y* `; x, |*/
8 j' Z$ O! P( L: Y) X/ y) q#include <winsock2.h>
3 j2 j$ ^7 e4 O  K, T#include "util.h" + H- w% m: Z* }1 F: h% \) \
  W% P& w8 _9 |4 i/ L0 a7 ?2 b
class TEA { 2 u/ w) ~6 b, z0 ~& i. H
public:
* j# i( V- e4 j) h/ n% b    TEA(const byte *key, int round = 32, bool isNetByte = false);
- ~: o, H) t, M    TEA(const TEA &rhs);
3 l) h8 d; p+ T# [( ^& D    TEA& operator=(const TEA &rhs);
6 x% E% Z, |4 p( J& k) h: ^4 j+ A) q    void encrypt(const byte *in, byte *out);
, y  s5 n' a' Q4 G, p9 e    void decrypt(const byte *in, byte *out);
6 w$ m3 K$ d/ H, b! Z  q& yprivate:
5 `) K( G' f5 L% z! [8 T6 {% n- M    void encrypt(const ulong *in, ulong *out); ( d+ ]5 k7 y  D
    void decrypt(const ulong *in, ulong *out); 1 ~+ |: `- Q  u1 C2 n% f" W
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } . r) x3 n7 y! J0 k; g$ A
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
5 b7 B- ]& R$ P0 _8 R& V  Zprivate: 6 ?. c7 S( D" r7 ]
    int _round; //iteration round to encrypt or decrypt
% a- D8 M( a. h6 ^4 C9 C$ G1 F4 k    bool _isNetByte; //whether input bytes come from network
9 D/ B5 m9 G, s2 }$ Z- Q- r4 s    byte _key[16]; //encrypt or decrypt key   e) P  o2 y9 U# g" E
}; ) }' B$ B4 v' p8 b5 w

! S3 r9 ]2 s, i1 Q1 @9 t# x#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
( M$ ?) F! q. Q; s 2 #include <cstring> //for memcpy,memset
, z' y1 J! Q' ]) u# q 3  
5 d6 @( \% g. u( l+ x2 B% k 4 using namespace std; ; u1 r6 p+ d" k  L* |0 N
5  # e3 S+ c4 O6 q# ?# W' _
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
6 M4 T0 A$ @2 Y 7 :_round(round) . q& y' @) Y. f% c5 O% g; `
8 ,_isNetByte(isNetByte) { ; h8 J0 p, V, I  q7 h1 ]' T% Z! }
9     if (key != 0)
" D3 e9 N' g$ e$ m! Q; G10         memcpy(_key, key, 16);
* ?% ~8 S4 u+ Z% H11     else
- [- n2 \- s8 y& {5 J! i' M12         memset(_key, 0, 16); # j# `$ n6 h5 Z. g+ U/ a9 \$ V
13 }
9 v" A! c2 q0 W; Z14  . {' u' O3 \) Z; g/ P9 N* B
15 TEA::TEA(const TEA &rhs) 3 W) i' [9 p9 k% Z; @' _) W  Z
16 :_round(rhs._round) + V" _0 Y0 h# e6 p% b
17 ,_isNetByte(rhs._isNetByte) { : k! V1 p9 P/ B5 ~  h6 F8 Z
18     memcpy(_key, rhs._key, 16);
+ O: {; z/ U( s3 {' u$ B& m19 } + [. g) v% Z2 m
20  
# x( s2 f+ @& N21 TEA& TEA::operator=(const TEA &rhs) { & n  f. L2 D8 Y
22     if (&rhs != this) {
: u) A0 f" @  V23         _round = rhs._round; 9 K" @& ?0 a: z( R7 e6 f/ N
24         _isNetByte = rhs._isNetByte;   U# ^7 f8 \2 c
25         memcpy(_key, rhs._key, 16); : \" Y8 [# G4 A4 N! c5 L
26     }
; q9 Y( \- a; t# `+ C; q  Z: r27     return *this;
5 U. n9 W. h6 r9 d$ V% r/ R28 } : p( r7 ~8 P/ m% M" @8 e5 [" U
29  
( A/ k) m( b3 t7 q30 void TEA::encrypt(const byte *in, byte *out) { 6 t- g; K2 J+ }/ S( \/ I" ^
31     encrypt((const ulong*)in, (ulong*)out);
+ o& w) {1 [' y% x2 H: j32 } $ t' L) t# V- o) n# x
33  - C+ d! C  V7 E; v7 p" M
34 void TEA::decrypt(const byte *in, byte *out) {
  ^7 {( V/ r3 j35     decrypt((const ulong*)in, (ulong*)out); 9 j7 p+ y* E/ _  ~8 N( r
36 }
/ }$ t+ z1 s1 s! {* N37  0 f$ v1 C; P, `% B' u
38 void TEA::encrypt(const ulong *in, ulong *out) {
/ Q0 d0 D' T. g7 r* g39  
% r6 O2 ?- |" k: n40     ulong *k = (ulong*)_key; & E! t' L4 _4 X. f
41     register ulong y = ntoh(in[0]);
( Y' `- g2 u: E' C42     register ulong z = ntoh(in[1]);
: Z4 Q3 E1 C+ f* L! A) g5 C43     register ulong a = ntoh(k[0]); 2 a" h( g* K3 }' i$ B$ Q$ k
44     register ulong b = ntoh(k[1]); 8 O. q, ?: @) T2 k
45     register ulong c = ntoh(k[2]);
1 S- M9 W0 j! G) D! M46     register ulong d = ntoh(k[3]);
& ^( z0 L. U9 ]# ~5 |47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . n+ q, P' \" h: k( ~
48     register int round = _round; ' w2 t; Q5 }1 s% E$ }$ Y
49     register ulong sum = 0;
$ @8 `! p0 d8 J9 |. g/ l0 Z5 C; e: p50  
$ }- U5 r2 v% H2 G# f  f6 I) S51     while (round--) {    /* basic cycle start */
) |5 [2 m# i8 I! S52         sum += delta;
' T: s5 k. N) `53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); % Y/ f. {$ V9 W9 E- C
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
5 J3 q& G! s; D6 S- G1 `55     }    /* end cycle */ 5 D7 [1 |* {* L2 a
56     out[0] = ntoh(y);
* g0 ^7 S$ O6 _* z57     out[1] = ntoh(z); 7 y' h4 T  k! j2 T& {( s' ]9 K6 l
58 } + m+ i3 a1 L7 T) y& c
59  ( C6 o# W5 T2 a2 L/ B7 }: \
60 void TEA::decrypt(const ulong *in, ulong *out) { 4 |5 L: @1 i9 O8 l5 i/ c. U9 v% `
61  ' u& Q# t1 D! }. j; e  `. a
62     ulong *k = (ulong*)_key; 6 W) U" T0 i% m' }
63     register ulong y = ntoh(in[0]);
/ k% S' ~+ x% F6 L64     register ulong z = ntoh(in[1]); + o9 A7 w( _3 o
65     register ulong a = ntoh(k[0]); ' F* R( m/ q+ t( u7 P% @$ n7 _
66     register ulong b = ntoh(k[1]); 4 S  m3 i. k% |& J# R, {* }( r& {0 x# C, X
67     register ulong c = ntoh(k[2]); 2 C, Z3 }; c% g1 i, k
68     register ulong d = ntoh(k[3]);
% K) p  w( ^2 a' A/ ~69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 7 D6 Z, O& c  h, a( W
70     register int round = _round;
* g3 v# t9 z* w" G8 [$ s71     register ulong sum = 0;
9 l. U7 ?2 `' Z- \; v72  - H$ y3 z0 J( V
73     if (round == 32) ( x; e9 O5 R2 s: T& `  s& C- K
74         sum = 0xC6EF3720; /* delta << 5*/
4 n1 t$ k) ?  ?( T7 m) N" i2 f) [: I75     else if (round == 16) 0 h$ h! u. Q$ p0 P9 [7 W& d- R" F
76         sum = 0xE3779B90; /* delta << 4*/ ' C2 o: k! }, [- @2 O! m1 U0 \
77     else ( X' _  ^. H# \5 ^
78         sum = delta << static_cast<int>(logbase(2, round)); 5 i( i  A0 e1 m+ o. ~4 o5 l$ R; s
79  
% ?' w. E$ s5 t7 ~& V9 O( e80     while (round--) {    /* basic cycle start */ & E9 s0 l$ N- T$ {/ D
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 6 O; t5 ]+ J; f) p  f2 e0 p
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
8 G6 C* o1 u" o* y8 m1 c" `0 k83         sum -= delta;
8 L+ Y( L0 T( |2 p/ }( Y- R! t84     }    /* end cycle */ 7 |' C7 E4 k) B. g5 H- F
85     out[0] = ntoh(y); / Z) @2 n. I9 W8 ~3 V6 g
86     out[1] = ntoh(z); , O: ^' G8 }1 z/ t6 E8 H( b
87 }. h+ j* Q" t! i! V
( \6 x- A& ?$ l* }4 c
需要说明的是TEA的构造函数:
) |. H4 N9 m! s' M5 f6 RTEA(const byte *key, int round = 32, bool isNetByte = false);
' w% s/ W) _. v8 ^1.key - 加密或解密用的128-bit(16byte)密钥。 ( z  e' L$ U" |8 {/ n
2.round - 加密或解密的轮数,常用的有64,32,16。
$ C2 o& k6 }5 T1 }$ y; W6 r3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 9 I% O1 c  ?$ x8 j

; z- Z1 i. a3 k( E- l; Z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
! ^0 b* C" |" B: j3 [2 ] 2 #include "util.h" * o+ m3 \. t! A* C, C5 u4 E- i" Y
3 #include <iostream>
5 Q8 E' _! q, r6 [; B 4  
8 V# u$ w# u3 |' w& ? 5 using namespace std;
/ ~7 Q- B9 s' `9 B 6  
. c1 c- n7 J- l: I6 c! x 7 int main() { 2 l$ T' V/ r7 w1 C0 L
8  , x2 {( L* I/ p+ @
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 0 ?" h3 R- u+ L7 Z
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); / U, T5 l' U2 T' o- q' m7 |
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; & B0 f* D  Y% Z5 G6 i% }6 l
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];   d" e/ S1 d: j
13  
! d9 ]8 _9 O- W& ~! b# L1 ^" |14     size_t size_in = hexStringToBytes(plainStr, plain); ! F& b7 i% f) l' L
15     size_t size_key = hexStringToBytes(keyStr, key); 4 `9 K3 Z# z5 ~% N/ I% x4 n# Z5 L
16  - I- @, D/ d  x% r! ]) E' @
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 3 |2 [7 ?% Y: C6 m8 P" R. {
18         return -1;
$ g+ x: P' q. `; L+ W% |2 z19    ?" G$ f- Z& N; I; b* s
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 9 _( F, {, F0 w7 v, K
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
9 k  x' d, L, j22  
- J& u9 Q# P8 U) q! A0 l23     TEA tea(key, 16, true);
3 \) h* y6 M" b! d+ j24     tea.encrypt(plain, crypt); & G2 z, X8 r' d! x# i2 o
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
- Z) [) @# @+ g% T0 U% U1 ~26  
$ R; l; K6 W5 k4 `% h! x. T27     tea.decrypt(crypt, plain);
2 g# O9 N4 K: r' s" n28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; $ i, }5 S: m: s+ v% q
29     return 0; 2 r, z- G. e; Q: ~
30 }
& i- v8 I  J. o- V0 L1 V0 e9 [: G! E, y; I" y
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx( c% Y0 ]. t4 s. N. {: X5 l
运行结果:
2 |4 z6 z7 J5 u; FPlain: AD DE E2 DB B3 E2 DB B3 / l2 G' D# _0 D" w+ N; R
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 7 V3 O7 N3 H, g8 U  b' G& P
Crypt: 3B 3B 4D 8C 24 3A FD F2
: K% V" K2 _- c, w* J- H, SPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 16:04 , Processed in 0.018524 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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