找回密码
 注册
搜索
查看: 37496|回复: 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轮):
4 B2 s( d0 }% F' c* W) r' W微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
' q: a! L" E6 k9 ~7 ~TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 6 B2 d; [5 |' {1 u8 @& }
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
& @4 C& `1 w, S/ t在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
% l, a1 y( ]6 M在 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. - d, n% o8 w$ M+ P% [0 ?
  2. void encrypt(unsigned long *v, unsigned long *k) { ) U& B* _; i& _7 y# ?5 M, I% t. J
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    4 k4 O) q' v2 B7 m
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    9 G! N) T, ^5 L
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 6 b" p+ F' f* o3 j9 R; K
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    & }1 }( D5 p" w4 B7 D4 a
  7.          sum += delta;
    & i+ t; v5 D8 G( C  Z
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ G' M0 R$ [) v( _
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 2 ~# Q1 t0 k+ O
  10.      }
    7 w) R- S/ w- B( d, U7 Q; T( o
  11.      v[0]=y;
    , ~+ I- ~$ Y1 J5 F
  12.      v[1]=z; % [3 g9 t9 X1 k: t% ^* R
  13. }
    ' r( x" K# _/ N5 Y4 U
  14.   6 Q4 \$ `$ k' W5 G" e% M
  15. void decrypt(unsigned long *v, unsigned long *k) { / Q  N* {/ x* h/ G0 y& p. t; a
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    - n3 {+ k! n# l! ?
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    / f4 Z8 I  ?9 Z' d! G1 W
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 7 ], T* J) ~: Z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    : \2 d8 w/ o1 ]: f: I0 h7 O4 m
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); - _% v+ L5 _: w6 }/ h" L$ \, H/ g
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    * {- C7 n# q) J
  22.          sum -= delta;                                /* end cycle */
    ( p) o' R/ c; n- Q, b
  23.      } * r) S+ e% _6 ?! n
  24.      v[0]=y;
    0 X4 G  w$ _- g2 F& a2 J
  25.      v[1]=z;
    / ~/ G( j2 D$ |+ ?3 `& M$ A0 G+ b
  26. }
    . R* ~& Q  h3 |" L( R" @# I
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
1 l+ }) ?  _$ |* t4 w3 w! p#define UTIL_H 0 g/ m8 k5 v3 G- x( _: Z, Z: Z

, Z. x( I: z0 _- z  A, e#include <string> ) H/ H2 C6 c/ w4 J6 R% n& |3 B
#include <cmath>
( w1 Z) X  P5 f3 a' V7 v#include <cstdlib>
2 r! N0 _; c+ A
1 \' Z5 r& {. O; Ftypedef unsigned char byte;
3 Y8 _6 A" d9 g1 rtypedef unsigned long ulong;
' I$ a: Q6 E2 d
5 H- _  |! B0 \. Vinline double logbase(double base, double x) {
* B) Q& h) ]& M6 ?    return log(x)/log(base);
, D" H) M/ j$ o0 I2 c) d}
  |* c7 H4 d. s" t" D' V ! O$ ~2 J9 p( ^. c* b2 V
/*
+ P6 K0 r2 \1 j1 f- J, i# n*convert int to hex char.
: [) [) Q: z; ?. V2 q0 s4 N*example:10 -> 'A',15 -> 'F'
( g/ T% j$ v, D6 h2 x% u*/ ( n' G4 X( ?8 @- g) @" g: l
char intToHexChar(int x);
* J- K4 \1 Q+ l. t. F5 b' K
- k% |. n% |5 [0 d; N2 `. r/* 8 D/ z5 ?0 E& n
*convert hex char to int.
$ h9 N  O& Q! U9 z- ]0 m( {*example:'A' -> 10,'F' -> 15
6 z  ~' S: b8 R" h  G$ B*/   O4 j5 N6 I  W
int hexCharToInt(char hex);
" P  [' O4 ?6 R- \: X! h$ x
" b) b+ p& A0 Y$ Ousing std::string;
! `  G4 {  h) h" `/* 6 A; L% v/ k! v3 T6 b1 {2 a/ s2 @
*convert a byte array to hex string. / ?% Y. A8 Y! `/ c  t
*hex string format example:"AF B0 80 7D"
, m0 t: R7 O7 R! N7 r*/ 7 K# H5 j& R7 G3 B& {
string bytesToHexString(const byte *in, size_t size);
( R, _" S5 m- s) y2 i: R
. w5 Q& y! p: F$ y) |/*
$ p( }$ G: J" R  c2 V3 ]* S. B*convert a hex string to a byte array.
# S$ ^& k1 ^; u*hex string format example:"AF B0 80 7D" 7 Z' g' h( t2 R. t- S. K4 e! @0 z
*/
! N& O' x, R8 @. F" {size_t hexStringToBytes(const string &str, byte *out);
: b3 ?# x! e9 M3 D; \  d6 h
7 a$ P2 z9 J  y- n  [0 o#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 6 B, m! r0 u9 U/ H( u, ]) I5 Z
#include <vector> * x( c" e! u7 w# l* N% d" J+ ^
+ H4 ?0 D) e% y9 e
using namespace std; + [, m# W9 [% O5 q& C
$ O9 D) j$ O: r# [9 k0 ]
char intToHexChar(int x) {
& z5 W: V  l% y8 \: ?( `: W    static const char HEX[16] = {   D, Y! D$ V, Y7 T" L! R8 E
        '0', '1', '2', '3', 3 @$ A- E" J& W" \
        '4', '5', '6', '7', 5 L/ |  L! }5 m) {; x4 n# p, ^
        '8', '9', 'A', 'B', # t& }% t( w9 \
        'C', 'D', 'E', 'F'
* a/ a9 Z, C2 T6 O9 [    }; 7 o4 `9 R% [+ c! S# N
    return HEX[x];
3 i6 E8 ]$ R5 o+ e2 {4 _' h* S} 3 G% p7 I' J- {) B  v" ^' A, J, y
8 M/ G2 B- o/ E- E- j; r4 X
int hexCharToInt(char hex) {
: O& Y) H2 m1 A; ?    hex = toupper(hex); 6 F4 {' g# F' \5 v' D3 x
    if (isdigit(hex)) : T& q& Q; w- ^6 ~* b" U
        return (hex - '0'); 5 Y2 I9 o' t2 o
    if (isalpha(hex)) * p# h2 g( V/ {' Y, s. n8 A8 h6 j
        return (hex - 'A' + 10);
. y: R* n0 C! g  d( D    return 0; ' d- \+ _, G8 ?& ~# T
} " W7 `% _4 x/ U# O" ]0 \7 f. V
% ?* X. ]' @$ ?' H. l
string bytesToHexString(const byte *in, size_t size) {
) k) k0 C$ I8 i* W- w6 [    string str;
% H, s) ^- e  @# u$ Q: R  I) a    for (size_t i = 0; i < size; ++i) {
* m+ Y& c5 l+ z. b$ f6 m2 [        int t = in[i]; 9 q* Z2 s7 T7 f7 g1 ]/ I
        int a = t / 16; . K4 w" Q1 C) v. K* H7 M$ G
        int b = t % 16; 0 g4 Y' V3 e# |
        str.append(1, intToHexChar(a)); $ Q7 e) r5 E% e, g( S$ {
        str.append(1, intToHexChar(b)); 7 \: \3 h! w! t1 E& N
        if (i != size - 1)
0 ~- v. \/ S( e. c            str.append(1, ' ');
$ E: i3 \" }" x8 X2 V    } , H4 ]5 P  |" Z" w- {
    return str; , B; C+ U2 D5 |  M+ O/ k# h
}
% C. [1 E% p5 N: {! S* f
2 @: K$ D* K& r7 }$ Fsize_t hexStringToBytes(const string &str, byte *out) { + e  ~) i. g6 K; {

' S. Z/ P7 y0 Y: h: P6 Q    vector<string> vec;
9 w' W, P/ r' \) y1 p4 M    string::size_type currPos = 0, prevPos = 0;
4 Y. ]0 e, Z7 [. v% ?0 e0 T% P& `    while ((currPos = str.find(' ', prevPos)) != string::npos) { ! v; d8 K  N8 J1 T( D
        string b(str.substr(prevPos, currPos - prevPos)); 1 k/ c9 B8 T# m
        vec.push_back(b); + _+ ~0 F; A/ Y8 R; G( I& g
        prevPos = currPos + 1; $ u; V; x) [4 E
    } 7 ]: J6 O+ c2 L2 H
    if (prevPos < str.size()) {
, j! Q2 g' ]' W% H        string b(str.substr(prevPos)); ! h) S) B# Z0 A  U: O( |/ K2 E
        vec.push_back(b); ; n1 Y5 j$ K5 x% K7 x
    }
8 S/ L) N. S0 Z0 Z; z  t: B    typedef vector<string>::size_type sz_type; % B, u0 k, K* A# r6 ~3 T
    sz_type size = vec.size();
2 A  e6 T( y/ z! K    for (sz_type i = 0; i < size; ++i) { 5 W  y( x3 M( h& Q
        int a = hexCharToInt(vec[i][0]);
5 _( m) I" A" K5 \$ B0 A3 r3 M        int b = hexCharToInt(vec[i][1]);
$ ?: @1 [; ]$ J; J9 @        out[i] = a * 16 + b; 0 j; n/ e+ S0 x6 C
    } . b+ }$ A$ W: _; p7 Q
    return size;
2 J+ V/ Q/ D4 p' E}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
2 Z/ M% u% @% Y& Z#define TEA_H ) q) ~( l/ D. {! U3 ^/ I0 [

' G; u+ T3 Y5 K, k: A/* ( b4 i  Z( {  B
*for htonl,htonl 4 ?- L: X1 X/ c" o  U
*do remember link "ws2_32.lib" 2 B  e# j- t+ n" H8 x: g
*/
8 c0 y' B% x: v5 Z5 w. v- b#include <winsock2.h> ; M& w2 z- [# N; o9 [0 D3 t3 J
#include "util.h" 4 {9 C, G# m! a$ U% Z1 ~
  m) k: a/ V, r5 a* @2 `+ a$ z
class TEA {
" ]+ C' {5 g# Z( j! a/ w7 }public:
- Q$ r$ [& h/ `4 ~) R) [8 J& i! |    TEA(const byte *key, int round = 32, bool isNetByte = false); 0 n; Y" s9 A% l/ I4 @
    TEA(const TEA &rhs); 8 @, G! S' y" G3 Z
    TEA& operator=(const TEA &rhs); $ i1 @. `. T5 n+ u* }0 [) h8 Q
    void encrypt(const byte *in, byte *out);
0 ^7 T9 N+ i" a8 j! @    void decrypt(const byte *in, byte *out);
/ n1 A3 f. c' J6 N+ zprivate:
  d3 F! B! L6 b2 [& F    void encrypt(const ulong *in, ulong *out); & N) e0 B9 r( i/ O. F- \
    void decrypt(const ulong *in, ulong *out);
$ y! e+ L) j' g( [& l    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
9 k& Z3 G$ u6 B& m- s    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } * M+ t7 l6 ~% m% q$ R7 [- n
private:
! g- C. l& r3 U* z% `    int _round; //iteration round to encrypt or decrypt
" K) O) r8 _6 |    bool _isNetByte; //whether input bytes come from network
& a0 c# X0 E! X    byte _key[16]; //encrypt or decrypt key
7 L0 d. `$ D7 d( M& S. i3 z# @};
' V) F+ x9 r+ l$ L
% _8 N, s' n2 s( @! f+ j#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" % b' p0 u' ?; t  a
2 #include <cstring> //for memcpy,memset
  r" u9 U0 V7 u/ |: {, V9 \ 3  
8 z8 m( ^; h2 | 4 using namespace std;
" v4 o3 w( E' s1 Q4 s7 O; m0 I 5  
) O& o1 Q6 l& Y: ?0 ]5 K+ [1 M 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 9 B1 r) z& _! _8 i+ K' E8 O* Q& N
7 :_round(round)
% q; A0 l7 ~% Q* q 8 ,_isNetByte(isNetByte) { 0 P( J( T! R; y; K+ r
9     if (key != 0) ) h/ v7 Y, J6 v' {
10         memcpy(_key, key, 16); $ V$ L2 B6 R, n
11     else
) n% q7 H, t0 n% d* t12         memset(_key, 0, 16);
9 h1 \3 Y% T+ y2 O1 E) f13 }
5 t, b$ ^; Y* }  S3 @5 n( y14  6 \" \* y+ H: V9 \& T3 x$ D7 B
15 TEA::TEA(const TEA &rhs)
, ~4 w" S+ r8 u% L16 :_round(rhs._round)
& W/ P5 e3 a( R) [3 c0 x17 ,_isNetByte(rhs._isNetByte) {
! K+ S/ Z# C3 K' e& o/ T6 ]. t5 n9 b- b18     memcpy(_key, rhs._key, 16);
8 k; a' q7 |' o( g( F8 k3 d5 h# n+ N19 }
. Q+ h1 N# Z$ t20  
. |4 {8 |0 B. I/ [21 TEA& TEA::operator=(const TEA &rhs) { 4 e  ~5 J( I# Y$ q; X, u
22     if (&rhs != this) {
4 r# ?! ^. P8 ]23         _round = rhs._round;
0 C) m6 `3 p3 i7 S3 ^0 @24         _isNetByte = rhs._isNetByte;
+ a  K. Y1 a+ u5 N# d2 q25         memcpy(_key, rhs._key, 16); # |. P4 x! Y1 G6 A; Z/ K
26     }
% B/ @: q) B$ |( E27     return *this;
5 M8 i5 E' h+ t5 F$ @' x9 B0 a3 W28 }
4 J2 C# u3 e! j" B: o+ ]29  9 V% l( n4 X& @. S# ?& ~6 g
30 void TEA::encrypt(const byte *in, byte *out) {
) z  m0 s, p) g( n, [  E4 X31     encrypt((const ulong*)in, (ulong*)out);   d* q1 W6 i3 H" J# g; f& l
32 }
' k0 j- p9 ~  T2 s# V9 h3 q33  2 D9 c5 R! _. t9 `) |2 Y1 v
34 void TEA::decrypt(const byte *in, byte *out) { 2 ?4 E5 l( s# a) f: N  H
35     decrypt((const ulong*)in, (ulong*)out); 5 W  J  M6 l9 R- d3 f; z
36 } ; l* ^  q# a2 t6 T# M$ [4 m% j3 j
37  ' Y' U& t, O9 f5 S
38 void TEA::encrypt(const ulong *in, ulong *out) {
  Z, @! `4 J  {& c$ A; A39  
7 V$ e- J: V: `40     ulong *k = (ulong*)_key;
  p; t0 u& A8 R* M7 o8 _41     register ulong y = ntoh(in[0]);
4 r$ s& p0 {) G42     register ulong z = ntoh(in[1]);
% h6 E9 i" j( R* s& y1 v5 A# C43     register ulong a = ntoh(k[0]); + |: i2 [! ^9 Q4 D# p, d
44     register ulong b = ntoh(k[1]);
0 e, V& X) v8 S& F( u9 c4 v- _7 S45     register ulong c = ntoh(k[2]);
- m& P+ X$ ?! f8 _1 C8 j46     register ulong d = ntoh(k[3]); + b' i2 |5 z* |/ Y' O2 o2 e
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 4 X) E- X- w7 O3 Q4 J/ f
48     register int round = _round; 8 r6 A9 Y( T# n% G' I6 j8 x
49     register ulong sum = 0;
& M) f2 ~0 d1 _50  : ]. j& @3 P$ Y8 A8 F
51     while (round--) {    /* basic cycle start */ 4 t2 _5 l& t: _3 n
52         sum += delta;
% f1 u" ~; p# K1 h, I! Z( O- p) R7 Z53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 5 ^& p/ z; \7 W  V, j0 J$ G( i: Y4 {
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); " a0 T5 w' i( Y+ U) e" Z
55     }    /* end cycle */ ( k; H  \5 w# V
56     out[0] = ntoh(y); ; S. Y: A! I# c
57     out[1] = ntoh(z);
9 r* ^/ V' X- j7 ?8 ]; S58 } : ?4 u6 y" q3 o
59  & b4 }0 V' \. d7 ]9 V: d. ]% c1 J7 a
60 void TEA::decrypt(const ulong *in, ulong *out) { . v; {7 c. K- h, \' v2 r
61  
2 y$ u" e3 }1 K# }62     ulong *k = (ulong*)_key;
. O  U" Y; A) A8 @7 ?63     register ulong y = ntoh(in[0]); 2 |& [5 v1 X) J0 h# e: b
64     register ulong z = ntoh(in[1]);
0 p9 G% i0 A; Y& B; I; k65     register ulong a = ntoh(k[0]);
2 |: A' t4 I" x/ I2 ~! S66     register ulong b = ntoh(k[1]);
5 Q; n+ M  _! x% f: }67     register ulong c = ntoh(k[2]);
1 V! t* ], E) x) j# G68     register ulong d = ntoh(k[3]); # s" r3 `# m& P: F
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 4 B4 d3 ?- e& X
70     register int round = _round; / w7 S5 E) ?) \8 K- @' p
71     register ulong sum = 0;
9 ?! F4 y2 I0 o1 K72  ; ^8 `  R- n1 h6 m
73     if (round == 32)
0 ]. Z$ T5 N/ Q3 B7 P74         sum = 0xC6EF3720; /* delta << 5*/
  Y" |- n9 C6 o1 }75     else if (round == 16)
3 _1 o8 v' x2 w& M) e76         sum = 0xE3779B90; /* delta << 4*/
& f9 J- }' w! G8 b& H$ T# {' h77     else
2 E( B  f' f& u78         sum = delta << static_cast<int>(logbase(2, round));
" A% t2 L  Z* r: ~6 X! w) Y$ Q79  
* O6 `) `+ k3 w$ l7 A2 O80     while (round--) {    /* basic cycle start */ ! l- i+ C1 t( b* t
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ) J/ e; O: `& e- _) A
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
; ?8 C/ G- o9 A" U, G/ {) h1 {* c83         sum -= delta; + M& _/ h* J1 y) u5 e& l# \/ G
84     }    /* end cycle */ ) t  Q4 K8 c2 S
85     out[0] = ntoh(y);
" U; B1 x! B4 n' `2 M# u( J/ K86     out[1] = ntoh(z);
  v! z2 y, D1 ~87 }
+ i1 I* q0 I/ D- i- l! ?- ]) s- d/ J% X9 |  j7 b
需要说明的是TEA的构造函数: 9 V1 [& u/ u' C2 P, q' L
TEA(const byte *key, int round = 32, bool isNetByte = false); ; K$ h) @! P: H6 C
1.key - 加密或解密用的128-bit(16byte)密钥。 3 _/ w( L1 I  r8 }/ N. u
2.round - 加密或解密的轮数,常用的有64,32,16。
3 F0 c8 x7 o" i' J. K+ _; V0 S& i3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! $ r1 V. O, B5 n3 j9 w

: E! j1 p7 T  V4 G: U$ t7 Q4 }/ L- k最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 0 p" M# D0 X0 o/ }1 @" \) {
2 #include "util.h" 7 d0 [! t9 K& ^- w$ e/ l, e
3 #include <iostream> 4 P. j' `6 g3 ^) R
4  + l; ^* m6 m% C, J! T
5 using namespace std;
7 @3 ?1 c) ]2 E 6  
7 k: F* n1 _5 O% |3 t' {- i0 t# j5 H 7 int main() { ( f: [  T  B7 o6 t
8  & H6 h( `/ P5 ]/ N
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
( i4 K0 S  d+ B: A9 o& X/ V10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
# h# f; Q; X. t% F( O0 y+ U, k11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 0 f2 Y3 z5 A2 _" l- V4 _. q' G
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; : J9 W6 G: {0 @2 X; n7 P( @; c) A; [
13  
& V+ I0 ]' W3 _* F. Q14     size_t size_in = hexStringToBytes(plainStr, plain); $ o7 ?& s+ ?3 l( o8 f! B7 y: M
15     size_t size_key = hexStringToBytes(keyStr, key); , J. W/ o. M$ w, L! L5 j
16  - `3 E8 l% ^, h  k( Y
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
2 j9 @+ Z0 U+ ]; ~- i- [+ Q18         return -1;
# w. R/ j) h  J6 Y5 G! g1 c2 F19  
& Y( Q# P. g( J8 g2 \( N3 J20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
3 J; b. }' v$ n, V) b! {: B. u" u21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
2 e0 i! a- [* u22  
  f6 M0 v) f! j7 A  J$ C23     TEA tea(key, 16, true); 7 u) S& j+ O5 J7 H2 f
24     tea.encrypt(plain, crypt); # P9 ]: d* e9 w) I" E8 D8 s7 D
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
6 O. ~7 a1 @# [2 y+ K7 R- n26  3 j: z( n+ J* _* R0 F! h2 t
27     tea.decrypt(crypt, plain);
2 P; E# O+ R# x) k28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
( A' }7 T) U+ A) f( v$ h2 R% H29     return 0;
8 U4 w* P$ I8 t# x: Z! T4 ]30 }
$ H( o+ \/ p8 o/ O; t: R8 t% B# s* n
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx: Y, m; V/ h" @
运行结果: 8 U- ~2 Z1 ^( `) P$ \# e
Plain: AD DE E2 DB B3 E2 DB B3
% X4 J8 v5 Z+ _5 o8 HKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
/ l3 ]4 ^1 N+ v( A% PCrypt: 3B 3B 4D 8C 24 3A FD F2 - i2 t9 I: V# A) j- D. d
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-25 03:07 , Processed in 0.023708 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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