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

使用道具 举报

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

unit.h

#ifndef UTIL_H - l1 E$ ^5 d! W( _, V% }" O# L
#define UTIL_H
$ N: E( J3 w; g0 e: l& w- }- c4 `/ c& T2 V, a
#include <string>
' y' v2 L% R! V' t# P; l; j  }; |#include <cmath>
& V( {; V& c# ^5 ~3 \#include <cstdlib>
5 F( M% A; t/ W4 F5 _   j9 V, V" a. Q& |
typedef unsigned char byte;
' ~# I3 V; N; @- Itypedef unsigned long ulong; 8 ]7 Y: C! @# z
& H  _% P( |! j& S
inline double logbase(double base, double x) { + \; m# K% C# u- D# h
    return log(x)/log(base); ! j" A4 G8 [! q1 o5 j
}
: {$ s8 @/ k$ H* f. M& r; h
2 F6 n+ \) z. V/* # Z3 a, m2 d5 Y2 R2 e6 W( B
*convert int to hex char. * ^( D, G! L" H" L) c8 s  I; _
*example:10 -> 'A',15 -> 'F'
* r6 b1 _+ u0 `5 g  X! x5 T*/ ' q; p8 [3 e7 J' ?2 @
char intToHexChar(int x);
+ f) q5 v. _" H. K5 M- L
' g2 E' `* `7 _0 Y& n+ O/* 4 z# R+ i- h4 ?& H. Y- A
*convert hex char to int. # l$ G0 f+ ?$ K& I
*example:'A' -> 10,'F' -> 15
# [& o% [9 Q& v/ X: _  Z* u*/
$ n% ^5 t0 t4 q5 ~int hexCharToInt(char hex);
( ^7 ^2 t8 S4 l
' e# p" K/ x  Q$ T4 P" e' K& r' _using std::string; ! X4 \6 j8 D* |6 T0 b% h1 ~  H
/*
. O5 I0 {5 {: Y, C& s! B*convert a byte array to hex string.
5 A! |5 ?4 S+ \! N*hex string format example:"AF B0 80 7D" ! F5 z8 ?# c8 Y$ h% y5 X
*/
) A6 z) K( S8 e( X! _string bytesToHexString(const byte *in, size_t size);
7 ~+ C1 k5 E8 q! G7 H; N
% Z) g3 x, `7 Q/*
" d# [7 m. d6 N*convert a hex string to a byte array. 1 {: V8 V" ^  j7 Z0 A
*hex string format example:"AF B0 80 7D"
, v8 v% ]( z/ c8 T' w7 e*/
6 O$ u. d3 I8 a" f6 Ksize_t hexStringToBytes(const string &str, byte *out); ) E/ _- |% ^3 L: |( h* s: a* O
5 y! n0 s" Y  [! w1 r; c
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
4 M% Z4 n: T5 K" I" [- P#include <vector>
7 f7 C& V* P* G % t8 S" J* r$ ]
using namespace std; " n; a2 U% T1 a
/ G, X3 w; a5 L! x
char intToHexChar(int x) { 7 X( Y( G2 M* b$ y! k
    static const char HEX[16] = { 1 F: `; ]5 q( H) L1 _
        '0', '1', '2', '3', 1 d3 U* R- W8 N- W8 y
        '4', '5', '6', '7',
. u; V1 Y0 }) B  r8 e) t- O1 h        '8', '9', 'A', 'B', , {# \( o* C5 g' D+ F. R: R# j2 L. @/ ?
        'C', 'D', 'E', 'F' , S4 l6 ]) S  y5 p
    }; - d1 a7 o2 w7 l! c+ u5 S6 n
    return HEX[x];
7 w$ v) C1 X$ K. e0 }} " P: L1 N5 a9 z! q$ D1 b
& o/ O+ x" v& ^! v; m. h4 t
int hexCharToInt(char hex) {
1 x" @# |; q' G  f( R    hex = toupper(hex); ! Z8 _- X! U8 A4 Z: j' J
    if (isdigit(hex))
) L. C7 X) Q# V4 I. T        return (hex - '0'); # O- e, d1 @+ Q. h
    if (isalpha(hex)) " O- x* I0 t; T# ]* c4 _5 x  w8 y" N
        return (hex - 'A' + 10); . T) z% ]7 ^+ t/ n/ y9 {( z8 k
    return 0;
8 v8 o5 u. d; j# Z9 ?" Z2 Z# H}
' ^0 y0 R0 O0 M* ?) A
  D9 U7 `) }3 T! [8 K+ G3 vstring bytesToHexString(const byte *in, size_t size) { 8 l1 P6 c* R1 F: u7 o4 i5 y" r
    string str;
% q! {" Z# J9 K+ C    for (size_t i = 0; i < size; ++i) {
2 q9 F# {, \8 }& P7 y; }* D        int t = in[i];
% w* W# U7 e. h3 e9 P: e* [7 S        int a = t / 16;
2 e& X( a% L5 ^- }        int b = t % 16;
3 e  q" _5 [! B* a+ w        str.append(1, intToHexChar(a)); , c" p* z* T% O( j2 T
        str.append(1, intToHexChar(b));
6 |6 q$ Q8 m0 [* W8 g) s) c& I% z        if (i != size - 1)
. o! F1 u4 P+ q2 E7 T. x- Q            str.append(1, ' ');
' Q# ~) _  z, X! A3 ~! n" q% R+ M    }
% U; |. q% ]5 @* V" J% ?    return str;
/ C1 p/ v7 x% ?* g}
+ r' [+ s* S8 `! j2 ^
# Z) o; W8 t6 G& A1 ]size_t hexStringToBytes(const string &str, byte *out) {
: h3 b+ R; ]0 ^8 ~! {; s
; j. v& p2 `$ x# k7 r4 r: S  N    vector<string> vec; ; [2 O* r) Y- S& f, g
    string::size_type currPos = 0, prevPos = 0;
( m& v. c: K) u    while ((currPos = str.find(' ', prevPos)) != string::npos) { + g% n3 Q+ i; Z6 U8 u
        string b(str.substr(prevPos, currPos - prevPos)); 6 a& g3 g5 l# V- m7 L5 u$ R2 W
        vec.push_back(b);
$ a/ {% e% B# d6 `6 K0 K/ S        prevPos = currPos + 1;
* y5 T  V# f. |- J- D    } , r$ p2 ~) r3 Q4 I5 R1 H- }- n
    if (prevPos < str.size()) { 2 r$ b8 ?8 N& d5 P: V  q
        string b(str.substr(prevPos)); 6 i: C8 k! \+ ?4 l5 u5 v3 V
        vec.push_back(b);
. k5 [( D5 D: ]/ ^    }
2 A7 T$ m  x. \, A: i- ^    typedef vector<string>::size_type sz_type;
9 Y: p5 i" ~7 k) K+ ]. ]1 Y    sz_type size = vec.size(); ( |1 }& t- W9 I  [. n; v
    for (sz_type i = 0; i < size; ++i) { 9 E+ U4 L) t& w( f/ e0 H9 f
        int a = hexCharToInt(vec[i][0]);
9 U) x2 N  n3 i$ L        int b = hexCharToInt(vec[i][1]);
7 M; ~% j9 G0 Q  f* x3 s" Y        out[i] = a * 16 + b; ' _# Q0 v* V4 ]
    }
5 f  y  N; E; L! v    return size; 2 H* I% Z8 Q; F0 e& ^1 f
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H / K' t9 `# G$ L
#define TEA_H
. B$ g/ K" x& \4 J% o ; f/ z: Q# q+ t
/* # B# |& I) ^9 U: \+ q1 F+ P2 v
*for htonl,htonl 6 f4 R: ?/ F9 |6 W' \" ?  P3 }4 n
*do remember link "ws2_32.lib"   {. f. @8 w) A0 G/ N  @( o
*/
8 m- S  G6 C% H% h1 y, v. t9 k- v#include <winsock2.h> 6 e% m* C7 i$ \8 Y
#include "util.h" ' A! o( V& l: y4 C6 \6 n5 j, I
* f& u8 j1 a% M5 u) S
class TEA {
& I) r2 X( Z" Q4 M& ?public: ; n+ _) z& v2 a% a
    TEA(const byte *key, int round = 32, bool isNetByte = false);
2 E( H6 R1 q' {5 A4 B  f6 y    TEA(const TEA &rhs);
2 }5 z( s6 ]4 W' F    TEA& operator=(const TEA &rhs);   |4 F9 ?* j$ H* F1 F3 `9 {& U
    void encrypt(const byte *in, byte *out);
, B8 c8 A) U; K) H2 m# M    void decrypt(const byte *in, byte *out);
2 _( m4 p) E/ s# z6 S& Hprivate:
. Q: A0 Z9 U/ D. a, b. q$ v) E    void encrypt(const ulong *in, ulong *out); 6 B8 g, Q. ?, p+ R1 I
    void decrypt(const ulong *in, ulong *out); , S7 O! _  T+ f& B! Z
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 6 S; \$ z8 D! c8 Z+ N
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ) s; k. e& d2 B+ z* j" I
private: 6 J3 k/ U0 `3 S- E* b) e
    int _round; //iteration round to encrypt or decrypt
: m; ~8 B. F  ^) C    bool _isNetByte; //whether input bytes come from network 7 j/ X9 W" c  ~& S; f, x
    byte _key[16]; //encrypt or decrypt key - `$ S  Y" p; Y  P1 L
}; % Z$ O% e9 O( H" r: I2 c

  L, [+ g3 T: a& J! s% v$ G#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 1 A7 c6 f( ^* N9 p+ N
2 #include <cstring> //for memcpy,memset 4 U. _6 K' B8 Y& g: r
3  / v  T: j/ y* Q  j( v" X
4 using namespace std; # A8 @) H& @& _$ l$ V
5  
6 F+ O5 m7 q3 J: ]# o# ` 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
& R0 x2 u+ d8 l; N) \- k 7 :_round(round)
3 \  n6 v+ t1 t 8 ,_isNetByte(isNetByte) { , G( `, ?! q% a/ J" `
9     if (key != 0)
- n6 r9 [9 u* a10         memcpy(_key, key, 16);
3 S  J0 h# l8 o. O: v/ `11     else 7 U0 g; j! g* H  R& ]* B2 B
12         memset(_key, 0, 16);
; G/ [. [* W$ S3 H/ ~; ]" R13 }
1 T9 ?  A6 P" ]3 t5 Y; W14  
9 L) A; u9 r3 Z" R3 U1 _. u15 TEA::TEA(const TEA &rhs)
/ }, x0 }" ?2 x+ u. K6 |. z  p16 :_round(rhs._round) # e7 M9 F9 ]: G) L. ]5 j( s+ v5 ~
17 ,_isNetByte(rhs._isNetByte) { * I8 [7 y+ B8 i. p/ U
18     memcpy(_key, rhs._key, 16);
; k/ }5 V# J5 i$ j( Z! Z19 } ( ?( \+ {+ S  u$ j; S3 z1 Q
20  # Z1 d, b8 D9 b( `, p7 K
21 TEA& TEA::operator=(const TEA &rhs) { ! p7 W- Y5 _# w+ d) l* k; _
22     if (&rhs != this) {
2 k2 E; l( ~0 @8 Z1 a# T7 y23         _round = rhs._round; % s8 R# e; n+ q# f* _; ]$ L
24         _isNetByte = rhs._isNetByte; % z/ v; w, ~3 Z8 R7 ?- |# ^. ^
25         memcpy(_key, rhs._key, 16);
, ?6 L5 C# O; Q3 a9 |" Z* q5 g& a26     }
3 O% |6 A# H8 g( |. N. f27     return *this; 4 A0 F- S0 g4 B$ `* s
28 } ! a" U% N" p8 \( B. C
29  : x' c% b, I8 H+ y! `, F
30 void TEA::encrypt(const byte *in, byte *out) {
- T. A5 W2 ~* p! |31     encrypt((const ulong*)in, (ulong*)out);
0 b( C- |; l" r4 h( u; y32 } " U) T: O3 X" z0 k
33  / U# r: ^) L* U" [+ K
34 void TEA::decrypt(const byte *in, byte *out) {
" W& s6 i. \. K2 {: Q' ~35     decrypt((const ulong*)in, (ulong*)out);
  c! q1 }- G$ X& q1 P: J1 a) m36 } . x4 y$ y+ ]3 N. d! z5 o# ~& U: E  E3 Z  \
37  
$ A9 E% Q6 @: i# X) G9 u; `( b38 void TEA::encrypt(const ulong *in, ulong *out) {
/ f1 G/ k$ _" X$ v( j( C6 s39  
) _+ v5 n& o8 m- ]" Y40     ulong *k = (ulong*)_key; % h  U5 u+ x" Z8 }) k9 d8 m. W
41     register ulong y = ntoh(in[0]);
- h5 ~, h# J( E0 \" @, w6 |42     register ulong z = ntoh(in[1]); 6 Z( X. C5 E" T. M
43     register ulong a = ntoh(k[0]); 0 a- V1 x" j( b
44     register ulong b = ntoh(k[1]);
' y* F3 A) e$ r* C7 L* O45     register ulong c = ntoh(k[2]);
, R& c" h* i7 w9 |. Z46     register ulong d = ntoh(k[3]); - ?  g# x9 W, U# `1 {8 j; W
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ K6 z  n! R$ t# \5 S' a' j48     register int round = _round;
! |! Z1 p" D& Q/ ?  f+ ~49     register ulong sum = 0; $ G0 S; {5 H# M0 n# F5 w
50  
# F/ ?# L6 {% _: z51     while (round--) {    /* basic cycle start */ ) \" D' R) {" x8 i
52         sum += delta; ) ~$ F+ g6 _& G8 y. ~+ o
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
4 U* N$ v2 j1 [7 ~6 s54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
* [. \# H/ b* z55     }    /* end cycle */ 0 v+ Z) C1 ^$ `2 W' n8 L' w
56     out[0] = ntoh(y); $ M5 I6 A6 k( V4 ~* X, U
57     out[1] = ntoh(z);
9 }% \" E8 D( o8 J* a9 g58 } 7 H" M2 I8 e5 B
59  
) q0 }9 \9 ?$ Q. F% Y60 void TEA::decrypt(const ulong *in, ulong *out) { ( y/ O$ n7 o% j$ F, ~
61  
' B  Z+ L7 b4 Q2 P62     ulong *k = (ulong*)_key;
' z0 T9 w2 X0 Z( v63     register ulong y = ntoh(in[0]);
/ p8 T* A$ u( f) n- i( K64     register ulong z = ntoh(in[1]);
4 ~% o! J" H5 e# |9 O( f65     register ulong a = ntoh(k[0]); ( U8 f4 b$ Z( Q: M+ r& y
66     register ulong b = ntoh(k[1]); 7 L2 I2 e0 n* x
67     register ulong c = ntoh(k[2]); ; ^) H  W' u) M$ l9 ~; B$ l
68     register ulong d = ntoh(k[3]);
0 P! B: d0 Q; u' ^6 k69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ : N% R# O, V! d' G8 R
70     register int round = _round;
" X# [* {7 D2 e' ~& m) V71     register ulong sum = 0;
3 Q6 J% t; s/ f, Q, _. M) a" [9 q72  5 o& ?; z/ H+ M% X& r
73     if (round == 32) 4 o9 o. m" o' V$ A. L$ o# o- s- |
74         sum = 0xC6EF3720; /* delta << 5*/
  e( m. p& |! U& o* c) J( Q75     else if (round == 16)
; K  I5 n. y9 S+ g76         sum = 0xE3779B90; /* delta << 4*/ 0 y. k- o% g$ ]  l8 q
77     else 2 B) h0 O1 w0 \3 u, z
78         sum = delta << static_cast<int>(logbase(2, round)); " \! d; s% ^6 |1 A' h/ F- ?8 Z
79  & q9 H5 F  N. n, ]
80     while (round--) {    /* basic cycle start */ 7 q/ o0 m7 \- s3 }" v9 w5 X: j; o; o
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
# f; ?2 ?# a$ [& |82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
* d2 g) V0 f, U. D( ]" `( x# B) W" s83         sum -= delta;
( Z2 H9 ~, A0 w! a+ B% T84     }    /* end cycle */
5 A: {* {+ Q) z! [0 E85     out[0] = ntoh(y);
+ y1 u4 X  R2 q! _8 t+ i" p, Q86     out[1] = ntoh(z);
0 O% U, S8 s% P: y: }* W+ F1 j87 }3 K4 h1 F% ?" D0 c
( D% n# \1 }+ N& ]
需要说明的是TEA的构造函数: ( w( E3 j% N( V$ o$ x, B
TEA(const byte *key, int round = 32, bool isNetByte = false); 8 n: E, d. |5 b' E
1.key - 加密或解密用的128-bit(16byte)密钥。
$ n) o% [2 q% c1 [2 W7 }/ F) y2.round - 加密或解密的轮数,常用的有64,32,16。
$ B  W0 K0 V% V- V! `3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
0 [% u, ~+ H( [( |
0 _4 p4 i, b9 P- c* l. O) \5 C2 x0 A最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" % v( v/ R+ ^% m0 h+ w, a# x; O
2 #include "util.h" ! Q9 m" R, y5 S$ d! y
3 #include <iostream> ( ^7 B# r( _9 U' D3 w' E
4  
9 `2 `) t' J- j0 S 5 using namespace std;
$ ?; ^/ ~; @# B/ x8 }3 i 6  
+ c" L& r8 P  G! D) y: z 7 int main() { : h; N  U( ?  |2 n& d1 c3 P3 h
8  
7 D) o) y% I7 {* P# V' t; g) T  ^ 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
- z' m& p/ S4 [! A% N: [7 b% e10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
$ R: M2 \  j' b# e4 ]11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; " X, x" ~9 ?1 @# s9 H
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
) l  y4 r2 H9 k! ~( I) W  ~13  
9 K0 @5 O. c( U14     size_t size_in = hexStringToBytes(plainStr, plain);
/ {3 H9 j: [- G0 D% T( R' ^15     size_t size_key = hexStringToBytes(keyStr, key); 0 J! [0 m' a/ f  i5 M4 _6 z
16  
8 R5 x  ~/ B4 |  d17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
( @/ m4 S& i) V# l8 _/ q18         return -1;
9 d' E2 }. F  X' g19  . C/ E9 J3 w1 {0 j- ^
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 8 V2 x# [2 W3 y* H# [
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 3 H& a+ Z$ Q: d, j! j( v
22  8 P: F/ Z' G( ~- L( H1 Z; l  ~- o
23     TEA tea(key, 16, true); 0 ^2 Z! u2 s& o6 t7 a
24     tea.encrypt(plain, crypt);
# Y# V+ }$ y6 g2 z: g8 C6 d8 R4 y' j25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
: `7 ]" h1 v9 o7 F7 F" a+ U& T+ B, {26  " D0 g) s; R" ^' G4 r3 B0 y
27     tea.decrypt(crypt, plain); , a. ^' F3 N1 E  g8 u+ w
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
7 m8 k0 f3 Z$ b" s- q5 d5 }/ y29     return 0; # }1 _6 X6 {; y0 p5 o. Z/ e
30 }
/ Q5 E7 ~8 Y) U- M0 M  i2 K
8 M. ~+ g+ |  N. \本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx% T0 k; S* G  ^
运行结果:
7 N& v7 u* d3 D4 p8 aPlain: AD DE E2 DB B3 E2 DB B3
% ]1 r0 @0 E& A. a! OKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
4 x) L. r* y% d, U% rCrypt: 3B 3B 4D 8C 24 3A FD F2 + |8 H* m8 i0 e
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 08:41 , Processed in 0.020946 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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