找回密码
 注册
搜索
查看: 37868|回复: 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轮):
* `3 }! v/ m& X4 C7 r: w微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ! B% l( ]" G( l, D7 L2 T
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
! e4 ^1 s0 n1 G" |. R9 F8 r: v之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
; ^* m$ U5 _+ `) U: d2 e8 f在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
7 y+ _# s! g0 D/ `$ c在 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. " E$ v! f3 O/ J
  2. void encrypt(unsigned long *v, unsigned long *k) { * U2 Y( g7 J$ J' }
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    5 q; ~! z5 X9 p6 d9 `, D" ^
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ' c4 `( Z" j$ P8 y, _
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    & r, E% y  H+ X0 z
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ! \- b2 B7 [% y0 C
  7.          sum += delta; , B4 ~" w; E+ s8 P, p/ }
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    * B8 l* V9 ^# [0 C4 r
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    0 _! g( }2 ?7 i4 N+ A
  10.      }
    # ?) [1 x, D. Z: V  w
  11.      v[0]=y; % K! V/ \4 Q$ R8 L( t$ g1 l
  12.      v[1]=z; & r2 {8 g! `& l& j0 i
  13. }
    . f$ k, d4 ~& i. G1 C& I
  14.   
    9 R. S. X$ J: ~3 K( S/ d
  15. void decrypt(unsigned long *v, unsigned long *k) { 1 H5 O7 {7 M% g( S
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    4 g& b6 y* d5 n$ [7 t
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 6 J  ^+ l0 K7 W1 ?
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 2 ]' `  C- R% E1 w
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ' Y; O* L: b. q5 J4 p, T' l
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    * ]: U1 J- P0 _. ^
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 5 z  J5 X9 _: Z# e- Z( b
  22.          sum -= delta;                                /* end cycle */ 0 G, a7 m9 \* N$ j/ i
  23.      } . _1 R& S/ m- U. x
  24.      v[0]=y; . @; J! x, K& @7 a" D/ \# T% G
  25.      v[1]=z; ! h! v- w" Z+ \
  26. }
    % a( y# Q+ c5 ^7 t% R# y' B( L
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
! K/ M0 Q& }0 v  W( _#define UTIL_H 6 I' K2 s) t8 n' ?  [& O( ^% V& t
0 V# \% b6 ^0 k5 N" F# J* ~
#include <string>
2 Z; u9 w6 T6 T7 d5 ^#include <cmath> 5 x! k$ c( c: V: D$ @5 U) U/ `
#include <cstdlib> 1 q& W1 R; T1 \' d! U! X
. G0 |* w- T% Y3 @* F. B* K
typedef unsigned char byte; ' y' C+ \# K% c. R' P$ j6 @
typedef unsigned long ulong; 0 K( U) r) ^$ f% U( n$ }5 O

( E* Y# b" F2 ~1 ]inline double logbase(double base, double x) {
) V. J. s! b& r    return log(x)/log(base);
2 T$ m# s# {% H* o  R0 J. r% H}
$ {% r+ }2 U" \* X 1 c0 O) Q7 ^* f* R% ?
/*
) {9 w$ V$ ]7 b9 M$ E*convert int to hex char. ; u5 j# }9 @# C/ ]& r
*example:10 -> 'A',15 -> 'F' 4 ^3 M$ G1 \/ L& k" s- b& E
*/ * L7 v# J/ _6 I) n+ w7 F
char intToHexChar(int x);
) K/ c) b! Y" M5 ~ + d3 H/ y, B7 a* G
/*
9 N' t* F( ^9 P; H5 X* B*convert hex char to int. 8 L& g6 S9 A& {0 O
*example:'A' -> 10,'F' -> 15 2 ?/ W6 @4 ^( K
*/
; r) q0 B1 {$ k  w& wint hexCharToInt(char hex);
' y+ \  G* N4 l/ O7 f7 W6 d8 w- B. e  L
) a' [* @/ m7 c" M  |# ?using std::string; $ b" C: d# P+ x9 u# l
/* " v0 C7 T: W/ `% Q! D3 Y6 d. e
*convert a byte array to hex string.
; Z5 _' P( t& T, A% U7 L/ [. b*hex string format example:"AF B0 80 7D" / T) q; |* Q1 Q8 N6 X  o& j
*/ 0 `+ P4 E* n# k
string bytesToHexString(const byte *in, size_t size);
! l* V( s3 C! S! O' T" D- K8 I ; s( j% n+ p8 f# T' t- t
/* " L2 b2 F! J0 M$ D. _
*convert a hex string to a byte array. " L9 t& g1 d# u2 ?' M
*hex string format example:"AF B0 80 7D" ' s! k% f! x% _% [
*/ + g6 d# F" G4 ^, o/ w
size_t hexStringToBytes(const string &str, byte *out); 5 t1 f. I" \: s" R" V+ K6 u+ F

; x/ \/ d: a; P9 C#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
6 w0 ?/ a9 o! Y! ^3 w#include <vector> ) \% \2 C$ r6 X3 w; q2 g
/ t7 y( q& Q+ o9 K
using namespace std; % T& g2 M! z- `7 P

: b* t, u, k" `9 g8 Q3 Gchar intToHexChar(int x) {
/ O6 z! ~2 _; ]7 l2 A9 N    static const char HEX[16] = {
" T# Q0 }3 s( ?/ s4 o$ a/ E        '0', '1', '2', '3',
+ x8 H* \% a. Q1 \) @        '4', '5', '6', '7', + k4 i5 k) D- F
        '8', '9', 'A', 'B',
9 p8 ^1 o  D5 `8 Z5 m        'C', 'D', 'E', 'F' 6 b& X! t" _( z) X) Q
    };
4 j5 g" ~" J4 ?$ c# K2 z    return HEX[x];
' [8 J: U& e- |+ Y}
: k& @9 u& f0 R! S9 m" [1 C' |7 X 4 Z- s8 b2 P+ q2 V
int hexCharToInt(char hex) { ' a4 P7 Q) R+ ~" m2 u0 g, ]1 e
    hex = toupper(hex); 3 b7 A: x4 I: i+ t: D5 V' [$ a. D( d$ t
    if (isdigit(hex))
% y% G3 ?- O+ q: k0 p1 o8 U        return (hex - '0');
! J4 A6 T: P2 x9 S( T% @    if (isalpha(hex))
" O2 E! S- Y0 S& I6 B        return (hex - 'A' + 10); # U2 }2 F. N  V! W# L, b, \
    return 0;
" a  h+ H( W2 U6 w4 ?}
) V: X* d) I; s8 l 8 x+ y3 V8 {# `6 B
string bytesToHexString(const byte *in, size_t size) {
3 i5 _: z$ a, [# \5 K5 W6 ^0 O  Z    string str; ! j* k. O& U6 ^# ?! M4 f( g+ ~
    for (size_t i = 0; i < size; ++i) { ! d( x5 Q9 E' Z' i7 \) J
        int t = in[i];
8 [$ j' S9 p& i% [3 n, e! w* v6 N        int a = t / 16; + K" w: f8 u! E& F
        int b = t % 16; ! T/ n9 M% A1 |) ], p
        str.append(1, intToHexChar(a)); , R6 ?6 }0 F# N" j) m! e/ G
        str.append(1, intToHexChar(b)); " C0 [! p4 [4 r
        if (i != size - 1)
( X* M" a: N" j7 y% Q: Q            str.append(1, ' ');
% D  f6 t( d& G7 S: o3 w$ y    } . K6 A) Q! T1 P& _8 K& _! G0 n
    return str; + |6 Y4 _+ m6 k
}
3 ?3 a9 o, R9 u5 F6 s1 C
' ?( E2 c; z2 I! rsize_t hexStringToBytes(const string &str, byte *out) {
1 ?8 n0 @" @4 j6 ~# _6 B* d& O ! h$ J( M/ E/ q9 B; Q
    vector<string> vec;
4 @, _" _+ V& g9 s! _    string::size_type currPos = 0, prevPos = 0; ) ]7 H- t( k6 t0 ^
    while ((currPos = str.find(' ', prevPos)) != string::npos) {   F8 }/ d# T' t6 u3 x, r
        string b(str.substr(prevPos, currPos - prevPos));
/ ?6 s% E. ]. a        vec.push_back(b); 5 M6 K+ O  B+ Z) {
        prevPos = currPos + 1; 7 Q+ Y! e. t: E5 f' ~
    }
( }  I5 Q3 O) P9 P, i% u; M! x* v    if (prevPos < str.size()) {
9 U# P, _! ?5 V- F2 _& |  T0 w! S        string b(str.substr(prevPos)); 1 y% {* N# S! ^# {* j7 R) N+ O: i8 m
        vec.push_back(b); : _4 _% C. \9 T
    } # [% A- b: p, O/ g  ?! F, E6 n: u
    typedef vector<string>::size_type sz_type; 0 D" k$ `( W" a! U$ n9 i: D! I% e7 Z
    sz_type size = vec.size(); 2 q* g+ k( C0 a- Q" \9 _
    for (sz_type i = 0; i < size; ++i) { % Z4 f( |; C% O4 V/ ~, \1 U
        int a = hexCharToInt(vec[i][0]); % M, C! f- f( w- y- W1 P7 b
        int b = hexCharToInt(vec[i][1]);
" ]7 @1 N0 V' l3 H7 I- B        out[i] = a * 16 + b;
- w3 J) w( H7 ^. Y7 E. M% S    } ; G: H( ~  K" W
    return size; $ s0 X) w+ K8 L$ K! X3 x  {% R9 u
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H # u' R8 V# {3 t; O/ C" h7 Y, X2 U
#define TEA_H
" u. O) g3 S# _# M' \
5 R& I# U* c- F7 P9 J+ z4 q) Y/*
+ b1 |2 m+ V# Z2 G*for htonl,htonl
4 V* v9 v1 v$ b& s" Z- f*do remember link "ws2_32.lib" , c/ o1 p* ^& Y: r
*/   _4 k8 F) c* v# x" S
#include <winsock2.h> $ m5 E5 A& z6 |. N- D3 m
#include "util.h"
: V8 Y( d& o8 S/ ^; G
: q/ V2 v" V# P$ A& B1 s- wclass TEA { 5 ?, o- X* }4 S. S; [) @
public:
+ K# [$ ~- v1 K* u9 x( {    TEA(const byte *key, int round = 32, bool isNetByte = false);
* a- p+ g$ P& a5 z5 l+ n    TEA(const TEA &rhs); $ ~; \, K% F) d7 j6 g
    TEA& operator=(const TEA &rhs); 7 _/ I9 _2 X) g
    void encrypt(const byte *in, byte *out);
! c( F& E9 @' L- w/ p    void decrypt(const byte *in, byte *out); " |& R6 H7 S) \) _1 a9 `
private:
. q6 X/ @# W! W8 R) N    void encrypt(const ulong *in, ulong *out); $ C! P* Z8 l' A
    void decrypt(const ulong *in, ulong *out); / t( T) ~4 X" U" d* c; ]) v
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } & M  }/ o/ x0 A6 G" C  t, Q
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } - ^: ?* o7 d5 I4 _/ q) g
private: ! _& G5 m- G9 e$ ?6 T% |
    int _round; //iteration round to encrypt or decrypt , V9 L8 B# ~( ]# r9 _" j
    bool _isNetByte; //whether input bytes come from network
9 ?2 M* Y# T' ^+ ^    byte _key[16]; //encrypt or decrypt key 9 E) v% _$ j1 T4 Z7 j; X" m
};
3 ?- a( g4 v& U" [6 u
8 X9 ]; o; `% n3 u# q2 q9 b* t#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
! G/ ]/ ~: z9 \% |9 P) A- { 2 #include <cstring> //for memcpy,memset 2 ^7 e- M6 g2 U2 o6 I# }
3  * h3 ~8 {* t/ |# E1 u
4 using namespace std; 8 I2 J% ^$ T& [7 c0 R  e; C
5  , p8 Q; H6 J  Z9 s
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) # \+ `- o/ e7 X$ u5 v& l
7 :_round(round)
' ~: d& k; Y! l- `7 i 8 ,_isNetByte(isNetByte) { 4 y. h7 F) V( D" K- W
9     if (key != 0)
; N, m4 O# X- w( W; j10         memcpy(_key, key, 16);
! \! @& I# V+ K0 ^8 S+ F! ?11     else
; P+ ~" Z8 ^9 J12         memset(_key, 0, 16);
, c+ s! u! J& g8 [5 S0 y13 }
& Y( J: ]0 R6 P: N: x3 `14  * M5 M, y7 A; B
15 TEA::TEA(const TEA &rhs)
8 \* }+ g# E2 ~- Z" m16 :_round(rhs._round) 4 E# t1 Z, C* ~# |& e9 C+ g
17 ,_isNetByte(rhs._isNetByte) { 1 a# [& _( F) ]5 C6 u
18     memcpy(_key, rhs._key, 16); : j9 X& g# m" i" X6 H1 ]
19 } 0 O9 [; v+ v/ t8 c
20  + q$ x- a8 u4 ]2 q
21 TEA& TEA::operator=(const TEA &rhs) { 1 C/ n" D' }' Z9 O8 X" B
22     if (&rhs != this) {
9 x+ @" Q6 W! D* O% q23         _round = rhs._round;
& U: u; r, }  l& {: J2 ]0 O  }24         _isNetByte = rhs._isNetByte;
$ @5 C! j; ~9 g3 {4 B9 [: n9 ]3 y25         memcpy(_key, rhs._key, 16); / n6 _2 q% A1 L# f
26     } 3 Y6 W0 M# H/ M0 F- x, A2 X
27     return *this;
; F7 @& g% [, x/ i28 }
2 o6 k+ g. C) M. v29  
6 h. W- v1 x. r, E9 s# k30 void TEA::encrypt(const byte *in, byte *out) { : @, c; _: v% @2 ]+ J- k
31     encrypt((const ulong*)in, (ulong*)out); % Q: h2 a6 M, X! s! j# z
32 } / E4 x# k6 S% j4 A% e. Y5 s
33  
$ M1 J: ?0 n) G( f% G* ~1 U% n' J34 void TEA::decrypt(const byte *in, byte *out) {
) I8 S7 U* c7 q; u35     decrypt((const ulong*)in, (ulong*)out); & ]. ~! p: f: \. r0 {( F6 h$ U2 G
36 }
6 t7 p/ }, g) Z( U+ D37  
, Y' M, y% _2 i. z) M! r& B! N38 void TEA::encrypt(const ulong *in, ulong *out) {
, m' n! j; L9 z" C% _9 b39  
( m* G* e  A7 _: w+ t! q40     ulong *k = (ulong*)_key; 3 d8 w4 e7 Y% {+ I) Y, I9 D
41     register ulong y = ntoh(in[0]);
# V; @+ ^$ _2 p2 `9 o( t42     register ulong z = ntoh(in[1]);
, N' p8 O( ]2 m# y1 j$ y43     register ulong a = ntoh(k[0]); 6 S' @- |0 f! t
44     register ulong b = ntoh(k[1]);
7 T9 Y6 b& F6 b9 E% @45     register ulong c = ntoh(k[2]);
5 ^( S( Y3 G& r  v46     register ulong d = ntoh(k[3]); $ m9 J( M3 p1 n4 E* m
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 7 g7 s. b- w, M1 _
48     register int round = _round;
" V9 A9 k( T$ l9 O49     register ulong sum = 0;
1 R2 ?3 x9 G9 d+ z6 a: T7 L2 N, Q5 ?50  
; p/ `* s2 Y  J6 |! _8 Q51     while (round--) {    /* basic cycle start */ ' ]$ {+ w1 r( {3 D4 I: D/ K" G) G
52         sum += delta; ) t7 {$ B+ w% d' q
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); # H! i9 b, ?6 D1 ]
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
8 Z8 z+ _7 N  ^55     }    /* end cycle */
4 S2 G8 o+ S- O/ f1 \1 N56     out[0] = ntoh(y);
4 U* n0 e. Z0 Z0 b, R57     out[1] = ntoh(z);
- A1 S$ T$ O1 Q! }/ Y58 }   j4 g3 h+ U* F
59  . @/ N2 T: H7 s1 @1 |( u
60 void TEA::decrypt(const ulong *in, ulong *out) { - z) @8 ~; e8 `8 A1 G6 |6 T4 D
61  
( o2 l8 M9 V: q& |8 X3 d. y2 d! Q3 `62     ulong *k = (ulong*)_key; 1 {; E3 o8 f7 L# `0 H
63     register ulong y = ntoh(in[0]); $ D- Z4 C6 v% o- v7 C6 [
64     register ulong z = ntoh(in[1]); 2 g- l+ u. A2 p6 I# w# d
65     register ulong a = ntoh(k[0]); + N) J. R" G) K% q7 D1 R
66     register ulong b = ntoh(k[1]); # C0 k: x2 w. K
67     register ulong c = ntoh(k[2]);
7 \4 k/ C9 |( O! B68     register ulong d = ntoh(k[3]); % O5 A: n( t! T5 @9 ], t+ ?
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
, Z5 f( ?/ Y7 k9 o+ i" F1 O; q70     register int round = _round; ( F. E; \' H9 l+ E% o1 X  E
71     register ulong sum = 0;
% ]/ c% s' W1 i$ U# T+ L72  
1 D! i5 ?3 m0 M1 A" I! n4 P73     if (round == 32)
, j/ v$ H) N  O0 `8 j" i; ~4 W4 A  V74         sum = 0xC6EF3720; /* delta << 5*/ 1 Z+ c( b# u* @1 `3 j
75     else if (round == 16)
6 s1 X$ V$ v8 k$ g( u76         sum = 0xE3779B90; /* delta << 4*/ ! ~9 e: f! A$ X7 R+ \# f, Q# E
77     else ; h, p1 N" G5 H% l  B) O
78         sum = delta << static_cast<int>(logbase(2, round));
( `3 R/ x  D/ e; @" s. D79  6 A0 i5 A  n+ B; W( |5 p
80     while (round--) {    /* basic cycle start */ # U% X: w, R1 M8 d) Y3 {
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 8 S5 U/ }8 V) L: w7 L
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);   o" q, R/ I3 ~8 d( B) N# }0 `
83         sum -= delta; . D, G3 i6 P' w  K, z# r" U
84     }    /* end cycle */ 4 \6 s; ~6 R( ]& `
85     out[0] = ntoh(y); $ b  J6 q7 Y8 U4 p, o6 e
86     out[1] = ntoh(z);
; H0 J9 H8 a0 c% y5 e3 v87 }
( B4 }" P5 x# H- ~/ y& j8 O8 G9 @: R* g
需要说明的是TEA的构造函数:
8 f  ]/ q5 d, T2 C1 B. v) DTEA(const byte *key, int round = 32, bool isNetByte = false); & n7 f1 G6 C7 n/ |% w
1.key - 加密或解密用的128-bit(16byte)密钥。
: Y( ]9 [  _! ?( ?3 J8 }9 A2.round - 加密或解密的轮数,常用的有64,32,16。
# H: x" v7 H/ ]3 |! K& J3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ; z2 I6 u+ g5 t2 I. i- W
( e+ [- T( `" E
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" % I1 q$ Q+ y: z/ s3 p
2 #include "util.h" / ~/ j2 T! w- w' H( n% E0 o! |
3 #include <iostream>   D# E% s3 A! h0 Z. B/ N1 _" ]
4  ) ^. C: T, @9 k* V7 p) {+ u) N
5 using namespace std;
; G7 f/ y! Z8 k  W8 f! k 6  : D  G. y" K' j$ f) ~& T
7 int main() {   I4 w% x* Z7 \% {( @+ D% \4 S
8  : }2 @# y; |+ |; z( y4 O
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
1 t1 l; R3 v* I: V4 G! {# c10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
: v! q- ]% N8 t0 s; A. a11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; / B/ J/ o0 ?& m1 T3 ]8 W
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 4 f* y3 f# i( T4 i1 L1 X
13  
, `" V9 d* N' K2 u. p14     size_t size_in = hexStringToBytes(plainStr, plain);
0 t- o3 [9 y( H8 }# E' ?# F15     size_t size_key = hexStringToBytes(keyStr, key);
: S6 C$ G. H# P4 x2 z8 R16  
1 E4 g, H) E& h7 d$ }! I17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
1 v; s& A* [. s# E* b. ]0 b18         return -1; ' ^% x, g6 U# a, p! G% b
19  ) ]7 X0 g0 t) r5 w0 g6 D4 ^
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 8 V# ?% s, C9 s, G
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
5 k& S2 r* j- p  C( W/ n22  
7 E6 A: L7 y' D2 Z, S, R! c7 z4 e% m23     TEA tea(key, 16, true); 4 [: J1 y% d0 s
24     tea.encrypt(plain, crypt);
7 t) F2 N7 s8 S( ~. v  J25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
# H) a/ }/ J5 F2 J* P- C26  
1 g/ `  ^7 W; q8 ^8 V3 {27     tea.decrypt(crypt, plain);
6 {7 J! ?2 m4 n7 C( j28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 8 {+ n7 Z' _4 `+ B: M% r9 n
29     return 0;
! w! O& `7 _, g' F6 n, `30 }" g: B1 ]2 g" u9 q

1 E1 |) I- h! y8 [本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
- n/ q) c: t& X运行结果: , z- W  N6 c1 v& @
Plain: AD DE E2 DB B3 E2 DB B3
8 E5 g8 k/ `- K2 a6 @! b- LKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
9 u" J1 D* k6 ~Crypt: 3B 3B 4D 8C 24 3A FD F2
0 {! ~9 e" V5 D( ePlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 06:45 , Processed in 0.023249 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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