找回密码
 注册
搜索
查看: 38829|回复: 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轮):
& _6 X. O. R7 ^% l. V微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
8 Y5 Z3 z7 s3 r# g+ L! HTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 5 L- F3 e- I1 v  w9 O% M. }
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
5 W& q8 w: q6 w5 @: A5 r$ Q- f在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ; ], F, p4 w" [
在 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.   Q/ A. C6 L6 X) `0 A: D9 H
  2. void encrypt(unsigned long *v, unsigned long *k) { , ?4 F) q) A3 [6 c/ O, ^6 C
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ + Z, f: K! ~2 n2 n- L1 h6 i- h- w  E
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ - T7 }; s2 l/ o, q! e* p& c* t1 Z
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 8 j% G7 n8 O+ A* n0 ]) r  x( O
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ! m7 I4 R. o2 M4 U8 ^
  7.          sum += delta;
    . N4 ^. m: Y4 w4 M7 z. i' m
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & q9 n- L. R4 g  z5 @) ?7 Q
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    . ^( r5 r$ \4 T1 c% W2 Q% s6 l
  10.      }
    0 E3 N) c( Y' }1 V
  11.      v[0]=y;
    ! e* }+ m( z. D
  12.      v[1]=z; $ o) U' t' T) V2 X3 s* @
  13. }
    : C/ [; R3 e9 i( d
  14.   # W& |; D$ g/ c4 \7 |/ n2 N" z" h
  15. void decrypt(unsigned long *v, unsigned long *k) {
    7 I6 m/ E# g5 M4 Z
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    , U/ h9 Z0 c6 ]: v% U8 A
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 6 s0 {  B+ J6 ]; ]1 @$ |# J
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    4 R& q, t# D+ x2 G# W
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    2 J6 R5 d0 @& r8 _
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    $ j  R( z* c; a* `$ J
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); . y- K" o9 l7 l6 z; y
  22.          sum -= delta;                                /* end cycle */ 0 F+ b' J9 \6 l4 e7 `3 }9 T) q9 [
  23.      } - @% {6 N8 G3 k2 r. Y7 D
  24.      v[0]=y; " C' C& R& Y& x  H
  25.      v[1]=z;
    4 k7 ?% G# B. O
  26. }
    7 L$ v. g! Z# J
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
. B' r/ o+ U8 \* Q. i; c#define UTIL_H
/ N5 c+ a5 X$ v/ x. R3 d3 m
0 D8 S! b, ]8 \# x) o9 T# `#include <string> / ]7 G( M7 q1 D5 G( q
#include <cmath>
% m1 M! R, f$ h; E- ^#include <cstdlib>
  H0 u' G8 b4 |, o' h 5 g# m1 i4 b8 D: I# T$ T# k# }( m
typedef unsigned char byte; 8 x! P! |5 X4 R& G* U
typedef unsigned long ulong; # y) k: _& L7 a9 g) |

+ P. e# {% U& A4 ]9 f) J' ^inline double logbase(double base, double x) { 1 V, ?5 d8 m7 Z$ r. ^! C% ?4 t
    return log(x)/log(base);
$ B9 W! C7 g+ p4 X" T" ]}
: e: D+ J  l) |7 J' `5 ]2 c * @" g) X6 B# y6 t: x# Q
/*
0 H. t* |1 _$ g0 X/ n5 y*convert int to hex char. ; i, o6 @3 t6 M$ E0 C: S2 T/ N0 j
*example:10 -> 'A',15 -> 'F'
# D0 z4 a: z5 N8 Q*/ & m0 ^0 f7 \& W
char intToHexChar(int x);
6 {, o6 {  T5 ~; Z 7 J" l+ U9 N* f5 l8 x
/*
. V1 {  S& ?  _# V*convert hex char to int. & ?  V9 S. y, j+ h* v% r" _
*example:'A' -> 10,'F' -> 15
! X8 Z( ~* Y) O- B*/
* n3 o; k% O- T; m+ dint hexCharToInt(char hex);
, o  n6 ]6 O, V
( S5 F- C6 b/ ]' z+ l5 Y7 _& ~using std::string; / u0 g1 ~  B# T1 _) F9 I0 c$ x( a. k
/* 6 z! r" V* d2 D2 C6 v2 |
*convert a byte array to hex string. 6 N, J" L. x  B5 k
*hex string format example:"AF B0 80 7D" " H1 M4 n; I$ n, W+ M
*/
& ]. J1 l/ @5 i( A# ^string bytesToHexString(const byte *in, size_t size); # \$ e! e0 ~4 p* u5 z: N- z& j

* e: V- i* C5 O; w3 e3 z/* 4 E0 i( p" M* q. c% f
*convert a hex string to a byte array. * Y  d+ J( ]+ }0 e: w! ^* d
*hex string format example:"AF B0 80 7D" 6 W) ?3 A- U9 r
*/
" z* h: K+ I; l* q5 `; O! ssize_t hexStringToBytes(const string &str, byte *out); 0 x" j1 k* P1 `* P5 N
. X, |' Y5 ]( e% c
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" $ o- p. B+ L- }, [& c% Y6 C
#include <vector> : Q* O0 f# P% T- e; U  j3 `+ A1 A
3 s. K$ t( h: K& M( |
using namespace std;
5 ]* q: Q% N+ x/ C
" i. c1 v8 N7 \" |char intToHexChar(int x) { , o  k' P7 j% ?" A" r+ C
    static const char HEX[16] = {
# h, Y: \; i  t8 q* u        '0', '1', '2', '3', " p: Z0 Y  M# ?( ^, ~" c
        '4', '5', '6', '7',
+ j  T; _3 k- `- R: M        '8', '9', 'A', 'B',
5 [* `. z* x" k# t0 q        'C', 'D', 'E', 'F'
* f' d0 @3 o% a3 L0 K, o    };
8 {9 O. |% m9 _6 ]    return HEX[x];
2 F) D) b2 e' @! l+ b3 B}
( G" J& b# t$ ^ , t' n8 V" E% E) m
int hexCharToInt(char hex) { ; P7 d+ l5 T6 @$ L+ ?  e% P; I: [
    hex = toupper(hex); 8 {% m3 _" x/ p/ k
    if (isdigit(hex)) 2 \; g: k- C: d# \& _9 l
        return (hex - '0'); - ]$ ^5 L0 J" S+ n+ G! f6 [' R
    if (isalpha(hex)) 0 X- q$ S- J) Z  U: c, A# ~" `
        return (hex - 'A' + 10);
& T( R& Q  q" W4 s  |    return 0;
0 i; r( m; P3 I5 E} - q, p: h2 d+ F* x5 R
0 \$ [) b( N; Y% S
string bytesToHexString(const byte *in, size_t size) { 8 z6 Y- i) G! f4 L
    string str; 2 q4 N" p4 v9 Z) T' d
    for (size_t i = 0; i < size; ++i) { - I- ]) B1 ^* [1 \- L- k! e" Z5 I# _6 \
        int t = in[i];
" H1 M. i! `/ |: K9 p        int a = t / 16;
/ |3 ?- M, c; g) q8 z  e, ?2 j        int b = t % 16;
# d3 I( p  t& t        str.append(1, intToHexChar(a)); " g: N# Z* l) X0 P
        str.append(1, intToHexChar(b)); 5 j% Q) A5 F3 q9 ~0 d$ L  s8 [
        if (i != size - 1)
* T0 }+ Q9 \5 V3 t& L# x            str.append(1, ' '); 1 G5 O; w& V" p, I3 l8 I
    } : W/ d/ q) H" m6 p7 Z: U) q$ n- [
    return str; 8 C; q" Z  e) X- X0 i
} 7 n+ z4 C% |$ w  a8 x& ]" H

5 _$ d( `# a2 H1 o" |* Dsize_t hexStringToBytes(const string &str, byte *out) {
! C, K8 P7 X" l2 q
7 C- L, h& Z9 a4 P6 v# ~    vector<string> vec; * b6 p. U3 l$ r3 Y9 G5 {5 M5 L
    string::size_type currPos = 0, prevPos = 0;
8 T; y' S8 v, Q; f& {$ o    while ((currPos = str.find(' ', prevPos)) != string::npos) { 0 p) P, N) B' v' \
        string b(str.substr(prevPos, currPos - prevPos));
: F; e6 X9 o9 F. ^) G: P        vec.push_back(b); ) b+ Y. _  ?8 m9 e
        prevPos = currPos + 1; 0 j) i: q* l) j7 c8 H7 o
    } & u" K% e  f. m0 r+ C2 E
    if (prevPos < str.size()) { ) b9 h) c6 Y& }" `: A% q4 g% q4 B) z
        string b(str.substr(prevPos)); $ _! V* k* I% G, `. V3 @
        vec.push_back(b); + I8 A" e" Z$ J5 c3 A1 n$ u
    }
. ]3 ?: X: P( g6 J! o5 j    typedef vector<string>::size_type sz_type;
: @: V- [0 f8 ]    sz_type size = vec.size(); 3 R1 l7 m& H) U/ Y: @/ P  C* k# B
    for (sz_type i = 0; i < size; ++i) {
, P' ~; l: n, X/ m) q        int a = hexCharToInt(vec[i][0]);
3 l* L5 r$ V: R$ Q8 o! P% |- h        int b = hexCharToInt(vec[i][1]);
- h+ z1 b# d. a        out[i] = a * 16 + b; 5 s2 q$ U$ S. |/ W+ N; M
    } $ w3 v; ^  {" Q/ g+ ^1 Z% ]  r
    return size; 6 J1 h. s' ?- r2 Q- X& t" L
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H / G: j* n; @+ F9 e: i' Z0 j! L6 j
#define TEA_H   J- `- |7 Z/ [
! N' h  b7 X1 ~0 ~' R- w
/*
  \( O6 t0 K, G% P*for htonl,htonl 6 r" b6 }: _( p5 t- i
*do remember link "ws2_32.lib" & N! ~! q* Z, R/ f9 w/ j! Y
*/
8 u- A0 I6 V. \7 Q' W0 \6 G#include <winsock2.h> ) `  E9 h% Z) K9 z, F  j( f
#include "util.h" ! Q: B! d- Y9 n1 H1 d0 h5 @
$ j* c/ Y# ?1 v& x) B) M) @8 Z8 T
class TEA { 9 ?, b* D( B4 C! ?% g) D
public:
9 {4 S1 k0 k# C1 @5 q8 P+ X    TEA(const byte *key, int round = 32, bool isNetByte = false);
! T6 F4 r4 i: O0 X' B( x/ ]! Z    TEA(const TEA &rhs);
& A9 w" {/ k1 J9 C' g    TEA& operator=(const TEA &rhs);
( H( S: ~! m4 j5 X    void encrypt(const byte *in, byte *out); 5 Z- l7 G0 _$ s4 l, |) k
    void decrypt(const byte *in, byte *out);
  u$ k! t3 z1 J) [: M8 s- }private:
4 I7 A% h' d3 s2 p3 K6 _6 j    void encrypt(const ulong *in, ulong *out); ; h& F* q$ x: o
    void decrypt(const ulong *in, ulong *out);
' O0 D5 @) I' g3 m5 J    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
& E$ D, V0 K3 {3 z5 ^    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
  n/ ^! P% o5 t* j1 ~private: # z7 b5 A+ Q) E* q+ A4 V* {
    int _round; //iteration round to encrypt or decrypt
+ C6 A+ K7 \, g" q' W; T$ ~    bool _isNetByte; //whether input bytes come from network + W9 R) Y. I' Z
    byte _key[16]; //encrypt or decrypt key
8 ~3 q. W, _2 K: y+ L};
0 ^0 X4 @( ~$ Q% X9 E9 X5 y! f' Y" r
( g( y( D& H7 a5 m) H* x5 V2 h#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
0 `% U% d3 |% b7 g5 w 2 #include <cstring> //for memcpy,memset
0 Q: A* D( Y5 E 3  ' v% u' X( R! D* S! }5 j1 n
4 using namespace std;
8 Z' C2 R) C( ?9 ^# l& B 5  
2 ]  ]8 U: i7 Y5 r- V 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) , y+ ?" ?2 \' v! y$ B* ~' V; @
7 :_round(round) : w+ C7 F+ x  h" V2 n( C
8 ,_isNetByte(isNetByte) { : j+ S* A. u1 A+ y
9     if (key != 0)
& m; o0 x  |6 n) k+ G) A, A/ ^10         memcpy(_key, key, 16);
3 F9 v3 |, P  {) ^  A  M* a& V11     else 9 r  n- n+ ~. ~1 m9 E: T
12         memset(_key, 0, 16);
' E! L" P/ y  _- e& n' _* T$ }+ P13 } - c5 a. O4 w* ^* q  @* ^) O) X8 |
14  : g4 v' _. X1 u( }
15 TEA::TEA(const TEA &rhs) + \( \  ~5 H; f4 Z" D1 x2 G) s& ]; {
16 :_round(rhs._round)
' e- V  [6 t- Y: U4 `17 ,_isNetByte(rhs._isNetByte) { ( ]3 \% W- w) j, {( D& X
18     memcpy(_key, rhs._key, 16);
2 N, S7 g& N. M5 e9 w19 }
" w9 W: D+ [3 W& G5 a1 _8 n+ \* m# U20  
1 i& P  B1 V- M6 B7 r% p+ u21 TEA& TEA::operator=(const TEA &rhs) { ! H6 K+ q8 g! t! f
22     if (&rhs != this) { * G/ U6 S1 N: c- d3 A
23         _round = rhs._round; , G# @9 c4 \: p$ ?0 ?
24         _isNetByte = rhs._isNetByte; + C1 [! Z% i% N' m) v( F
25         memcpy(_key, rhs._key, 16); ' y% s4 G0 l! a) |2 b" \5 t4 K
26     }
" d  e- N) f' a27     return *this;
9 M; \: F" f5 E9 Z+ `28 } 6 \- G) f  G& S: F: _
29  6 _" |4 I: U9 `
30 void TEA::encrypt(const byte *in, byte *out) {
/ y& I. ?8 y* v8 o* [% Y! g31     encrypt((const ulong*)in, (ulong*)out);
$ B6 W# w) O4 h/ n7 H32 }
. x. F* ^# c+ |9 ?* V33  7 ~) Q5 w: K' q+ Z
34 void TEA::decrypt(const byte *in, byte *out) {
/ ~8 Y! E9 c+ Q& \35     decrypt((const ulong*)in, (ulong*)out);
& V: K( G9 v1 l2 C/ E* |  C2 h' S36 } . k: p+ \1 q$ a: q" c7 i( u+ Q
37  6 A( J$ O2 ~0 t. ^8 R! t  P
38 void TEA::encrypt(const ulong *in, ulong *out) {
* N7 O( Z3 ]4 h, t% T2 \' E39  5 o& _7 a; E1 u# [  {
40     ulong *k = (ulong*)_key;
# O# C  s# r8 j+ \2 }# }41     register ulong y = ntoh(in[0]); ' B1 Y% N# y* n% F( g( @
42     register ulong z = ntoh(in[1]); * _& {; t7 W: }7 P" b: d' V
43     register ulong a = ntoh(k[0]); ' G2 G2 [$ a. |9 W7 O7 e: i+ F$ U9 R- _
44     register ulong b = ntoh(k[1]); $ ]; k7 ?, S7 g. Q- A# A
45     register ulong c = ntoh(k[2]); , C3 Q# |# I8 A+ ?
46     register ulong d = ntoh(k[3]); # C7 z! t, z' M- k
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
* A* \/ }% c# p48     register int round = _round;
9 l( f  K" ~% z. R49     register ulong sum = 0;
+ j5 H3 I; i" w  ^4 j50  , u; a" m; I. h  i5 h2 K& ^5 B
51     while (round--) {    /* basic cycle start */
1 o" v7 F! r% L! {6 L# k52         sum += delta; + |- B- R) \7 s$ L7 w1 r9 |% @
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); : ?" P; ~. A7 _- Y4 h
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ( s. v5 T6 i: g3 ]% D5 x
55     }    /* end cycle */ + U9 ^/ N! Z: L2 d* j: N
56     out[0] = ntoh(y);   q, D  X5 a' f) F
57     out[1] = ntoh(z); ) ]" K( D$ t1 _5 `) {0 I
58 } * H+ O' s. o/ l$ R1 Z
59  
' [1 |7 A/ w7 C9 ^+ I0 [2 T- b60 void TEA::decrypt(const ulong *in, ulong *out) {
9 d; O- V: ~9 y! _6 D61  
8 C& _) `6 f* E! _5 ]- d62     ulong *k = (ulong*)_key; , I; N+ J8 g5 @( [' l
63     register ulong y = ntoh(in[0]);
" _) s1 l, M6 D" o: I0 y64     register ulong z = ntoh(in[1]); " v# D; q; f& v& S+ U, V
65     register ulong a = ntoh(k[0]); 1 }1 d, y# q, W, ~, j
66     register ulong b = ntoh(k[1]);
% i: l! |& w: p0 O  h7 y3 Z67     register ulong c = ntoh(k[2]); * v$ S0 a6 H" R( O
68     register ulong d = ntoh(k[3]); 3 W' K) }6 Y5 {5 `
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
5 }% P1 \6 z  a& l  _70     register int round = _round;
3 F: j9 y# P+ |, j3 q71     register ulong sum = 0;
0 s" X, }; ^( b" K7 _$ _72  
( ^* `! S3 U& p& r2 J. p73     if (round == 32) " \) [! Y1 b2 c& t- ?( G9 v
74         sum = 0xC6EF3720; /* delta << 5*/ " d8 w% X% x% D+ g
75     else if (round == 16) ( {& J6 l* N. R2 \
76         sum = 0xE3779B90; /* delta << 4*/ . _. b) A& ~7 O% @5 G
77     else
! z3 b5 E, r2 S  J( J0 p9 i( y78         sum = delta << static_cast<int>(logbase(2, round)); 8 B1 `. G9 T$ r$ k4 u% J! @
79  ; R0 l' f* k% \& _0 |  z2 B
80     while (round--) {    /* basic cycle start */
, ^8 a- S) ^! I6 _8 `81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 5 k3 v1 d: g# {7 K0 x
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); & y8 L( M6 j* v( ]+ g
83         sum -= delta; 8 |" r: G, X, b
84     }    /* end cycle */
7 y" y+ u8 G' _  ~5 v& E85     out[0] = ntoh(y);
1 @- M1 p: j, ^  L5 z3 w, \6 g86     out[1] = ntoh(z); $ d& U2 v. x! e, \, N
87 }
# C2 B. N" ~/ v! T$ n5 }5 k
& w" ]; N5 Z' R需要说明的是TEA的构造函数:
! T8 `% L9 H& a% F$ \$ _: \" XTEA(const byte *key, int round = 32, bool isNetByte = false); & C2 y0 o! x7 n1 v! t
1.key - 加密或解密用的128-bit(16byte)密钥。
" Y2 R7 {  B, ?" {% Q  a! ^% [2.round - 加密或解密的轮数,常用的有64,32,16。 * W1 O4 {( ~* f* l
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 4 K- ]7 ]4 s/ e5 ~! {
7 N5 N7 C, M+ G5 {8 u
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
7 o, o* k) Z5 e9 r/ Y 2 #include "util.h"
" S# |% x8 [" Y. O$ B 3 #include <iostream>
" E0 U# c' h3 L9 n( A6 q 4  # m0 G' M  c% J+ _5 s  s
5 using namespace std; ( w1 Z& R+ s4 x3 ]( M) S
6  
9 {6 Y* G6 |( f- N! Y 7 int main() {
+ l6 {% Y5 J4 q1 V 8  
; Y" N. A* J- i" w% K* M+ I 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); - ~  c/ ^2 O5 g- V8 c3 v4 U; i
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
' y+ j, g/ I. }! p2 s  D11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ( C+ I# u, g, ^& T7 J; h! N# q; a. K
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; - k& Z9 s, t9 I4 J3 c8 l
13  3 r7 h; r0 n/ o- m% M
14     size_t size_in = hexStringToBytes(plainStr, plain); 2 Y: F! l. a7 J) F! v- D) E
15     size_t size_key = hexStringToBytes(keyStr, key);
; G$ r0 H' L9 J  d6 L7 t# o16  / j& }) H/ G# \
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
/ V7 r- y* e/ i) a/ d& Y0 [5 c. {18         return -1; ) ^8 ^; Q- T* b% m, [! K' e+ s
19  
6 G, A, w* a+ H* d. l$ j20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 0 D* p5 q( v9 m8 a" c; E. M1 V/ A
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 1 ^3 a5 m) l* K1 t" x- W, d* K) }; @
22  
0 D$ X$ R" U& I. z/ }23     TEA tea(key, 16, true);   C! S- m' y% c+ C
24     tea.encrypt(plain, crypt); / g4 c' L, A9 V6 B! j
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; " u+ b5 Y& k  _& d3 T  ]
26  
% G0 q9 R% R7 j: Y- _- X* K27     tea.decrypt(crypt, plain); ) }6 s) ]! U9 K. }* y5 Z
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
7 q. G7 B+ [9 g; e/ l( O5 B29     return 0;
: k  u5 W% B5 y7 i! ~9 X" _30 }* l4 |! I5 q; G

0 ~7 h: z4 s- c4 V' [* @7 m本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
; T2 x2 y, |5 S运行结果: 4 q! j5 W3 G0 f. x
Plain: AD DE E2 DB B3 E2 DB B3 5 A% C' W9 _9 q5 R% S+ l! E! @8 @
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 2 |$ m& I4 x: U, }2 X
Crypt: 3B 3B 4D 8C 24 3A FD F2 3 k. K# q. k3 @
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 22:49 , Processed in 0.020344 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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