找回密码
 注册
搜索
查看: 37474|回复: 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轮):
: u5 E0 t; C; {! d微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
! i& ?, o: \' n" B6 i7 hTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 $ q0 y2 L: \3 L
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 8 A1 l# T' G" U5 m+ Y. o
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
- h6 x# p% p+ z2 D6 o1 o+ F  Y在 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. " m! D# @7 X2 @2 Z3 T- \2 `5 l: m& J
  2. void encrypt(unsigned long *v, unsigned long *k) { . z9 ]- n6 }- |. t" o
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 3 K# w8 O5 J9 w) N! j0 C7 s
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ) c/ u# y; b% m3 a6 J
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    9 h6 t/ {/ y" O6 F$ L- V
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ : A. _5 \6 u! N1 Q$ P' q6 g, P
  7.          sum += delta;
    6 D! R6 |2 c+ C0 M
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ' N3 s* n  e' u
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ / F$ c9 G5 d" ?9 N2 Z  v( {2 F
  10.      }
    + ^0 x- Q  k$ _% ], W4 V9 v- T
  11.      v[0]=y; 1 B8 f! F9 p$ X8 p& u
  12.      v[1]=z;
    7 O8 Q$ L. T; n2 I
  13. } 3 g7 T3 `9 s7 h" V7 _, n7 \9 I
  14.   
    - M% E+ A- r# a" ]
  15. void decrypt(unsigned long *v, unsigned long *k) { 9 c( R8 I- Y! f, b2 x9 G
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    + y' I& Z; b0 ]8 X4 ]
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 8 H$ d$ ^0 l# q3 ~% a8 \4 S
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 9 S% m8 a$ ?) ~( Y' `6 X  P( [; ]
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ) [. U# V: I0 `( Z) P7 X
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ' a9 g: t, q6 l" p$ @% |7 C
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ! E) Z& p( l, M9 ^( p" S) y7 Z
  22.          sum -= delta;                                /* end cycle */
      C% P4 t4 d" g8 z$ ~% q5 F! x2 |
  23.      }
    * ]" `5 V5 O! m9 ]
  24.      v[0]=y; - F' c9 r+ S8 f/ C5 v7 }* b& B
  25.      v[1]=z;
    8 c; M; m2 }5 U( S* n' H
  26. }
    2 S+ @) ~) `# N% B! c
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ) d+ r6 J5 E' F" M0 h# h
#define UTIL_H
6 P8 v: b  `% M3 z0 l
3 ?7 [! i" z# Q7 {#include <string>
1 P6 _% s& Y) }#include <cmath>
0 w$ d$ D" C, t/ x  h8 \+ {#include <cstdlib> / Y; @; n8 C5 W, s* `

5 R; i0 l* o& u  s6 P$ C( r" {typedef unsigned char byte;
  p- i+ J. `3 i2 W9 w$ p$ }, xtypedef unsigned long ulong;
5 _( l2 o. B# k0 D9 J 2 ~8 ?: t% U2 a2 r! ], x
inline double logbase(double base, double x) {
$ m4 F/ Q5 ^/ Q3 Y: `7 a$ X# D    return log(x)/log(base); 6 i+ ^7 w1 M9 @) M9 j7 E" G- n
}
+ t# f8 d, S* q5 a+ Z
& H( C" L4 n+ y" J( L8 L/* & y" x2 A9 I0 Y) K- U
*convert int to hex char.
5 F: h* t7 s4 J6 b  t*example:10 -> 'A',15 -> 'F' " o; z$ V) N5 I! w; c: T5 e
*/ , o. k5 F9 e" }: y( S+ C
char intToHexChar(int x); 9 S1 A% \) i# X1 q0 @0 y* J6 b
0 L$ i' c+ a" S1 z' D
/* : i: j5 J- x) N  s2 P. F
*convert hex char to int. ; c# y, K+ ]6 s  U8 X
*example:'A' -> 10,'F' -> 15   k! U* J- H: e9 o1 C& B8 U
*/
& C" G/ O" K$ T" N! N. B2 |) O2 Dint hexCharToInt(char hex); / t- z! ~- t$ u6 D* M$ K  w8 i+ A8 _( t

9 j2 _- k3 D: P& m1 [( lusing std::string; 2 P* P% g6 v7 ?; j: f/ `  i
/*
8 Y; r# M/ Z$ y. B5 E*convert a byte array to hex string. . G5 [7 m% K1 Q, a4 e/ V3 v3 q, X
*hex string format example:"AF B0 80 7D"
; I2 R8 d$ y' Z% y: c*/
* x  b$ w7 u2 s0 N, @9 v, Nstring bytesToHexString(const byte *in, size_t size);
3 @( ]0 D5 h3 z: H8 V
6 Q% }8 C9 w4 x" I& U5 v/* 9 s- @  z3 _* {
*convert a hex string to a byte array.
% e! L) ]* e% V5 t, C*hex string format example:"AF B0 80 7D"
9 q) N- y! {$ p) s; ~# r4 d*/
1 s3 V7 T5 w2 I  q0 B" tsize_t hexStringToBytes(const string &str, byte *out); ) H( B( V, O+ R) T& c' n
! F9 v3 ~2 h# e3 d3 X# b$ D
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" + d  S' S- X& O/ R6 {& W, j' B
#include <vector> / v/ l- t. l( P4 a8 E

) q4 w  Y, G, @2 ]) y- d) Ousing namespace std;
6 m* H4 x% j1 |% \ 0 X6 E" Z3 Q/ ^9 w
char intToHexChar(int x) {
& u; n4 y8 T! c9 K' K9 A    static const char HEX[16] = { . A) e: M% u  L
        '0', '1', '2', '3', $ v' v# L& M$ E* S& q& |8 |# c
        '4', '5', '6', '7', # Z( V1 }0 S, l, B  \2 b
        '8', '9', 'A', 'B', 6 u7 i2 |& q& ~# `
        'C', 'D', 'E', 'F'   v. @! o* z; s  L
    };
: A% h4 Y+ Y& @* i6 R4 r, Y    return HEX[x];
) p6 B; G& C- d0 [  C' X8 d}
/ \  F) i; T0 d' |" e! c
" o% l  f* h0 t. n  t/ zint hexCharToInt(char hex) {
$ \' j( m4 l! ]/ L* Z    hex = toupper(hex); 9 F+ U3 c! K+ q( r- ]1 N$ K
    if (isdigit(hex))
/ ?5 e4 d8 m, q# N3 Z6 X0 b' r        return (hex - '0'); % p# a% U! H% q$ n$ c$ [& E
    if (isalpha(hex))
, t9 }7 A+ u- I; F% Q6 ~1 X        return (hex - 'A' + 10);
* M" W7 k6 v9 U$ i/ _    return 0; . ~1 t  v6 L6 i% e
}
( G9 [+ X) [, h9 l4 N $ T8 v- A; L- a+ {
string bytesToHexString(const byte *in, size_t size) {   K# k6 H0 p* b* {1 ~2 A- @
    string str;
& }1 Z; `# J! _% s" ]    for (size_t i = 0; i < size; ++i) {
7 \/ n2 e7 k9 T; F9 Y        int t = in[i]; 9 @+ ~# I) x3 j/ r( ?; }7 U8 y
        int a = t / 16; $ Z* n4 ~7 W* _* E% ]
        int b = t % 16; 4 H. [2 O7 }' w8 |& p5 K
        str.append(1, intToHexChar(a));
! n9 |$ `# z: y" |$ B8 z2 ]        str.append(1, intToHexChar(b));
6 q% G7 @5 x) D) i6 i0 a; e        if (i != size - 1) 6 X! y* k1 P- G# X' {
            str.append(1, ' ');
4 e% d* Y* @) b1 H- X    }
" Q3 ~6 r' v/ W: h% e) F9 H    return str;
- K+ R6 X6 t* L( W& Z, c}
) p6 I! N- Y1 A- u! {8 p2 r3 j( K) P ' Q' R7 u8 E) G7 F( d+ i7 E
size_t hexStringToBytes(const string &str, byte *out) { 3 r6 ~! k3 W7 w

& G, h2 }" y2 J* E( Z% u0 D    vector<string> vec; , T, {' r# w5 b9 C5 k5 E5 `
    string::size_type currPos = 0, prevPos = 0; 2 @) Q' V5 j+ d' [+ r3 y) W
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 3 v2 C" v$ r: q" F: Q6 \* b
        string b(str.substr(prevPos, currPos - prevPos));
3 b5 d' u( y: r! W7 K! d9 N        vec.push_back(b);
" u: J7 ^, R  f8 I1 O: u        prevPos = currPos + 1; " _4 o6 f# `8 m4 A3 ]
    }
5 G! Y, K$ j% N* O6 t5 _    if (prevPos < str.size()) {
0 X7 v/ X/ B+ l. e" @: F4 w4 u0 y        string b(str.substr(prevPos));
# k( z  \' f& r7 p% x        vec.push_back(b);
4 L0 J0 L2 o+ k2 J    } + \# q. ~; U* c9 y
    typedef vector<string>::size_type sz_type; ! f' i! k* Q" \# x$ ?* W9 k: v
    sz_type size = vec.size(); , T1 `# W7 P" o5 s) H8 @& y
    for (sz_type i = 0; i < size; ++i) {
. f9 w% O1 P! c        int a = hexCharToInt(vec[i][0]);
; b7 y+ Z: }8 J4 k        int b = hexCharToInt(vec[i][1]);
8 Z0 B( U0 ?1 k) v        out[i] = a * 16 + b; 9 \: Q* A: s8 G1 C1 u9 a
    }
& h, d, g' Y* G6 a1 R    return size;
5 A8 m3 D. v/ K% e; V  a3 q8 }}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H - z/ L8 m( D3 E% Y
#define TEA_H
2 P* x! @# y4 |5 `4 d+ B, c5 L
' p2 z8 w; @  s+ F, ~2 D1 Q/*
$ Q* N& {8 l0 b*for htonl,htonl " H; k6 J0 }% C; t& a2 Q4 v
*do remember link "ws2_32.lib"
$ H7 k! k& ~0 W# X*/
) O  q# J) e+ H* @* [( n( I#include <winsock2.h>
! l0 G& w" h( y0 m1 q% H4 b#include "util.h"
; B& j! e1 D. t" g: q , c! e: s/ o( S
class TEA {
$ |$ s# {" a1 x+ o  J: Z; }public:
; i9 m) x, r# ]    TEA(const byte *key, int round = 32, bool isNetByte = false); 3 O# q% A& H' H& `9 B4 q% W6 r4 b
    TEA(const TEA &rhs); : l: B/ e$ F5 u# q  d3 @, b
    TEA& operator=(const TEA &rhs);
- S2 Z. f# U7 I) A% q+ L# y    void encrypt(const byte *in, byte *out);
' d+ ~) \0 d' n( h, f8 M    void decrypt(const byte *in, byte *out); / s( _" A& N$ i9 M  R3 N; k
private:
/ `* c* }4 e" ^, y    void encrypt(const ulong *in, ulong *out); . c0 W6 B: f2 o, s
    void decrypt(const ulong *in, ulong *out);
: L& X# V9 v6 l- I/ {+ l    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
/ j5 Z% U+ E9 f; K    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } / \3 C/ l# w- ]5 |* I
private:
. Z9 n  g1 C+ z0 T7 x& F1 ?  V    int _round; //iteration round to encrypt or decrypt
1 v) m5 Z! r) T; _    bool _isNetByte; //whether input bytes come from network ( z' c7 ?3 v7 Z5 j- H  _
    byte _key[16]; //encrypt or decrypt key ; t" N6 {1 Z5 |
};
( n+ G8 \! ?) {7 a; U
% T7 |  x1 w. w3 h$ |" N# f#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" + u6 ^9 m' k* ^8 k# g) H1 j. S6 I
2 #include <cstring> //for memcpy,memset
' C& C& l' e0 w' a9 R1 ] 3  
# p9 f( U- t6 I: B, v/ Q 4 using namespace std; 4 _7 g, R0 k1 `0 r8 `
5  
6 s" w6 ]/ Q9 o6 I 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
4 `: N7 u& |" O. A( R% a 7 :_round(round)
. c. g1 K( F2 W- x+ Z$ \  V 8 ,_isNetByte(isNetByte) { % t( x$ Y# f# A# r; s1 E
9     if (key != 0)
& o5 B/ ?& D7 Y3 v/ D8 u& [10         memcpy(_key, key, 16);
2 v- U: X/ o/ w3 q+ n11     else
& Y4 v' v6 U; ^* X) c12         memset(_key, 0, 16);
5 n/ I$ _6 a5 `# [6 R. G* ^13 }
$ R& _& T4 @* U14  
7 Q* ^2 l8 U6 I8 B5 ^- [3 g. E15 TEA::TEA(const TEA &rhs) ( l, I& H' ?  Z8 h! _4 _4 M6 U6 B
16 :_round(rhs._round) ( K" b! c! C% p8 y: `/ G7 k- t
17 ,_isNetByte(rhs._isNetByte) { 9 n! F& V, v- A6 N. K  u
18     memcpy(_key, rhs._key, 16);
6 P4 |- n  S3 {* m  j7 x/ |, b19 }
" ?2 k% G" d. {6 S; Z/ ]20  
$ X" u  A; e8 V3 E) z21 TEA& TEA::operator=(const TEA &rhs) {
( _3 z" w1 [0 @22     if (&rhs != this) {
% o0 f5 g' ^. b7 M- k23         _round = rhs._round;
3 @: x# G' |0 Q; K4 M24         _isNetByte = rhs._isNetByte; . y& \0 C* f- Q+ [+ R% T
25         memcpy(_key, rhs._key, 16);
0 W  F' l" |( B# D+ F" D. T26     } 0 m3 q2 `3 C& S' e6 R
27     return *this;
% L: l0 V: J  e( [' Y5 U$ K8 g28 } 6 [0 A9 R, f' ~" A# ~7 z* p2 j
29  
0 i; ^9 {2 H, x30 void TEA::encrypt(const byte *in, byte *out) {
& l$ b: q2 }5 I) h8 B+ b2 O31     encrypt((const ulong*)in, (ulong*)out); & l7 T- [$ c* w
32 } 5 C' H! k! p" b) c- h
33  
# f+ T& @5 A0 b34 void TEA::decrypt(const byte *in, byte *out) { & H1 s) ?  ]# M$ Z% ^
35     decrypt((const ulong*)in, (ulong*)out);
/ [" N+ R9 t2 M36 }
2 Z+ z/ {' u  R37  ! |" P4 O& G* v# t/ V1 \
38 void TEA::encrypt(const ulong *in, ulong *out) {
, b2 w- ^4 R2 C. ?: V. H39  ) h3 C7 k2 f/ H- F: N! N6 [
40     ulong *k = (ulong*)_key;
. ^0 J6 f) a$ Z$ o  B+ e41     register ulong y = ntoh(in[0]); 7 Q( y6 x+ p7 S" J4 l0 `$ K
42     register ulong z = ntoh(in[1]);
% ^- _7 ~& n* B43     register ulong a = ntoh(k[0]); 6 _% {( A0 C1 c" ?
44     register ulong b = ntoh(k[1]); 0 w% e8 _: @4 k. x
45     register ulong c = ntoh(k[2]);
. ~, q$ V; q5 X46     register ulong d = ntoh(k[3]); . S9 T/ J- w' f% X  O
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
9 ^5 _; a1 O( [: T! R! X" A48     register int round = _round;
$ Y5 p9 s" z; F" x: X49     register ulong sum = 0;
- F0 h, m: ]# j4 D, q50  * d) w7 O  I4 b$ l3 Q& {! a5 n% h
51     while (round--) {    /* basic cycle start */
9 Q+ p/ q  h7 s" W52         sum += delta;
' C6 t( f! G3 q4 Q53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
2 @8 V8 A/ p' x* N. A+ S1 x  c54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 6 \" d; j, o( g) C; }# J
55     }    /* end cycle */
1 N  n  W& l3 S4 S) p0 D56     out[0] = ntoh(y); ' a- }0 ]5 V2 n! y
57     out[1] = ntoh(z);
) a6 ^: q; h- |. T58 }
4 e5 z, x( Q* [2 i7 R59  
% [; P  @1 J4 |% M- ]60 void TEA::decrypt(const ulong *in, ulong *out) {
+ T" |3 B( k! l5 E1 W61  - c* Q8 z; W9 Z) }- u: Y) v2 F8 F
62     ulong *k = (ulong*)_key; 1 e4 H/ E; t( a" q3 |
63     register ulong y = ntoh(in[0]); 7 Q) E4 c+ E% [5 N' C$ F2 f/ Y$ A
64     register ulong z = ntoh(in[1]);
% w5 ?" n& S: T" q65     register ulong a = ntoh(k[0]); 1 G$ m) b: G/ i# h+ O6 y
66     register ulong b = ntoh(k[1]);
+ I" r4 \' z! L8 {1 d% D, g5 I67     register ulong c = ntoh(k[2]);
! \0 P; O& w9 C$ g+ z68     register ulong d = ntoh(k[3]);
5 u# ~4 w4 @3 W" e5 A/ D69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 3 J0 H6 j2 a% W+ `
70     register int round = _round;
; d0 u+ P0 v4 z. h71     register ulong sum = 0;   ^5 X$ M) \% }! _! ^
72  ! E& g7 C7 x: N+ T1 ~& w; [$ j
73     if (round == 32)
7 R) k9 J7 c+ l  d; @+ D6 v, i& x5 c74         sum = 0xC6EF3720; /* delta << 5*/ ) o% b! p3 w; m4 ?3 w0 [
75     else if (round == 16) ' t5 X9 o' O3 [; G3 f. q! h
76         sum = 0xE3779B90; /* delta << 4*/ 4 `* o  W7 e: r. ]- `0 S: L3 g
77     else 4 ?1 ^7 J& y+ ?1 Z
78         sum = delta << static_cast<int>(logbase(2, round)); 9 v6 [0 ?# u9 k
79  2 j) i. C" _4 ~+ [: L
80     while (round--) {    /* basic cycle start */
$ X3 b' D7 E0 r# M; r9 l  `81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
& I/ n+ K9 T' ^$ w2 Q: ~) p+ x82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
/ [8 U* j% g0 H; v7 C- E  ~$ ^2 L83         sum -= delta;
# w+ E6 y6 Y4 I7 N84     }    /* end cycle */
9 k" R  C8 I0 E% j" u* U3 m5 A85     out[0] = ntoh(y); & p8 q$ t$ p0 G7 W" e
86     out[1] = ntoh(z);
* n! S5 }2 c" C& z/ F87 }
/ i* z, _0 N1 i' r4 D
! G/ H8 M2 [5 D% q5 U需要说明的是TEA的构造函数:
3 W! y5 B! g% j, r$ L5 M' DTEA(const byte *key, int round = 32, bool isNetByte = false);
" C+ P4 u* p# R( N2 Y8 K+ a1.key - 加密或解密用的128-bit(16byte)密钥。 3 i' j: `) K' p* t
2.round - 加密或解密的轮数,常用的有64,32,16。
. f6 e( {" p! a! A6 b! h3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
. ]( |  W* s: j) D2 s: z& }! l+ x& ^8 }& ?- J
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
9 b% i" |. g) J) D; _1 x 2 #include "util.h"
, F% g  X4 ]/ j  E3 S$ M 3 #include <iostream>
4 W4 ]+ o+ C4 ]$ y7 g" A 4  0 S% b7 {, G2 X$ a* O
5 using namespace std;
. r2 l9 ~+ G" J- f3 y# s 6  " o) A6 @% m- }5 o" x, V8 o$ X
7 int main() {
* z7 K9 Y  R1 l" @; z) a 8  ) v& `0 G# n  y- f6 o9 Y' e# J+ K/ A
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
" K1 s& f8 _% Q  D  J10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); % e4 \7 N/ M4 r$ X3 }$ |7 w
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
. Y8 v9 U% V) g$ A12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; % d$ M+ b7 P+ L1 o- T) Y" n+ H
13  $ ~+ g8 A  Z5 C7 v0 x
14     size_t size_in = hexStringToBytes(plainStr, plain); ' h+ I3 H2 G, X1 e& X; N
15     size_t size_key = hexStringToBytes(keyStr, key); . r' G& ?' Q2 @5 a
16  
& E- m: {* }- K, ~9 h17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
/ A. ~; B" _3 F+ \; U7 x2 ~18         return -1; # a' R# q3 Q. D6 N7 _
19  
. Y$ y) M- L5 i20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; % r. v( b' |! m5 J# }: d1 @
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
5 {' c! ^  |0 G4 |22  5 d$ _2 [9 U: X1 F
23     TEA tea(key, 16, true); ) N% v$ J1 E" G$ K* D- g
24     tea.encrypt(plain, crypt); 3 L5 G2 i$ @) F2 A7 r2 [. h7 J
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
3 ^7 x! k+ T4 Z  c26  
; r$ w$ _5 g" z+ K" q27     tea.decrypt(crypt, plain); 9 O9 l" T7 R7 V3 C2 M! R$ n
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) u2 ]3 U5 a' e" S  M8 y29     return 0;
" c; f$ ^8 k9 _  W+ e; j0 P  m30 }4 W+ P, f6 _5 q; }2 K* u; z+ ~
4 ~1 d: v! A1 P$ E; J
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx/ g. J6 }4 Y, G6 Q: j) ]2 P) c" o
运行结果:
8 Y) l& J4 X9 v8 }Plain: AD DE E2 DB B3 E2 DB B3   Q3 }: z  i6 {" [. Q! {9 J
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 - P( x8 q; Q  T3 P% l
Crypt: 3B 3B 4D 8C 24 3A FD F2 0 Q/ o% j0 h& J) ~/ [* B
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 20:20 , Processed in 0.026715 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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