找回密码
 注册
搜索
查看: 37788|回复: 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轮):
. Q) t# t/ g  w" E  ?$ P; S; |3 L微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
; |9 P* x4 a% _3 k) @( k! R2 [TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 - X5 J! j; V1 {& h
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
9 Z: H% G3 u, A/ T7 Z5 B' s1 d' a在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 7 U3 @& t; ^8 G
在 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. % A" y- Q3 j' v0 b, ?, K% r; Z7 l
  2. void encrypt(unsigned long *v, unsigned long *k) {
    , J8 _3 n! T8 [) @
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    2 Q" j: _5 w8 Q: p& W  f' A
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    # v' F3 b% Z! Y9 m, k
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    7 k9 p$ C; }4 n* g( ^# ^4 g$ d
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 9 K' Z' W) k4 K" ~$ N2 u
  7.          sum += delta;
    1 O8 {+ Y& ?8 S% @, C! x
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & @5 r9 s( }+ T  B% N9 n& B
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ % y2 e& C# ]7 f; @. }: Q
  10.      }
    0 `; j0 b; C) Z+ H( I
  11.      v[0]=y;
    * @1 a; q5 \8 ~( M0 Z4 Z& B5 n/ Q2 O2 P
  12.      v[1]=z; , i5 g9 A0 X# H- S4 H  t6 x, c/ C
  13. }   C4 c0 ~% y( y! x1 g1 }
  14.   2 [7 T! P' }  t, U/ y$ W
  15. void decrypt(unsigned long *v, unsigned long *k) {
    , E* m* s# b. b% Y* T
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    6 T. t4 m3 ?5 g9 Y. ~
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    # W4 q" T) }: N7 k
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    & M4 ~8 X, I* Z: {. s; ^
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    " S2 [$ M" A, o
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ! {4 V$ ^' v: U3 q! b
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    - k$ W2 P/ t  w6 L( L9 K9 P% k
  22.          sum -= delta;                                /* end cycle */ . u# C8 B% l# V" }' }
  23.      }
    $ C5 F6 e3 }9 @7 Q7 h1 `
  24.      v[0]=y; ) m) {4 m) a4 {5 E) Z8 \
  25.      v[1]=z; ) `9 X: S# s3 N- l
  26. }4 d8 V4 t" \& S
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 3 a; v8 X0 C- x( V! m0 Q' ~& s
#define UTIL_H
  J. [7 q( b  P; a* F, {
( E& Y: s+ H6 o& |0 L3 r3 H#include <string>
% r2 d+ b3 ^5 d: @/ a4 I9 X#include <cmath>
, e- Z+ `5 W# t/ U) q% H8 m#include <cstdlib> ) F3 `; k% \  F

9 t4 s0 o& o7 C3 U" j' i6 Etypedef unsigned char byte; : O* r! S8 _3 W0 F6 s9 r7 w
typedef unsigned long ulong; 5 Y6 s2 W0 v4 y: I9 C* ^
9 f4 G5 \% c: m7 O+ h& |1 B( d' D! U
inline double logbase(double base, double x) {
  Y" k; @; h$ v0 f    return log(x)/log(base); & X& N: ]- ^+ R. y/ Y1 V
} 9 P0 B$ l0 G% i# b& W
/ p4 b" _3 g  f0 l& M2 E6 I
/* & k, ~' r1 W# b! V) e- P
*convert int to hex char.
7 b. z" ]* [2 g0 v+ x# e0 g# N: x*example:10 -> 'A',15 -> 'F'
; G; K0 {$ ]1 c) K" c1 O  M*/
# |# O% u" l6 y: x! ychar intToHexChar(int x);
( q4 C+ l2 I0 T6 ` ; m3 B7 b  D) N  ^, N8 i; T% q5 m( z
/*
' A, F. v# G( {: @3 k*convert hex char to int. . ~% E; m' V' f) s' l& A
*example:'A' -> 10,'F' -> 15
8 E6 m1 S: S5 s! @: l7 U# n! r6 H*/ 0 y0 E  l% s) o- B) G1 F( f& X
int hexCharToInt(char hex);
* C) S7 X8 ~0 a4 F: ]  ~ 2 ]0 `3 ^3 r; F# v, _0 l
using std::string; 1 Y! L- k  z* u2 U
/* 1 j5 [$ s+ L- d9 l% k; n
*convert a byte array to hex string. 5 I* J  V: E7 I; d% L) z
*hex string format example:"AF B0 80 7D" , V3 Q. m: O& J6 g, r/ }" ^
*/ + N7 |9 M$ D8 e# l! G5 M
string bytesToHexString(const byte *in, size_t size);
4 p+ O4 U& T* `; L8 N- D1 j / m4 K: m$ v7 ^2 M5 v1 R5 d
/* ( }7 k1 ?! {8 r( P6 d
*convert a hex string to a byte array.
) E+ H. L, j1 S, t3 l$ @$ B* U  A*hex string format example:"AF B0 80 7D" 7 [" L+ L, S  O. i
*/
" s) J0 I) L. [6 Ssize_t hexStringToBytes(const string &str, byte *out);
, f# J! |7 M2 O
% R7 q0 ~0 g! w#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
' g7 b' s& T4 V( `% r#include <vector>
- U' M# C+ @: Y5 ` " R, N0 s! g( H3 Y) _0 q
using namespace std; 3 e- b9 T; u5 Y6 O- B! z/ ]
6 [5 g' }0 E: c- U
char intToHexChar(int x) { ' M/ O' j) J9 w; i8 k
    static const char HEX[16] = {
" k. g8 P- @1 k" p2 d& R        '0', '1', '2', '3', ) {* e8 e$ ~& y5 r) {, [5 D" w
        '4', '5', '6', '7', 4 A( ]; v7 X3 S
        '8', '9', 'A', 'B', + z# h  N+ H9 ~  l
        'C', 'D', 'E', 'F'
! V" G/ S5 l" X    };
4 w* p1 W& m: [* S) x8 ^! z. g& n1 |    return HEX[x]; 3 P/ @2 |$ Z/ [5 s$ M' O  j
}
8 R4 b$ _+ J7 {
- J* g# z+ |' _: sint hexCharToInt(char hex) { # O7 Z* m, T, b7 j
    hex = toupper(hex);
9 h( f- m: r$ ?" {2 @$ r9 |8 D: V  k6 l5 Y    if (isdigit(hex)) " N0 a) c$ H7 E
        return (hex - '0');
% [& h7 A# h: G+ f1 X8 n    if (isalpha(hex))
8 T6 i7 p# [" A        return (hex - 'A' + 10); / c# }, o6 y2 h+ V* B* z
    return 0;
/ W* Y1 {# {% I  G} $ J9 |1 |4 ~  ]% `6 v; X& g

8 ~5 u% b3 L+ L7 g7 B8 d  L8 B/ u9 bstring bytesToHexString(const byte *in, size_t size) {
5 Z: A+ u5 w0 \7 m" w    string str; : F  T- n0 y0 g2 ]
    for (size_t i = 0; i < size; ++i) {
4 T' O6 c& _  m( j5 C        int t = in[i];
7 {" d' A+ K& p5 f: D        int a = t / 16;
; s) }/ `6 Y( a# A- o        int b = t % 16;
" ?! q! l9 ~! {! ?% ^4 Z0 G) j        str.append(1, intToHexChar(a));
7 S' V- N2 M* g: P4 ^" t        str.append(1, intToHexChar(b)); 9 g- z' ~# d! _7 C6 r% c" u( e+ W& g
        if (i != size - 1) 3 C; |4 t, K, m) d6 ]3 S
            str.append(1, ' ');
$ B" Y% i4 A  F( \    }
, b9 c( \9 l1 V" m    return str;
" c7 v& j# T# }+ t9 x/ k}
& B! m) K2 r9 Z/ V  p" g0 j/ L8 l& ~ + [; h) y( }+ T5 {
size_t hexStringToBytes(const string &str, byte *out) {
) Q  H5 C# y' Z / u; i' T4 Y* H) ^9 d& v( {
    vector<string> vec; 1 [; {) i) w' }
    string::size_type currPos = 0, prevPos = 0;
- }" c6 S; k  |% X- E7 T    while ((currPos = str.find(' ', prevPos)) != string::npos) {
$ P; T$ x; d, W7 c, {6 Q& I; D        string b(str.substr(prevPos, currPos - prevPos)); 6 P0 D3 f5 t4 M2 X& c3 T2 J2 Y5 X
        vec.push_back(b); 9 r4 i( r  r3 r8 B4 a
        prevPos = currPos + 1; 2 N  E, p% w5 M, w" J/ H9 V
    }
0 Y& C' L8 i2 Z( v( ?! C* h3 x    if (prevPos < str.size()) { # k6 P' v! N$ \5 t5 O
        string b(str.substr(prevPos));   Q0 m8 ^+ L3 i' @
        vec.push_back(b);
( ^$ p, b- R9 }8 r* [    }
/ Q; n. w! b& j5 l8 @2 T    typedef vector<string>::size_type sz_type; 1 Y& e# A) C8 v$ z
    sz_type size = vec.size(); / l  C2 y# t$ U1 |7 V% b( p( m' U
    for (sz_type i = 0; i < size; ++i) {
) ]4 u! l5 u" r- u7 ]/ F' P        int a = hexCharToInt(vec[i][0]);
* _% F9 M0 K2 Q% d3 `        int b = hexCharToInt(vec[i][1]); 1 s! K# f8 ^5 w& g, e
        out[i] = a * 16 + b;
" v6 H( G& n. a) F! T* g1 g7 Z    } + u! h3 r' X! Z( e( C
    return size;
  a' K5 }( `) E9 R# R}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
9 H& I) Y$ y( h# }- `#define TEA_H
) G- S$ S% O  Y; D% a 9 k( R* D8 @& p7 i- a
/*
' ?; w7 h7 U% s- e- |*for htonl,htonl 2 w+ M8 E2 U; M3 g: ^# b% }
*do remember link "ws2_32.lib"
: H: g6 E, a8 j3 J1 s# W- j*/
% g' R1 L9 q5 P, |#include <winsock2.h> . _. \1 t% q$ B& L) [8 L( n
#include "util.h" # A4 X/ v6 z7 u! h5 F  N
8 t7 F5 D" D! v* ~2 D$ c, Z
class TEA { 9 ~* D* h8 I0 O2 K/ {6 A$ q
public:
8 D4 d9 |6 O( U4 s    TEA(const byte *key, int round = 32, bool isNetByte = false);
& F; i: P. Z" u! l- _7 B3 v    TEA(const TEA &rhs); $ {5 `% D0 c! E1 {+ @: g/ l& V
    TEA& operator=(const TEA &rhs); 2 G8 Y* o" v" Q' r
    void encrypt(const byte *in, byte *out); # R4 n8 O9 e! ^' ~9 |$ G
    void decrypt(const byte *in, byte *out); . a7 V. x; N0 U6 r8 X6 C$ S$ E
private: 6 |* i4 \2 l1 x
    void encrypt(const ulong *in, ulong *out); 2 l  m2 B1 r, c
    void decrypt(const ulong *in, ulong *out);
% @' N6 W+ g8 N- k6 y0 W    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
2 N0 U$ I7 n3 {+ j, i; w    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 8 V  G; G- L2 T: y" U/ y) r
private: ' ]# M- \1 ~' l2 \# {
    int _round; //iteration round to encrypt or decrypt 8 u6 ^+ r! Y2 K* `1 |& z& j7 Q
    bool _isNetByte; //whether input bytes come from network
$ L, _# O( A" u# b    byte _key[16]; //encrypt or decrypt key
/ h' x4 e8 N" L1 y$ h& v}; 5 B$ w5 z! F' H4 l

. r0 A7 `  m2 c* Z- {#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" : d2 C# h" T+ g4 \# V7 l
2 #include <cstring> //for memcpy,memset - W- a! [% V* S6 Q  y! Z$ ^
3  
9 t" j& F: D1 C+ D% h% ^ 4 using namespace std;
3 m! U3 ^8 G, e 5  5 M7 @+ o( t6 ^; p( d6 E
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
' ?1 E8 J- u. B4 l6 t 7 :_round(round) 7 ?2 ]1 _$ {" p+ v  J6 o
8 ,_isNetByte(isNetByte) { , S& i3 v3 Y( |: H; i
9     if (key != 0)
& {& b8 ~  o7 p2 O2 S5 b: b5 K+ ]10         memcpy(_key, key, 16); 0 x1 a) t. @! d3 o& |/ k  n+ T
11     else
% W  C& {+ O/ K* X% ?( R6 `12         memset(_key, 0, 16); - [; k; V( Z$ E
13 } ! d9 C( L& g' x! }0 Q  U
14  
2 K9 B) }7 p, |. r15 TEA::TEA(const TEA &rhs)
' E+ \9 |7 @6 n0 Z# ^7 h/ p16 :_round(rhs._round)
4 \6 V9 q) ]% \, r  G17 ,_isNetByte(rhs._isNetByte) {
0 S; \! E: r- |  _2 n18     memcpy(_key, rhs._key, 16); ) G+ u9 G+ a9 O6 t7 ^+ m3 J
19 } & X# J: Q1 r+ `: a. Z) ]2 r, e
20  
5 m* m; S% b$ o' w! v" J2 w21 TEA& TEA::operator=(const TEA &rhs) {
: f1 j! w% R2 `$ w. K/ a& ?( Q/ {22     if (&rhs != this) { ( b( H4 e7 {+ m2 C& t0 ?
23         _round = rhs._round; % q3 C) V+ p0 d5 |  g
24         _isNetByte = rhs._isNetByte; 8 o* \' H; O7 {5 {9 E3 R, K
25         memcpy(_key, rhs._key, 16); + ]; C- b9 z$ `/ y0 F7 {. G$ y
26     }
2 G5 A8 Q% x) S, w. R5 l. q$ o27     return *this;
1 }5 ?* h3 J7 C  F1 z+ M28 }
$ _6 y1 W5 D, H. r5 \0 M5 O29  
# Z1 y$ k; F' c30 void TEA::encrypt(const byte *in, byte *out) { * y9 x& z( |  o6 B
31     encrypt((const ulong*)in, (ulong*)out); 1 p; H, X$ G9 `& ^+ ^0 x
32 } # n1 N% o; F- Q6 u2 J" `
33  
. Y# {) X& X) Q( J34 void TEA::decrypt(const byte *in, byte *out) {
' S0 T* O$ v/ r7 s* V35     decrypt((const ulong*)in, (ulong*)out); 3 e% M' ]7 b4 o- o1 ]
36 }
9 P" j- \, W8 l37  
$ ~* B$ F/ T2 U$ ?$ T& P3 p2 H38 void TEA::encrypt(const ulong *in, ulong *out) {
& _: P( z1 k* a  B7 D1 K2 v39  3 F; i* |9 Z" j
40     ulong *k = (ulong*)_key; $ P& a. T8 B3 h4 |- l. f+ c* \
41     register ulong y = ntoh(in[0]); / @& R* O8 _7 t( G/ {+ z
42     register ulong z = ntoh(in[1]);
0 r4 x' e9 h2 R3 ^+ Q43     register ulong a = ntoh(k[0]);
7 p+ B: b# I. J44     register ulong b = ntoh(k[1]); ' T/ X: q+ ^7 }- c
45     register ulong c = ntoh(k[2]); # g) e/ z- v$ ^4 `& ]# ]
46     register ulong d = ntoh(k[3]);
# r2 _: u& i$ S; G47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
" {  }8 Q8 d( C$ @) D5 W48     register int round = _round;
- t  d* f) s% q& ^  [1 D5 K49     register ulong sum = 0; / g, G: O, e' H
50  
! \3 ^4 h/ W; L51     while (round--) {    /* basic cycle start */ 2 b, Z& Z6 ^8 J: z9 V$ g- W' H
52         sum += delta;
) I  Z: ]2 c$ O. {  X7 j53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 6 H" S/ s5 ?% H0 f( @  O5 H
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
( V6 g" l9 ^. v; `# V% s7 P55     }    /* end cycle */ ; p& \3 Z3 `& o
56     out[0] = ntoh(y);
: Z. j1 f8 [3 r" ?, X& [2 U57     out[1] = ntoh(z);
0 P4 e; ?( x0 Z- K9 Z! a% S( Q58 } ( C  n) z  w: Q4 e
59  , s" v7 |( [. O# h' a
60 void TEA::decrypt(const ulong *in, ulong *out) { ' x) ]$ I" t" x8 U3 u' w  n
61  
* L" \: a5 V. G' g3 A& D# J! h62     ulong *k = (ulong*)_key; . _- C& `  `& z4 a: n
63     register ulong y = ntoh(in[0]);
. t6 |! C6 o' Z' s5 U! p64     register ulong z = ntoh(in[1]); . X, L" c7 Z5 f( P
65     register ulong a = ntoh(k[0]); : j: `. e8 @/ P, U' |3 w
66     register ulong b = ntoh(k[1]); % y  m, U" K" I$ g0 W
67     register ulong c = ntoh(k[2]); , B) a2 w0 K  a+ N
68     register ulong d = ntoh(k[3]);
$ C2 i( S/ ~& U2 r. Z69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
% v- v' d1 T8 h3 y0 a70     register int round = _round;
1 q1 {! R7 e9 |* ?; S: ]71     register ulong sum = 0; $ o* c( m: H' r0 o
72  
( a- P- p% ^8 p: }1 j3 n: Y73     if (round == 32)
/ a  B2 S; e0 G7 a74         sum = 0xC6EF3720; /* delta << 5*/
4 A- k* t- X2 a4 R6 r* O* N( X75     else if (round == 16)
$ z' Q& t& d! `, W" F5 T76         sum = 0xE3779B90; /* delta << 4*/ / e7 }! ?* I' Y0 l3 V8 E  D
77     else
7 K# ~  r$ ], _8 D3 g9 u3 ]78         sum = delta << static_cast<int>(logbase(2, round));
  n  V. F  c2 b79  # O+ u. j, v! g7 p4 i2 U
80     while (round--) {    /* basic cycle start */ : h- ~( p* g8 M0 K  s
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
4 r4 `) H$ |# ?& `# N; G- S( F0 x82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 1 i# f! e( A- U+ _8 O( k7 K
83         sum -= delta;
8 @' T' D0 [/ s) d( Q! o; _84     }    /* end cycle */ 4 ?+ K1 }" R' u! g$ a
85     out[0] = ntoh(y); # r  E/ A. X( @8 ^& c& G7 [
86     out[1] = ntoh(z); ; b' X0 O3 S. B$ \7 H$ \
87 }3 p4 Q8 E/ f( Z" d8 [7 a# l

2 f! q. I1 W# G8 Y0 j2 j3 {/ d; W6 |需要说明的是TEA的构造函数:
8 h/ o4 C& W$ v) v1 @9 iTEA(const byte *key, int round = 32, bool isNetByte = false);
0 D6 t0 U' Q6 O1.key - 加密或解密用的128-bit(16byte)密钥。 6 O2 p' U1 O& T6 o; n' E" ~
2.round - 加密或解密的轮数,常用的有64,32,16。
7 G2 t) V7 h- ]2 ~, u3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
0 z( L8 H% _) A4 _! V6 Z0 L  E3 R+ Q# f6 d, h/ n6 D9 n+ q
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" # Z; W+ N& P& h; @, C
2 #include "util.h"
0 g/ K+ Q3 g$ T 3 #include <iostream>
7 q( \1 \0 o$ G9 y7 R: a 4  
. F( S  @( O3 W" m& y  O, [: z) { 5 using namespace std;
* N/ ~: _! y, h' z# A; J/ X. U 6  
; R, A5 I9 i1 A3 P) G4 R6 ~ 7 int main() { & g$ ~4 t$ D  \0 W2 ]% W! R
8  , t5 ^% D2 d8 P% G. {" U
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
) S! q5 C/ n! }' b; p10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); + t$ R1 w# A0 N
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; $ S7 q; p9 \0 F$ N
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
& k4 G( |6 ~& R9 U; U13  
0 i6 ^3 e% ^; T14     size_t size_in = hexStringToBytes(plainStr, plain); 9 N0 y- ^; a9 x- |( g- y
15     size_t size_key = hexStringToBytes(keyStr, key);
0 B5 \: b. K8 o( x6 z! E16  
7 t9 Q3 C. P% t9 r* O) q/ Y17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ' y% E* t5 s, V
18         return -1; 0 G/ L5 T- m+ C$ ^" k7 \& ?8 T& A
19  
1 M7 u8 ~! \+ A20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 5 l) R* P; l; D! x$ L" E
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
" J+ N) ]& X# d* [: H5 K. |" z22  7 |1 P5 V* p1 O( V
23     TEA tea(key, 16, true);
- [) h: n0 m/ {1 d# E$ G" E  ]" K24     tea.encrypt(plain, crypt); + G' H1 c1 }! I7 z( x: d
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
0 O1 H6 p  J8 M26  2 k" F6 c. b! K# c3 A( X1 F
27     tea.decrypt(crypt, plain); % X+ O: |6 c! {2 F  j, K
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) n2 x, a  R( I) n2 w29     return 0;   A+ j# F' C0 H% L, t
30 }9 t9 A" u6 X0 m1 M% |

2 c  T4 I# O) Z- @: t  C7 [本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx% B9 P6 @) [2 s2 E$ P& l' F
运行结果: ' Z& S# E9 a4 ^. I+ C/ n
Plain: AD DE E2 DB B3 E2 DB B3
6 i, `+ @8 F3 q. ^* RKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
! A4 I5 n, _4 V; |# r, a( k3 ZCrypt: 3B 3B 4D 8C 24 3A FD F2
# o7 r" N8 k. L& YPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-24 16:41 , Processed in 0.022522 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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