找回密码
 注册
搜索
查看: 37301|回复: 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轮):& N# m' S7 R' }- s1 s: a* Q9 ?
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 3 U/ A) ^3 I, S2 ^' X' w
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
7 e- d2 D/ e6 [7 v, Q之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 3 p+ G' M! L# s9 U) Y+ W$ d
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 8 q; _2 P9 Z' R7 C5 J5 i
在 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. ' [7 Z- n" e, E% ]! ]
  2. void encrypt(unsigned long *v, unsigned long *k) {
    & E" A4 ~7 b5 d, a
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    - ?- A, D# k0 c- X' F: V
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    7 u6 u, m9 \% k4 F5 N7 N
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ / q' ~4 S, r' O; S7 ^$ P4 z
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 4 ^, S! {$ i5 R. b( K6 w2 a  C: f# j
  7.          sum += delta;
    2 `  n/ ^* F% `6 @* x& \. s
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); : a, y# |' I3 ~, c" G* m
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 7 L; E# ?' p% s6 o
  10.      }
    " |# Z6 ]( j- w8 f' o
  11.      v[0]=y;
    0 t6 I, B* u) C7 e* r6 o
  12.      v[1]=z;
    9 H( w3 u( W* ~2 f% b
  13. } 6 j/ J7 N$ W& X/ C# X& E
  14.   
    9 W) p2 T1 E* {9 |; {  y3 c0 H6 E
  15. void decrypt(unsigned long *v, unsigned long *k) {
    1 w' C3 Q8 z/ M( a9 m+ ?+ j
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ # y' z5 m. x1 X  j4 z
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ " y  G9 f2 v; o* P
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ; q0 w* }1 H; Q0 {  k" c
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    8 J8 r  e' M8 J' B. Y) g' J
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); , j! l2 @7 @4 \
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & r9 n( w: i( o/ s- x" P
  22.          sum -= delta;                                /* end cycle */ 2 w6 m7 ]7 j( P' T5 ~0 E6 k  g
  23.      }
    9 n. @( g% z$ x# a
  24.      v[0]=y; : P  f, j: o0 s6 `- O$ i4 j
  25.      v[1]=z;
    9 h1 N' O( E% Y, G3 @
  26. }; t2 o' h% n# a9 Y: ~
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H : n& f$ M5 S7 K
#define UTIL_H
& w5 E! j9 H" h2 J8 _
- l* C  h9 w! D1 m#include <string>
) `* q0 J5 y3 L* N6 e1 {#include <cmath>
" a. H  m* n4 t- |#include <cstdlib> 8 b4 s7 ~  A2 R+ C
, d. a! ~- w3 u. X
typedef unsigned char byte; . V" H3 ]. f  H4 C4 V8 T* E* d
typedef unsigned long ulong; ' g% s  b* n: t1 W. N3 u3 O
) W& Y7 x  ]3 Z7 f6 I1 r/ K& S8 g2 F
inline double logbase(double base, double x) { , m/ w! V' w% j. g4 O$ D- F9 r- J
    return log(x)/log(base);
7 u% S, f# x8 \4 a& Z/ d: z! Y. ?}
; \" l6 }. A$ V: W 2 }( p/ d: t) {% S! t
/*
( R; c( ?+ K$ y# x5 O. w8 _*convert int to hex char. - T. `' ]6 S, o  C3 S3 N2 M/ w6 \
*example:10 -> 'A',15 -> 'F'
6 p0 ]7 U( H- g9 O5 K' `  D  A*/
. V" j9 ?' `/ y, B1 @9 t+ ychar intToHexChar(int x);
, \2 ], Z# X$ {* F
/ `' U9 _7 \4 u7 F6 w3 F9 n% R+ E" ]/* 2 {& g9 k4 H! w; `# I1 K
*convert hex char to int.
5 M1 ^& |5 e: l4 ~/ D  Z*example:'A' -> 10,'F' -> 15
) |- D% h  E; y; }*/
  L& U/ u7 I- _" i' Zint hexCharToInt(char hex); ( b# S2 {8 D0 c

+ r: i. Y3 u; L4 Lusing std::string;
. U4 E6 [  P  K6 ?1 r( G/*
. O( }6 w  C: Q+ P*convert a byte array to hex string.
& k" ^6 b$ g5 \! A; X*hex string format example:"AF B0 80 7D" / }' `7 C: L5 V- i5 _
*/
5 g" v, N8 N3 |8 O6 n& Vstring bytesToHexString(const byte *in, size_t size); " q6 T7 b5 e1 i4 {& o" b

. J/ N% S% x, }4 o( i/*
4 D% z; v. y2 a*convert a hex string to a byte array.
% q9 h9 Y3 i" l( j*hex string format example:"AF B0 80 7D" 5 z/ C. x4 j( s+ S
*/
( S, `, b. k. _, A$ x" y8 D0 Msize_t hexStringToBytes(const string &str, byte *out);
% U# F4 r& v) {* P
3 d4 F& \4 A6 I# K  S#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" % t& w. b2 J* {) ]9 ^. V
#include <vector> 3 M+ p. H) ~* ], h( j' P, \  W. i2 A
, I! m4 F% i7 Y4 L5 |
using namespace std;
/ I6 B. m9 v- T; W6 V 8 @3 r4 s) \' c; h, ^5 A' X8 D) W2 M
char intToHexChar(int x) { 1 s; ~4 e9 e  \) h
    static const char HEX[16] = {
* f( r. R! j$ v. [        '0', '1', '2', '3',
* [, u. [7 U& c0 o8 [5 ?6 J* H        '4', '5', '6', '7',
. ?' N$ ~$ [; ?; J3 b# K8 B3 e9 t4 X1 c        '8', '9', 'A', 'B',
: F% @* f. L8 T5 }, ?* @: o        'C', 'D', 'E', 'F'
1 I; a0 K' C! p# [6 k5 K0 `! v: M- d% F    };
6 E% L" t2 K1 z; E% \) `% u    return HEX[x];
& |6 `- w' y# N1 N0 L6 v}
' U- x7 e" h% z! |: B) \' E" I
6 F/ n5 t9 m4 Z  P1 F8 v' I5 rint hexCharToInt(char hex) {
( }  s7 K/ k7 `2 i    hex = toupper(hex);
+ u% u( h  N- P  a3 H8 v    if (isdigit(hex))
! d7 o) G; o/ U8 g; U9 ]. b        return (hex - '0');
% W, x5 o2 t2 t) M6 Z    if (isalpha(hex))
: e4 D. X2 f8 L" _9 @4 h        return (hex - 'A' + 10); 8 u: B) c9 H* Y7 o* d
    return 0; 0 a4 g7 }% T# q4 c
} % T9 \" i! Y0 Q  @
& |% Q1 w! [3 j+ w! `) b
string bytesToHexString(const byte *in, size_t size) { 5 Q2 |" o7 |2 j2 Z
    string str; ; \8 W5 S1 X; S" n, o6 }5 T
    for (size_t i = 0; i < size; ++i) { ( J$ ?: O/ ?. k" A
        int t = in[i];
: V' a" Q) h9 s" s$ S/ P7 F" p: i  I        int a = t / 16; % J9 o9 q7 e7 K* A8 I3 B
        int b = t % 16; : {- U3 a7 X4 q7 J4 y7 G* _
        str.append(1, intToHexChar(a));
4 i: _) k# {$ ~/ j. `        str.append(1, intToHexChar(b)); " F0 {" L+ b( J+ Y! _1 G
        if (i != size - 1) 5 G4 I- V, `/ b  o2 T# A! y2 p+ o
            str.append(1, ' ');
6 j9 x- R- n& {' v    } " ?" R1 F% j9 ?4 |: [5 i5 S
    return str;
+ D* J8 c; D1 l7 d" v) s# b  H}
# i3 @% b. n* c: Q( |
8 i  @# j6 Q7 k5 dsize_t hexStringToBytes(const string &str, byte *out) { - \3 ]" _- d2 Z! R( F' ^  V

. |& a" o/ i$ r7 o+ P1 Y; u9 s    vector<string> vec;
' A5 R& s" p  q& [! m7 m$ D8 t. A, ~    string::size_type currPos = 0, prevPos = 0; 2 S( G& h% y6 w: k5 u9 Y
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
: }4 k' H0 A+ Q+ V- A        string b(str.substr(prevPos, currPos - prevPos));
4 \7 g4 P" `. l. T/ \        vec.push_back(b); + k4 t- E: |5 d! P8 v$ E6 `
        prevPos = currPos + 1; 5 y5 w3 q3 _4 c5 f
    }
- x/ T  P! Q7 P( Q3 M    if (prevPos < str.size()) {
- P  }9 b( Z* b4 T8 v( h        string b(str.substr(prevPos));
" E# C! l/ Z) g) ]7 P* L3 O* b        vec.push_back(b); # ?) D: m; v( Y5 ~
    } , r( i. m# L1 O9 R! Q7 G
    typedef vector<string>::size_type sz_type; ( _8 x9 b5 D5 j& }7 _, `
    sz_type size = vec.size();
: ^6 U8 b1 w. w    for (sz_type i = 0; i < size; ++i) { ; f0 r+ @! g9 O. e1 e
        int a = hexCharToInt(vec[i][0]); & u: a, U: _- |, @
        int b = hexCharToInt(vec[i][1]);   D# R1 r) _0 J8 X
        out[i] = a * 16 + b;   \' m6 g, W# S6 ?
    } % q6 }) M5 P8 ?6 h/ d) s9 o" {
    return size;
% S; A+ Q/ z: u8 L}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 2 \# C- n' b; {! O% J
#define TEA_H / ?4 F8 J% X# g8 E( ?4 c& f

( C3 @# A9 G' s) N/*
0 C/ I4 V. H- ]4 ^, A*for htonl,htonl ) b" Z6 Y  L! C
*do remember link "ws2_32.lib"
& i+ \4 C) z# W6 {: M*/
$ j1 T. j" t/ h#include <winsock2.h> - |! f; [) A/ C1 C" f; L0 y
#include "util.h" 2 s! G2 y& J' n. o% d- Y) C$ w

7 e; T. ]2 A# {) y) \  R8 \class TEA { 0 {8 ~9 `  c" A6 P1 A2 K2 }
public:   H7 |- c4 j) I: T5 Y& F& H
    TEA(const byte *key, int round = 32, bool isNetByte = false); & @1 d. b) {0 I* z
    TEA(const TEA &rhs); , G/ g5 V9 l8 @: b9 ~( C% G  d7 x! |# Z
    TEA& operator=(const TEA &rhs);
: w: v# Y6 Z( N! M    void encrypt(const byte *in, byte *out);
6 A6 H. H6 W; k+ v! P9 F    void decrypt(const byte *in, byte *out);
: M  p+ \% ~' a; ?private:
- L& {/ a9 l( H2 J. B    void encrypt(const ulong *in, ulong *out);
( b/ r) E/ C" F7 g% N0 w    void decrypt(const ulong *in, ulong *out);
3 |" V% {, e. D/ G/ Y% C5 W: V    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
5 p3 I( O7 V+ v" c5 Z2 B9 ^    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } - q) C3 }5 D5 Z- O7 T
private: 4 N0 b/ }9 {7 Z% ?
    int _round; //iteration round to encrypt or decrypt
- a3 D4 ^* d/ v    bool _isNetByte; //whether input bytes come from network ( F2 |. T( ^# ~7 }" A
    byte _key[16]; //encrypt or decrypt key / ]; T) j" O: n) Q2 H5 N3 F2 Y
}; / T7 n( z; K# i0 P. F) Z# d
2 p+ k1 J2 D% A+ Y9 }
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" + k  u5 F1 d3 G, H: V; Q& f
2 #include <cstring> //for memcpy,memset " f; R) A3 x8 m6 ?
3  
% ^5 z8 f+ y7 `; ~* f# e1 ]& t3 C$ _ 4 using namespace std;
+ [3 K- d# ~, X! ^7 g4 O" c 5    y( h* i# H( n9 ?3 y$ \) C2 r; N
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
: h" Y% w, r& s% g- ] 7 :_round(round) : s  K9 R+ A/ s4 `2 m
8 ,_isNetByte(isNetByte) { , S. o9 {5 j5 E% L7 ]$ \
9     if (key != 0) 1 y  M! E- A2 @% I# g  G; v
10         memcpy(_key, key, 16); . W: g9 \; U" ]( P% i, `2 M# ~. h
11     else % g7 ^3 m) s0 C  e, c8 G6 k9 S" R
12         memset(_key, 0, 16);
  m8 I0 e( A0 p( t8 j- W  e13 } # x( y7 h  k+ b' j1 o
14  $ z/ h; t/ E4 \5 N) y! r* H- N  V
15 TEA::TEA(const TEA &rhs)
3 f% J8 w  u" a16 :_round(rhs._round) / Q: M+ h4 a, L% p5 T/ i
17 ,_isNetByte(rhs._isNetByte) {
% H. t5 k1 C8 l: C# a, Z18     memcpy(_key, rhs._key, 16);
' {- p% Z  V7 G$ z19 }
  J  f' s# j8 [' e( n20  , s2 Z5 x, M6 u; y& N2 @
21 TEA& TEA::operator=(const TEA &rhs) {
; N  S7 S: [7 v; O22     if (&rhs != this) { * W) L- p8 G+ n6 ~  ]: V" b; R
23         _round = rhs._round;
5 Q9 e* R$ k8 e. I6 p: A24         _isNetByte = rhs._isNetByte;
$ t( ^% b7 f7 f& {2 p/ E25         memcpy(_key, rhs._key, 16);
# v4 S+ H7 [# h$ X. r26     } + i1 g8 ~) o- J2 }2 n' E
27     return *this;
0 R% q6 p" j% J# E( e1 U28 }
' i! v+ }& V! |1 D; U; b* v, Z29  $ a; l  p8 k7 s2 N& s9 g( [/ @- m
30 void TEA::encrypt(const byte *in, byte *out) { ( E5 H: W/ V( L1 r- a
31     encrypt((const ulong*)in, (ulong*)out); ! K( m& a* g# e5 Y9 e
32 }
: @, m$ j& I& z! A! A4 l( l33  
- C7 l, o$ s" E0 d% M) [! d34 void TEA::decrypt(const byte *in, byte *out) { # @# V; g# K# m1 K1 u' w
35     decrypt((const ulong*)in, (ulong*)out);
$ B; h. `+ x! b* e1 Q5 N36 } 5 v) L5 B5 l4 t8 X( @" h8 d
37  * u8 R/ h  l  Y* W9 ]9 x
38 void TEA::encrypt(const ulong *in, ulong *out) {
: u7 k- K+ ~" U3 v/ S39  ! ]& g1 Y4 A5 H) q
40     ulong *k = (ulong*)_key;
% e- f# Y8 e: b! J- D# B5 N- y" ]41     register ulong y = ntoh(in[0]);   A7 {+ ~8 `1 I; W6 e# w6 X/ ^' `) U
42     register ulong z = ntoh(in[1]); : \6 V6 D+ X/ T. Y& j$ J1 z! J$ o9 V
43     register ulong a = ntoh(k[0]); - C. G2 l. m, f% J; n
44     register ulong b = ntoh(k[1]); 5 |! u2 \, N: C: ~# h2 s
45     register ulong c = ntoh(k[2]); 2 k. u* n# C" B% @% B
46     register ulong d = ntoh(k[3]);
) L) H# z+ S9 k" n- m" g47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
6 W( c/ Y' D0 {1 v4 I' D48     register int round = _round; ' X5 ]% T5 }  X" j; r' i- Q% J5 y
49     register ulong sum = 0;
7 V4 C. n; H6 T  k; B50  
8 j' h- h+ {' X% o9 X! F; a( `51     while (round--) {    /* basic cycle start */ 7 m, O( k  P. c) o5 Y1 `
52         sum += delta;
0 c1 A+ g1 F+ d53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); " h6 Y: a7 K0 Y2 h+ y# L8 l" a
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ ~" N% |: X) x* }55     }    /* end cycle */ 8 w3 r9 l/ K$ n( K7 g) X
56     out[0] = ntoh(y); " G4 B1 H& Z  q6 o$ e
57     out[1] = ntoh(z); ! O- f' v6 w4 i" @& Y. A8 A
58 }
8 U" b9 N: n* w: W3 I' d1 _59  
6 {0 |. _5 c% [- c1 g! C60 void TEA::decrypt(const ulong *in, ulong *out) {
: @; @3 Q0 `- u2 O2 x61  
) {3 i$ G; _* Y3 _" ~62     ulong *k = (ulong*)_key; ; _2 Q) k/ w' N6 A( o9 A
63     register ulong y = ntoh(in[0]); 2 h& X/ T4 X* {& x$ T& v, {
64     register ulong z = ntoh(in[1]); 9 G! E+ n+ z8 i8 b6 s
65     register ulong a = ntoh(k[0]);
% Q! U+ p7 _' P. U2 n" |* f66     register ulong b = ntoh(k[1]); , g( u2 a9 P; n! W
67     register ulong c = ntoh(k[2]); 6 c- p) h. X* ?8 e: u' R% C
68     register ulong d = ntoh(k[3]);
2 N. d! P' T4 |6 p2 T6 p, B' ]7 N69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
7 a4 G% U+ Y  W% U* i70     register int round = _round; ! ^6 T/ L, i& I. s2 w
71     register ulong sum = 0; % S0 {, F& S( T, j) C3 G
72  
. T5 O# I- |2 ?8 ~73     if (round == 32)
  d, k. ?2 T* T! W74         sum = 0xC6EF3720; /* delta << 5*/
6 j; H3 [7 F; [75     else if (round == 16)
% L3 \2 y6 M% U, a" t76         sum = 0xE3779B90; /* delta << 4*/ 7 s- E0 |8 x2 k9 j& C/ ?
77     else " n: t" _9 W0 p" ]# g, {
78         sum = delta << static_cast<int>(logbase(2, round)); ! Q4 c/ D5 O8 Q& u/ s6 i" U
79  0 ?1 n3 S. w6 n2 V7 l/ l/ D& U9 ^" ]
80     while (round--) {    /* basic cycle start */
$ m- n6 q  ^6 ]# t. H81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 0 `! e+ E* Z7 Y* N1 V! X! q, [
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - }$ e3 j8 t$ F) \
83         sum -= delta;
9 n9 @4 `( |7 B84     }    /* end cycle */
7 P5 l* J" c- T8 r5 f( N85     out[0] = ntoh(y);
% o, E  {( A0 @' k* P! e$ R9 [( e86     out[1] = ntoh(z); . p- J2 u  D5 _' Y+ r1 b
87 }
9 s4 S  v# H6 G, _" H. e0 t& q
$ X# r  Q, k& I, G7 w需要说明的是TEA的构造函数: ! A' A; r2 b9 q; g3 k' F- X- n6 }8 F1 o
TEA(const byte *key, int round = 32, bool isNetByte = false); 1 a4 N9 B4 O0 g! B2 ~( E+ Z
1.key - 加密或解密用的128-bit(16byte)密钥。 : S3 V+ y) K+ F9 h, v% Q. }
2.round - 加密或解密的轮数,常用的有64,32,16。 , ~0 M& k* ^+ P/ Z9 p: o
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! . I9 J- ?2 I8 }5 o

5 }# Y7 A* d& x; z6 N& ~最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" $ F$ r, T& L7 r' P: t1 W
2 #include "util.h" 6 s1 [, H/ H0 M2 ~; O# w1 e
3 #include <iostream>
2 O4 W1 N! l, P, m 4  ! A( y. l5 _) Y4 ]( {
5 using namespace std; * j8 M; _! _' p" O, C
6  $ O/ x1 W* I9 ^4 w- Z6 N
7 int main() { 5 B1 Y7 I  t/ d7 ?; |% C; f
8  
" x9 c5 H9 f- P  B 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ' v, i% V$ s8 r! f/ _
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); : B( ?5 d9 [8 H" Z2 t
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
  l7 [; }+ O5 G6 g  V12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
3 k7 A& p- I5 e3 a13  : ?3 l. I- F7 p5 f
14     size_t size_in = hexStringToBytes(plainStr, plain);
& G! q$ O: b" d9 j8 P* U: `4 q15     size_t size_key = hexStringToBytes(keyStr, key); , N8 i* x: |# v- z2 ^8 X
16  
# {3 O6 E4 {$ H8 G, r# h6 W17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
; |& x2 p6 I. d% p7 M  E  u18         return -1; . U/ ?' t: P2 h, N( F# }
19  
$ S6 G8 O- Z' {9 S20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
8 ~+ M1 o% ]: N' c, B1 ~( g21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; , A# w# k! J( N4 M& w! ~
22  
. E5 H8 ?+ M% b1 i) G23     TEA tea(key, 16, true);
3 V1 {! \% J9 u6 j' L24     tea.encrypt(plain, crypt);
) h- T7 n' a& i/ H7 s3 {25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 7 ^% V: b2 Y% N5 `5 z
26  4 ?5 ~; E0 m: E
27     tea.decrypt(crypt, plain);
+ \7 k  N- i2 ]0 V3 c28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ( ~6 t9 J- O! ~- z  T+ e4 \
29     return 0; ) F" a. H1 R: M, w( c; n
30 }  }* ]! C% \' I0 }* G2 p

- W% J0 e; p/ }. {2 m5 ]$ g本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx# g8 Z$ g4 R- _6 ^( m4 A
运行结果: 8 G2 _- Y0 w0 q$ o( a: @5 a
Plain: AD DE E2 DB B3 E2 DB B3 , D1 s7 l! e: j8 y0 O2 O# y
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 7 L3 m% W7 J! v& ?; o  L1 C
Crypt: 3B 3B 4D 8C 24 3A FD F2 - H2 @" Z3 u6 G2 E6 f) e. o
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-25 15:19 , Processed in 0.021730 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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