找回密码
 注册
搜索
查看: 37809|回复: 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轮):$ H( V& v2 g% `$ f1 X, _6 ?
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
  I) O+ S. s$ ?2 h8 a6 a6 ^* BTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 7 E" H' r2 }7 m: X" _2 F& S# f
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
# j4 m9 H. [4 U2 X5 f在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
9 e. T- q$ \7 i( `9 a在 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. * [2 X. ~3 E8 t8 ]
  2. void encrypt(unsigned long *v, unsigned long *k) { & A* K4 F% H% l
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ( A1 O5 g( v( W6 k! w% J/ C
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    7 v" l% t$ I; u6 t
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ & ]# @8 ^; a+ D
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    9 p  k. a% o! i; G4 x6 ^
  7.          sum += delta; " u4 z9 a* T1 ^% H
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ( j+ I$ r% n) w* B; L( n: k
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    + @( }+ r4 b) E
  10.      }
    . W) i9 w; E  H5 j/ Q- p  E: Y' u
  11.      v[0]=y; + P  M( ?3 H" Q
  12.      v[1]=z;
    1 S2 ~+ e. r9 o2 H  T: P
  13. }
      E9 |$ t/ w5 Y- a6 L
  14.   
    7 ~3 e* I+ M' Y, [- N& I( W
  15. void decrypt(unsigned long *v, unsigned long *k) { 7 S1 n4 G: \9 c# f3 q( k
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ + c% {: G4 F5 h' T: {
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ) ~8 P2 B, s7 V# H+ E
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ & {' w6 D+ ?) k" ?6 ]: V
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 3 \1 v6 E, `1 R2 V+ U6 E
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ' {2 m3 _0 B3 d
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 4 Y6 K2 H5 P9 N9 i; a/ {
  22.          sum -= delta;                                /* end cycle */
    . W) C8 \+ e/ s  E% {. h) W2 A
  23.      } 8 J2 Z* j# E2 s
  24.      v[0]=y;
    3 |) d! K& |' y4 y* m* E! y
  25.      v[1]=z;
    # Y9 N3 y' T% ~0 O! w/ I9 b
  26. }, A! K! Z% k3 [/ J$ V
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 4 h9 T8 Q  W0 j) e5 Y. r' T4 i
#define UTIL_H / q8 _9 }$ j( [2 p2 N3 U) J7 A" l

8 z- m" s7 ~( p! H#include <string>
3 m3 w8 l$ d3 T* ], [3 R7 y& A9 Q#include <cmath> 5 n. z  ?3 t% V& t- ?* M
#include <cstdlib>
$ N' s3 }4 ~+ Q. D
1 D% ~$ {2 Q9 b, Z8 Utypedef unsigned char byte;
0 J$ {& y( q' A+ A( L8 @: ]3 Otypedef unsigned long ulong; 6 w3 h8 E2 C: {$ K$ s. f8 ~

0 q) v* ^& I* A# Rinline double logbase(double base, double x) {
% o/ g( B  g( z    return log(x)/log(base); $ H% ^% _5 Z: l% J8 B
}
, T) x* ]+ k  {( j6 q0 H3 I ; U6 ?3 Q  C5 w6 A/ u
/*
, i7 w7 S! |, `/ R$ H*convert int to hex char.
' k2 E+ ^; a. I3 Y" q2 F$ u% H*example:10 -> 'A',15 -> 'F' - |) z/ E4 s+ v1 K: ~: B2 g3 w# Y
*/
% }. O1 `1 }( x/ @4 p- a  q- kchar intToHexChar(int x); ! L0 ^: f8 _/ J: ]7 P2 o1 |; x
2 r" Q0 L# @2 Y/ }* E( N
/* + _& ^/ D8 V" Q
*convert hex char to int.
+ b4 C- H# _9 p- x*example:'A' -> 10,'F' -> 15
7 g4 b* k5 u- `8 T1 Q*/
( G% Q0 `0 O. D/ Q2 m7 ~# F2 Tint hexCharToInt(char hex); % @( F' P7 Y, K/ R5 F
' s, D6 g/ s! t/ ^7 d
using std::string; ( W* C% q0 M1 P6 _# ]% t7 j/ i) k+ Z
/*
- {% V$ @$ w- l+ m. R% \* B2 h*convert a byte array to hex string. 3 i: z& \( _9 Z/ V6 A
*hex string format example:"AF B0 80 7D"
& x3 T% ]; @. q) a! ~*/
# O& t$ r  w% h7 x. fstring bytesToHexString(const byte *in, size_t size);
. b" S6 e: ^  Z) E$ Q% I
' G( w$ d* t) W% e; F/*
# V6 j# @. a- _7 q" K, o! W*convert a hex string to a byte array.
1 ~% h; T/ A6 W*hex string format example:"AF B0 80 7D"
1 C8 M+ R# |) W/ K' C*/ 9 |8 ~* W% |2 p/ J% ~! P) g9 V
size_t hexStringToBytes(const string &str, byte *out); . z: f! x6 F& a) P0 r) U' N$ n
/ e& V; |/ e& Q4 l* U" u# H
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" & C3 y4 u# e+ r, w! R# ^3 l& a8 g
#include <vector>
8 h; b2 j1 }7 z3 R; p $ }2 E- i- B( F" V) O* v' o- \
using namespace std;
4 ^6 `  }8 }' Q8 O2 R5 ?; o
$ M/ k5 J5 L6 ychar intToHexChar(int x) {
/ p* Q! y/ D9 ~$ {- M# i    static const char HEX[16] = {
' e* B% O% O! D6 N" X6 A& f& g+ G        '0', '1', '2', '3', ' ]6 j1 W7 W4 L0 D4 v# a3 F4 w
        '4', '5', '6', '7',
" @; ~9 {) K+ K* Y7 I        '8', '9', 'A', 'B', 8 G8 f  e# e/ [4 B$ o
        'C', 'D', 'E', 'F' $ t9 B8 `: A$ Q6 G: m; |% F
    };
8 e" H6 M% ?6 \8 S/ y    return HEX[x]; : K8 E% r. L6 J+ a" U- ]7 T
} 7 K: q+ k3 ^7 K# H% C) X) N

3 }7 ^7 I5 Q& p: ?4 x$ a/ P! h: jint hexCharToInt(char hex) { 5 C( ]; T$ a/ X: C1 \, J: X8 A
    hex = toupper(hex);
/ Z7 N2 c2 e/ ~' F4 e    if (isdigit(hex)) . m, x( J$ |3 e1 J) n* p; f' {
        return (hex - '0');
/ H3 o, B. T6 v& A3 ~: l- K$ k    if (isalpha(hex))
0 ]+ G. q) u6 s        return (hex - 'A' + 10);
- u0 V/ u1 R: ^- D' s    return 0; * k) G! ]0 _1 ^
} 6 V" y1 W5 d4 W  E0 i

9 r- |1 _: t1 _$ h4 f8 \# C/ l- cstring bytesToHexString(const byte *in, size_t size) { ' [! w3 u: ~) y4 ]5 I
    string str;
1 o7 T$ U4 A  t% R3 N; R" {    for (size_t i = 0; i < size; ++i) { $ P. i  f7 T) {# k' e/ }
        int t = in[i];
$ F: t' ^1 Z" R! `1 C' S        int a = t / 16;
* V$ [7 E. |; k        int b = t % 16; $ _. e' K1 l; t$ J5 Y2 [7 F
        str.append(1, intToHexChar(a));
  v6 T% w  k. n8 I        str.append(1, intToHexChar(b)); 2 G$ j5 R6 G; k5 D! y. u* o
        if (i != size - 1) & r+ S  k0 C% ^3 ^! p) v: k1 U
            str.append(1, ' ');
8 W. |( P0 G, ?; V4 }    } 8 e8 \8 @0 D; `+ Z+ q
    return str;
* j6 F; K+ Z2 A7 x' T* g6 a}
3 s- n4 X+ v* l% D 3 B. a& W: f( g* F; X
size_t hexStringToBytes(const string &str, byte *out) {
6 u2 u% B, O# q: K1 _5 q * ]  n6 r" H- Q" v; I- {' M: o5 {5 w) x
    vector<string> vec;
3 ~4 O  l/ P: x    string::size_type currPos = 0, prevPos = 0;
4 ]9 c5 P; c' ^7 ?# X8 T    while ((currPos = str.find(' ', prevPos)) != string::npos) { 5 R  c+ _8 I- n% q, n3 Z
        string b(str.substr(prevPos, currPos - prevPos)); 4 c" ~* h4 c3 ~  ~/ A2 p" q
        vec.push_back(b);
) `. N$ E4 }, U        prevPos = currPos + 1;
, g& w' H2 Q/ A7 S    }
) t! R6 T& p/ f' S% L9 M, L- _    if (prevPos < str.size()) { * ]/ Q! k+ i+ ?. @, D; s' B
        string b(str.substr(prevPos)); 8 S' |. z0 ^& p. O3 a! j- f; b
        vec.push_back(b);
5 `& x( d* }0 J5 U  }! z* Y7 v    } 3 G. ]/ P) _* j4 Q) w( x
    typedef vector<string>::size_type sz_type;
+ _1 j/ I5 H# M' a: I7 j" i# C    sz_type size = vec.size();
3 H" o8 M- v$ D8 X    for (sz_type i = 0; i < size; ++i) { ; H# E, }# R) f6 G# a
        int a = hexCharToInt(vec[i][0]); * O" T9 W8 F2 X
        int b = hexCharToInt(vec[i][1]);
: |5 A. w6 T7 e/ Q        out[i] = a * 16 + b;
2 [8 Z6 a' g0 O- E    }
7 b9 g% U! n4 |* X4 u    return size; 8 V# z: m* N' K4 `( m
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
- n+ F  Y! w; H8 f' h#define TEA_H
9 |; _4 A. u0 H, n& c# v & I9 t9 A7 O6 C0 A, L/ t
/*
4 m% ^+ R$ K4 Y5 r0 m: @1 t*for htonl,htonl 9 x0 c# F3 l, q; c+ k5 [
*do remember link "ws2_32.lib"
/ U+ l& O! H1 N( x! H  ^*/
: ~: ?' F# Q3 h+ x#include <winsock2.h> ) K7 P0 a1 Q- z; v* S
#include "util.h" 4 y2 v' ^3 L$ C4 _) [
, t& e' G% \) [& {+ G; v
class TEA { ; j! o& }$ I/ ]+ B* Y3 H
public: " N" D5 j% z( b8 J  ^4 ~' ^6 r* Q
    TEA(const byte *key, int round = 32, bool isNetByte = false);   S0 C7 L/ Q8 o( n7 C( l
    TEA(const TEA &rhs);
3 G! p; y, ?8 x6 L2 ?    TEA& operator=(const TEA &rhs); 6 l  U2 r% j9 j$ B3 t- J
    void encrypt(const byte *in, byte *out); # _: m8 Y( [) s& X1 y# U
    void decrypt(const byte *in, byte *out);
8 w( h' [8 b! H' J1 o$ n( nprivate: 2 @; |* }( v- Z* X- ~1 K6 r
    void encrypt(const ulong *in, ulong *out); # x, i/ [; N% r1 X
    void decrypt(const ulong *in, ulong *out); # H1 x$ V5 Q0 ?% A- ~. w; V
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
, B% [! t- b0 z/ h    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ! R" Y; l5 S) B; g: c9 N  v
private: ' g' `$ A* p1 D6 c
    int _round; //iteration round to encrypt or decrypt 2 i7 B. q: r: r6 V
    bool _isNetByte; //whether input bytes come from network + ^+ v0 V- ?! h% Z; d
    byte _key[16]; //encrypt or decrypt key
+ B- U9 Z1 z2 C};
5 K% o" c/ f4 ]* X1 a) F' d* B& ` & [& _; i7 t0 E/ s# R
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
' N" e! X  e: M2 J9 ?- W 2 #include <cstring> //for memcpy,memset
9 M: P2 l6 k$ b' ?' w 3  , D: Z' I/ |, p) J( ?
4 using namespace std; 9 |" v1 r; t! m- C- ~
5  
0 X4 @$ o' q( Z* x7 f/ U$ C 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 5 C7 E1 J6 h& `. M! v+ Z. T. }
7 :_round(round) ) G- s# B8 Q7 B6 O' H1 P" ^
8 ,_isNetByte(isNetByte) {
0 G! C5 z! S7 B$ V3 A" W+ H5 ] 9     if (key != 0) 7 z6 M: K9 O6 w/ O
10         memcpy(_key, key, 16); 9 Z: i1 Z0 m  B6 L4 r" J, V* z- ^
11     else
4 A; M9 o& `" h12         memset(_key, 0, 16); : t3 F5 ]/ |. q$ r% ~) h
13 }
0 A6 W( k: L  l14  
3 G& b: }/ F( B8 D0 W15 TEA::TEA(const TEA &rhs) 0 q5 u# c1 ~8 u4 S; G1 N3 G) G6 k  G
16 :_round(rhs._round)
- V3 K/ }/ G; M7 P8 Z. y; Y17 ,_isNetByte(rhs._isNetByte) {
+ x9 j3 C4 c/ \8 S18     memcpy(_key, rhs._key, 16);
$ |+ q) @% Y3 E6 B, @19 }
5 S0 j& D, }* H' }7 E$ q20  
" q4 Y! u1 l' O& q2 `7 ]21 TEA& TEA::operator=(const TEA &rhs) { 9 D/ [$ m9 P/ v( |, _9 j9 v( ]
22     if (&rhs != this) { 2 D- h4 _* C( q5 C" B% E
23         _round = rhs._round; - o* k& Y# i3 E. [* O1 L
24         _isNetByte = rhs._isNetByte;
% S1 O# M% W! O& k5 W3 m8 ]25         memcpy(_key, rhs._key, 16);
; k3 y7 m, W9 m7 c26     }
6 x: C7 i$ n& i6 e4 W27     return *this;
* y$ N6 P) q& k0 g, M. x28 } * t9 D4 B7 i0 f. B- g: G
29  6 E# b6 n. P, h) @6 H- O% `
30 void TEA::encrypt(const byte *in, byte *out) { 4 l3 C" v8 @) ~" P" j3 p
31     encrypt((const ulong*)in, (ulong*)out);
; j  }2 m  K: n32 }
# B( n& E9 c& i6 \7 G9 n' U7 P3 c# ]/ o33  2 x7 J/ D2 `: y$ g+ E' v
34 void TEA::decrypt(const byte *in, byte *out) {
2 C3 R0 c' R0 j" o4 T. o3 O35     decrypt((const ulong*)in, (ulong*)out);
. K- c+ r/ h# h6 d: C6 f" R3 `36 }
6 v0 W( A4 @: w6 ^" W37  ! P. P3 m. ~5 C0 `
38 void TEA::encrypt(const ulong *in, ulong *out) {
2 P! M( t/ J( S2 E. m39  
6 o  w, u! a* d40     ulong *k = (ulong*)_key;
1 m6 d! O9 t( h- G! }# i41     register ulong y = ntoh(in[0]);
+ A  r! l- n/ N/ r% \7 `42     register ulong z = ntoh(in[1]);
# U; Z2 Y- o" l/ H( n2 {# y3 g43     register ulong a = ntoh(k[0]);
) e: ^6 t9 h8 Y44     register ulong b = ntoh(k[1]); 2 L# D5 C& O: l. P( @9 W! }6 l
45     register ulong c = ntoh(k[2]); ; [7 _: W. w9 f4 {, V% g
46     register ulong d = ntoh(k[3]);
- f4 x1 E$ ?2 [6 _, {47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
% B; E6 _8 W- ~" H48     register int round = _round; - p# H2 k7 t! c1 I5 g9 a- [8 _' p  c/ M
49     register ulong sum = 0;
4 C: s/ I2 b7 J- Z+ X  u50  . g; R1 x4 ~1 [5 X- E: `# q0 o
51     while (round--) {    /* basic cycle start */
# z' t  R; I# l" [1 g: |- p52         sum += delta;
4 I( F7 m6 |4 K; h- |# j53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
5 v( c1 {6 v5 Z54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); $ \( d+ `2 ?! `8 H0 H
55     }    /* end cycle */ & K* N1 v# E$ j% Z
56     out[0] = ntoh(y); - j+ s9 W, Y2 U+ `; h6 l
57     out[1] = ntoh(z); 9 d6 T: H" P6 |4 e9 I, c
58 } & S5 \9 I1 |3 [, {/ G
59  : V& P' |8 |9 G5 i
60 void TEA::decrypt(const ulong *in, ulong *out) {
" k# a8 `  @" Q1 u6 ?61  6 F" \" ?# f8 z. }  F* Z5 Y
62     ulong *k = (ulong*)_key;
8 w* Z  X. q1 I8 [4 U( S63     register ulong y = ntoh(in[0]); 7 ~- a* w0 l4 t+ L6 F+ P' }
64     register ulong z = ntoh(in[1]);
/ R( M5 B/ J, ?4 l7 z65     register ulong a = ntoh(k[0]);
& c  b$ \3 Z9 n+ C# b9 l66     register ulong b = ntoh(k[1]); 0 Q- q: `, a4 S3 K4 E. ]4 d
67     register ulong c = ntoh(k[2]);
4 v: \; T' Q5 [9 A; h3 F+ y68     register ulong d = ntoh(k[3]);
+ }" F" s5 \0 a5 `69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ : V# u  d5 K  \, p+ [
70     register int round = _round; 8 ^' r+ X' ^& h; \" \
71     register ulong sum = 0; ! J6 R0 S( }  Y  e: p: ~
72  " @) @5 ?. F# e# O" t/ E7 |2 S
73     if (round == 32) : o7 U  H9 }5 l% Q. d
74         sum = 0xC6EF3720; /* delta << 5*/
" \* p' f- f! O- P75     else if (round == 16)
  H3 Z  x; d" o3 t' \! n76         sum = 0xE3779B90; /* delta << 4*/
1 Z5 u% Q' M* J$ D77     else * M5 g; w9 B% @- c! V7 |- s
78         sum = delta << static_cast<int>(logbase(2, round)); 4 @# w) O5 h/ w; I" e# x/ b" n
79  - s0 D2 `* R' l3 H# a
80     while (round--) {    /* basic cycle start */
  n1 r, Q& ?/ [$ l- X0 [81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ' Z0 d% \3 q' B
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
7 v4 _3 {5 c' o83         sum -= delta; $ A6 T4 y! J; \7 s
84     }    /* end cycle */
. {: v! N, E$ z! o8 o! x  [85     out[0] = ntoh(y);
4 B6 s. H4 G( H) ]9 R0 {86     out[1] = ntoh(z);
! C! Z# D3 ^: P/ X+ v$ O87 }
" E1 p1 ~" L# i& N" D2 b
+ e1 e5 r5 I: N需要说明的是TEA的构造函数: 8 |/ G! x2 a( R0 d" C+ q
TEA(const byte *key, int round = 32, bool isNetByte = false);
* q6 H6 F; v/ X0 k) A- c1.key - 加密或解密用的128-bit(16byte)密钥。
' ?8 \+ o- C. {$ d  q: T2.round - 加密或解密的轮数,常用的有64,32,16。
( j0 e  O8 z- {7 S+ Z3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! : l0 D3 q" T$ \4 K: N

+ H( X. l  S. O2 }最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" + k8 l4 p$ R. ~
2 #include "util.h" : ^7 \) `/ J9 H+ y0 D+ q7 j
3 #include <iostream>
- G. f; V; K: J3 Z. | 4  & U1 u+ g: Y: T) T
5 using namespace std; ' j3 @  B0 Z1 e
6  # l* z5 ^% }* @/ R
7 int main() {
$ p4 d) Z) k/ C' e4 F 8  % ^/ U6 [( e( z
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
( \2 d# o. O0 A) L: j, s- A10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
7 P0 ]% G+ \- q; A2 C11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 4 ^" z; z3 c& R/ @/ e* n
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
" }9 h, x  ^% X9 X, g( a* ]- b4 j13  ; Q# L6 K8 C6 S0 J
14     size_t size_in = hexStringToBytes(plainStr, plain);
: I( y0 c9 |  K  R15     size_t size_key = hexStringToBytes(keyStr, key);
0 e9 q% }+ C" A16  8 K0 A0 v' P" l5 E: t- p  r% G
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 4 Y: E: i7 w2 j+ Q, Q
18         return -1;
4 F' T: E2 O% |9 `4 r19  
- S, Q4 T8 o" f' f20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; : k" @5 i! @' F5 Y9 S) W8 D" ?
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; $ l) F6 w/ {2 l+ J( b! p, ~
22  4 ?7 q# V' k  C% P# A) F1 z) B3 B
23     TEA tea(key, 16, true);
$ M* m/ ?2 z  B' H1 n24     tea.encrypt(plain, crypt);   S' p2 E$ ]& I
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
- n  f6 ?- v$ q2 S5 B# i7 \26  
. o' A, w7 A: i- t, X/ f27     tea.decrypt(crypt, plain); ; O/ P. Y4 h/ g1 ~- O2 h% }# q
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;   E! i: b. d" P( ^
29     return 0; 1 h4 t# h9 v0 ?9 ^4 w  n
30 }; w! W: z  @7 @3 c, k, K2 g
0 p  e% ?4 `; R0 V5 M' W
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
+ a# I3 {7 r) Z$ C. j% l运行结果:
) A: c) m) Z: Z' A* j* U# ~Plain: AD DE E2 DB B3 E2 DB B3 6 A2 j% |* [; H2 E
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
: B1 H" h( n6 T0 i: N! Y8 b" XCrypt: 3B 3B 4D 8C 24 3A FD F2 1 X% C- ]6 Q* w5 s  u, b, P
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-27 17:46 , Processed in 0.021690 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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