找回密码
 注册
搜索
查看: 37891|回复: 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轮):$ q2 r% R; I2 K) S5 F4 d8 l* t
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
4 x+ v* b) }$ \2 {. H! VTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
  i7 u8 R/ g3 T; J" W/ c4 M之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
0 {) i( I0 \/ L0 s  ^, }在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - _6 N5 {4 U  ~. M+ S; @
在 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. ) T+ A' f) A4 M, r
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ! T* r4 ]0 T0 A$ b' b7 U5 M$ ^
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ : b1 L# X4 Q: `, U9 ?
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    / J4 c$ U$ c5 m5 S
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    5 S3 o+ ]8 E' W: N4 ?
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ' G( L1 B/ }8 c; y4 {/ x" L3 T
  7.          sum += delta;
    9 V8 v/ h* J0 }. A
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    9 s5 D7 `+ W, `: }1 F
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ' @: m# k8 k# ?8 V
  10.      } + Y+ t4 R" }; e" t% c5 F- ]( {! i' {
  11.      v[0]=y; : E0 [/ J3 z; D$ A) f. x/ B& S
  12.      v[1]=z;
    % F" B( q5 _& Y1 A, V
  13. } + `" t9 i8 g2 [7 ~5 E/ S, q+ }
  14.   
    ! ~: M# C7 A! y, k1 N2 n
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ( n  c! ^" E2 ]. Q
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    - }) \# w4 d- Z7 i: ~5 o
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    . O# Y( [+ m5 w0 H% C$ i
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 9 O  f5 M4 i' m, U1 X7 p
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    : ]; L# a4 I) X1 C1 ?
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 3 F& W! c! t* P" |8 |6 v% W" A
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    / y+ n3 C1 i2 E1 m, D0 ^1 e
  22.          sum -= delta;                                /* end cycle */
    ( ?% E( S+ u3 E9 ~
  23.      }
    2 K' e- W9 v3 l" o
  24.      v[0]=y;
    8 z: p7 T8 i7 I& D3 n2 L1 T& h
  25.      v[1]=z; 7 ?8 b' z6 R) Z
  26. }; D; @( A8 X$ {% A
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
. I# B- A( h3 F, q) J. @! F#define UTIL_H
6 R. z, V9 p9 H" i
) J% n3 Z% G0 o  u  g1 W#include <string> # b# I; ^: R6 |2 N. X2 y
#include <cmath>
# [1 V5 S4 H% \9 h, k" a; a% y#include <cstdlib> / G9 [6 \2 ~3 Q

% }; e0 ~- ^& c' `# [- p% g/ I5 rtypedef unsigned char byte; $ \: W- x& h$ l7 Z8 l  d
typedef unsigned long ulong;
3 [6 K' v! @" r7 ]* Q- w , ?4 j2 y9 R$ k  @
inline double logbase(double base, double x) {
, S$ p! B' k8 z0 r' _& U; s( {; [    return log(x)/log(base);
( e1 B) N& }; G, f}
" E& [  T6 B4 e6 `
8 p* I) O4 H2 P8 _8 O6 Z/*
. I% j2 R! q5 ?3 E; G+ `*convert int to hex char.
6 r, B* e! p6 |: a( X; ]*example:10 -> 'A',15 -> 'F'
! C/ b7 D1 V( |, m) z*/
. z; E  i2 \6 X" A; `7 ^$ r& x# qchar intToHexChar(int x);
& N5 S! [9 R" B  g- G : ]4 s3 X  L, R% y# _
/*
2 `; O% w& ?; I- V5 }1 ~*convert hex char to int. 3 B% O9 f4 z6 H) x( f7 L1 I
*example:'A' -> 10,'F' -> 15 3 T7 O! f! v0 L. R
*/ 6 ~& N! ~/ }5 l# h2 ~% t4 X
int hexCharToInt(char hex);
" [' J& n* D( R; ~; O! h' N* L7 j5 O" Q; S
  ]4 U3 k6 L' L/ |  wusing std::string;
6 {, h( X) R( k- [$ A; X! y/* . c# |6 H* e3 d! d+ g$ z0 r
*convert a byte array to hex string.   m* `( \  }  W6 _
*hex string format example:"AF B0 80 7D"
, o8 H9 e2 Z! M$ m*/
( b1 N& r" Q+ e7 ~/ ]string bytesToHexString(const byte *in, size_t size);
) y0 L, t0 b" _; _: O- S 0 O0 _8 V& ~8 h5 }( z* A1 a& W9 s
/*
, v4 G4 h0 N$ ~*convert a hex string to a byte array.
0 \5 F. x& ]' }6 h*hex string format example:"AF B0 80 7D"
2 a1 n$ c6 S# M; ]8 w; s4 o# N; K*/
1 `, U+ M+ y$ r% msize_t hexStringToBytes(const string &str, byte *out);
; u7 F) t  N% G0 u+ G0 r8 Y
$ d2 Y  @3 k7 b/ a" n: M( v1 ]#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 1 G0 M- s0 a! t7 K- ]$ R/ s3 @
#include <vector> 5 L- y% W; D8 h! Q% A0 y

# e7 N$ k- J/ {  e/ s8 Musing namespace std;
( W1 k% R$ X5 u3 M+ d
1 P& C! t" ~6 y% e  \' i# schar intToHexChar(int x) { 9 T$ M3 b1 C7 c% N
    static const char HEX[16] = {
/ m9 [+ m* ^. ]- F        '0', '1', '2', '3',
4 N1 N. S: l" U8 a$ o        '4', '5', '6', '7',
: F0 \7 g/ j% @3 k4 n1 W- Q        '8', '9', 'A', 'B',
8 s, Y( m* ]; y+ r( |4 t* c: A# i! q        'C', 'D', 'E', 'F' 4 r0 j" I- R8 v0 `; O
    };
  S- }, j# f! D2 b    return HEX[x]; - f- h/ {& u: A; X: ]  w! r5 f
}
5 z# n; L2 l  X5 n, D+ m5 S
5 Z* r. T% g0 m2 U5 C9 z) bint hexCharToInt(char hex) {   Y5 J; s3 z5 w# K4 L  X
    hex = toupper(hex); " j  W7 g. t  k
    if (isdigit(hex)) 1 ?1 M5 l" ~( V3 m1 B3 g
        return (hex - '0');
% h2 X! J. w6 }  ?/ g8 t    if (isalpha(hex))
6 U9 V- M/ x! L% Q        return (hex - 'A' + 10);
$ i3 k+ r7 A0 j' ^0 l! o6 w    return 0;
2 K3 O+ [0 c( h5 \" N8 r, B} + W0 e! J' u6 _; {

0 ^* M* n& Z' j7 O, [3 F" |string bytesToHexString(const byte *in, size_t size) { # o- ?$ v* b4 a* {2 W
    string str;
' O) M0 z, U7 I    for (size_t i = 0; i < size; ++i) {
! v7 T4 I9 Y! c& i        int t = in[i];
( S4 q7 ^, }% I3 L; ?* F- z        int a = t / 16; 9 T- R/ G4 ?2 n. e' ^3 `" i7 s
        int b = t % 16;
' X9 S# S; G4 a        str.append(1, intToHexChar(a));
" [- V) \7 l2 r+ f6 G$ a* o        str.append(1, intToHexChar(b));
4 Z1 F3 i; _$ E; c        if (i != size - 1)
! \( g3 Q9 D) t            str.append(1, ' ');
' w+ V# m5 A) a8 B! R- t# {    }
+ [6 H; `  q  P1 J) G+ _    return str;
- I$ N& ]! Y( [9 f5 K}
/ n8 V! q' v; D' h5 V9 v  n 4 x+ [' A6 N# f( U
size_t hexStringToBytes(const string &str, byte *out) {
& T4 a. W8 m+ f* m8 q. }0 _ ! e5 R, u1 v' n& w% o
    vector<string> vec;
7 P. ~  f1 w, K6 V/ {# m& r, y    string::size_type currPos = 0, prevPos = 0;
. U# a2 T' ^+ c9 |5 r    while ((currPos = str.find(' ', prevPos)) != string::npos) { ( _8 n& y( v- A! ^. q, y$ e; p' j) ~
        string b(str.substr(prevPos, currPos - prevPos));
  d+ r/ g+ c/ M8 H4 T' X0 `        vec.push_back(b);
# J0 C2 R3 C2 E0 }& O" i; `        prevPos = currPos + 1; ) n; J+ t) y7 x5 e" P# k
    }   b" I# d1 T( z1 a; n2 [
    if (prevPos < str.size()) { " C% r- i& g. l- E6 M: @4 I
        string b(str.substr(prevPos)); ; J0 p; u: d3 ]  s0 j  l
        vec.push_back(b); * Z1 ^% M5 R0 X: Q5 H" ]
    } 0 n& f) c) M- N* ]
    typedef vector<string>::size_type sz_type; ) u7 D& M4 w* v
    sz_type size = vec.size(); / ?% w2 L% }2 I: V! J+ p4 y: S
    for (sz_type i = 0; i < size; ++i) {
, \8 @- N; t4 w. L" b5 Q        int a = hexCharToInt(vec[i][0]); 3 p! Z  G& ^) g; Q1 t: X
        int b = hexCharToInt(vec[i][1]); ' _2 u0 ^3 a+ Z. \6 X2 s1 e" s5 a
        out[i] = a * 16 + b;
$ r( B# m. i- [6 U% _& y    }
! p6 u4 ]9 `/ q9 q8 o    return size; ) y& I* N. m9 @5 ?0 B
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 3 x" R$ U& F, O: q" M
#define TEA_H
& \4 S& _3 q$ T% Z& \+ E$ @ 6 v( F" q2 M6 Z5 E5 |2 Q, n
/* 2 {& `7 {- i5 b; V& ]0 ^
*for htonl,htonl ; N- E" k3 e; {! g
*do remember link "ws2_32.lib"
' W& J8 e* x, Q: Y*/ + g5 |( L( b: r6 R
#include <winsock2.h>
$ r& [& e: N7 E. E5 w2 D8 J#include "util.h" * r2 h5 `) ^+ \7 T; E$ {$ C

8 M7 J5 K. y( e( t$ g9 o( d  Kclass TEA {
0 J3 y) |, x6 tpublic: / Y8 t0 _. t5 W# h4 _* B
    TEA(const byte *key, int round = 32, bool isNetByte = false);
4 E4 B6 u7 c: W$ H  Q, V1 l# g    TEA(const TEA &rhs);
5 q# D- d& L+ h" O$ P1 S    TEA& operator=(const TEA &rhs);
( s* Z' v5 L7 {4 ^+ z. E! Y    void encrypt(const byte *in, byte *out); - Q  y' g, r9 g
    void decrypt(const byte *in, byte *out); , J; ]" @; M- P( D% i" I
private:
& g0 q7 Q" F3 [8 T* B    void encrypt(const ulong *in, ulong *out);
0 s8 u" z, N( @+ y8 o    void decrypt(const ulong *in, ulong *out);
4 d' h* N. ~  |1 d$ O    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } / Q9 E2 E( q, P% {9 y
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
+ z+ J6 L* x, f4 b' Tprivate:
! K: T) f8 u& o* {" u2 X    int _round; //iteration round to encrypt or decrypt
0 f. s0 D) j( J) m* z2 e    bool _isNetByte; //whether input bytes come from network
  t- e% m' Z0 G2 ?3 F    byte _key[16]; //encrypt or decrypt key 1 o, W) c" K% D: o
}; ! K3 \# n' O# [3 o; p

: Y: H# F" `- K* U% k% v#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
& z/ H- C/ ~2 c( \3 y1 j 2 #include <cstring> //for memcpy,memset
; E  j3 d0 W7 U- C1 u& q) w$ | 3  
& u7 i5 H2 N7 \& G* e, e# W" c 4 using namespace std; 0 F4 m* n1 B  Q1 c2 W2 e% C
5  
7 x2 ~" @/ L) J, v) I  G, Y' E 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) - z, b% u+ L" I6 ^  u2 G7 Z6 r
7 :_round(round) 5 z& i# V- Q+ n. ?/ Q
8 ,_isNetByte(isNetByte) {
; `' q) X: `( z# d; L 9     if (key != 0) 5 I- `: S; q2 W0 n) o' f$ H! b
10         memcpy(_key, key, 16);
, e4 j0 u  H! m3 [6 z9 U11     else
2 ^" |' r$ L" e4 t9 A- l12         memset(_key, 0, 16);
  X4 z2 K, F. x3 Z) H6 M4 i7 h& T% S13 } " s" V  C' d8 u
14  
0 p; a' o1 Q& ?2 R" W/ O15 TEA::TEA(const TEA &rhs) 4 @5 T6 Y& |; L' ?
16 :_round(rhs._round)
3 Z% a/ z. u) }& K" l# n3 U17 ,_isNetByte(rhs._isNetByte) {   D% v/ @" O. z6 W
18     memcpy(_key, rhs._key, 16);
8 N4 W, \. u" \, R1 u5 G$ i& h19 }
0 E9 n! x8 @. z& j2 v20  
& O- d6 ^1 c+ X/ o6 K21 TEA& TEA::operator=(const TEA &rhs) {
& i2 W6 z" N4 j( f1 u22     if (&rhs != this) {
5 u& |; J' W6 _0 v4 y23         _round = rhs._round;
7 t( n$ p; r  \7 Z4 B24         _isNetByte = rhs._isNetByte; ' Y3 U" O; L1 Z2 b. A$ |  S
25         memcpy(_key, rhs._key, 16); " j9 f; p# j8 X; q
26     }
1 b  W; \8 ~  f0 t1 J8 i6 H8 f7 C27     return *this;
3 w, ^+ f) D+ A+ x6 E8 ^8 V28 } 6 M: a" w" m. ^: W; \8 D
29  
. Y: i% @/ f) C2 \) @7 x: \30 void TEA::encrypt(const byte *in, byte *out) {
% M  b% _4 m5 _, ~: n2 A31     encrypt((const ulong*)in, (ulong*)out);
6 t  m& _* W* a3 |6 [8 z& N7 U32 }
+ a: @$ n8 x2 O! T# V33  
( i. {4 o( a2 S" r; w2 P4 h4 y6 a34 void TEA::decrypt(const byte *in, byte *out) {
  B0 F" k0 P( m35     decrypt((const ulong*)in, (ulong*)out); $ ~- o0 I: e7 T8 \. `
36 } 8 J7 ?, b/ S$ N- D4 ~+ d
37  
2 A/ \" P$ p6 C38 void TEA::encrypt(const ulong *in, ulong *out) { 9 g! m4 |6 P( W7 f9 b6 m" J
39    x% ~9 ^- x. J7 ?* n
40     ulong *k = (ulong*)_key; ( R3 U: `- m* Q% L& f9 Z
41     register ulong y = ntoh(in[0]);
4 g% e5 J( A( H" J2 g* k42     register ulong z = ntoh(in[1]);
1 n! z- T! G% O; w, t& @5 v( ^43     register ulong a = ntoh(k[0]);
2 I; B1 q2 D/ z, y$ G3 M) O+ H44     register ulong b = ntoh(k[1]);
& \; b( Y( x3 G! v# `3 K7 b0 ^45     register ulong c = ntoh(k[2]);
  M/ s5 m$ P$ D46     register ulong d = ntoh(k[3]);
/ A2 T' V$ Z+ Q47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 1 m* z' O* Y: x" ]! A' i' i
48     register int round = _round; : g/ C2 p2 N# ?$ d
49     register ulong sum = 0;
2 k, u( r8 V& j7 x7 Q$ e8 `50  
1 T1 Q+ P2 H' G9 S; l6 w: `0 f. I# U51     while (round--) {    /* basic cycle start */
* O- v: q6 E9 z$ @9 c! _52         sum += delta; 0 a0 M* e0 Y* j7 f2 L
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); % b5 z% Z/ Z! m2 S: W+ j9 ~1 o& ]8 ]
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 0 g! Y$ V9 Q  M1 L4 h1 {
55     }    /* end cycle */
2 d$ K; R) q" h! T8 r56     out[0] = ntoh(y); % G0 c5 i) [1 H3 {) S$ Q
57     out[1] = ntoh(z);
3 P- ]* P3 i+ h% Z/ s& p1 V! f3 Q58 }
1 j% o  H$ w) `" [59  
/ A5 z; H$ F7 i$ E" R60 void TEA::decrypt(const ulong *in, ulong *out) {
7 _( x2 T2 f0 }# a1 R$ [" v' [61  
9 i6 @; H6 [) ?* Q* K, ?62     ulong *k = (ulong*)_key; 1 t$ a2 {0 B8 `' u, l
63     register ulong y = ntoh(in[0]);
; d6 G0 B5 v9 Q) J64     register ulong z = ntoh(in[1]); ' E' B: g) b, ?( o* ]
65     register ulong a = ntoh(k[0]); ) ?% [6 L, U1 z* E3 E
66     register ulong b = ntoh(k[1]); 3 D8 l7 m' A3 y+ p) B" ^
67     register ulong c = ntoh(k[2]);
# @- D9 L$ V  H( s$ l( p5 r3 l68     register ulong d = ntoh(k[3]);
0 T$ `% w2 Q; w! ^5 u( U+ \6 F  Y3 r69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
( I! i, O5 W8 ?: C7 r70     register int round = _round; , Z" y  C9 e% p8 J, d" F# T* J2 r7 m
71     register ulong sum = 0;
6 I1 j: Q8 Y0 v+ a7 }72  
5 \* @7 X% l1 k) _' N: b. o73     if (round == 32)
& y0 x5 e4 Z' p( a) v74         sum = 0xC6EF3720; /* delta << 5*/
& n+ X8 V$ j8 Q; b$ E75     else if (round == 16)
5 `0 F+ X5 X) W- P5 Z3 b& j( F76         sum = 0xE3779B90; /* delta << 4*/ ' e: k+ ]1 K1 n' }3 K
77     else
5 |4 n# Y0 f8 J0 `5 h+ Y: d6 l78         sum = delta << static_cast<int>(logbase(2, round)); ' t7 s2 f) [' Z7 t3 J/ {
79  
4 q1 J3 N9 \8 s% ?5 i. b80     while (round--) {    /* basic cycle start */ + ^# M/ ^' G  p" C* V
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); . D  x0 z5 {) L5 H# R
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); % u  A' P. Z/ Z# B4 w5 l
83         sum -= delta;
- V8 S( ^  d+ d. s84     }    /* end cycle */
1 v( ?3 N  R% m85     out[0] = ntoh(y);
( ^9 y1 ?8 v2 B; n$ Z; h) X86     out[1] = ntoh(z); 8 ^1 A0 S% [* G- j
87 }, ]" E3 \; a2 D# F8 ]5 L

- w( Q+ E! H6 s. V" R/ i; T" p需要说明的是TEA的构造函数: : ?- U" k% ^  A6 J7 W9 F5 C) K
TEA(const byte *key, int round = 32, bool isNetByte = false);
/ n) m7 W/ r$ @; e1.key - 加密或解密用的128-bit(16byte)密钥。 4 T5 E8 r  k" k3 k0 `/ _
2.round - 加密或解密的轮数,常用的有64,32,16。 2 X: r6 P  o- r' m/ e' Q0 `! ~
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
/ Y5 B1 S1 w% x+ V/ G" u
2 j  g- x9 e+ q+ O1 {最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 9 F7 W2 G$ z7 w, k* F
2 #include "util.h"
: v& r" x6 d4 s9 w( H% ~. Q 3 #include <iostream>
5 d! f1 Z; t1 d7 C+ \: y/ { 4  
* {) i7 u% \5 T6 n4 i4 D: u 5 using namespace std; ! n4 _+ o5 U" a3 Q8 J
6  % _: X9 K# r: [0 A" ?
7 int main() { 1 Y: Z; ?+ a# l
8  . H; p2 a' v. w# q% Y( y2 |: [
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ' y( |+ ~. y9 Y% J- O, k
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 3 r: H( H/ i5 a/ m) t
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
( `6 @! \+ P5 j: M4 o, P12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
" }' u: L, e/ o13  4 I/ m, G* w7 {0 {( E- e! N9 s9 E
14     size_t size_in = hexStringToBytes(plainStr, plain); ! V& w4 {) T* F$ y, @" I% ]
15     size_t size_key = hexStringToBytes(keyStr, key); 1 e+ I. C# `( i) s& z% v" J
16  # z8 t3 g) e: q2 g7 j& ~8 i/ h& Y
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
" S& y' Y. Y0 X' W% ], J18         return -1;
3 T( C: _5 r0 w+ Q" X19  
' T- Z8 g( c  h( u4 S20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; ( f; x7 |9 n# T! @9 K
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 2 G4 V  p, C) l, r* n! b
22  3 e  ^. k  c8 w" l
23     TEA tea(key, 16, true);
; G: Z! M% b! g( W. d( ^24     tea.encrypt(plain, crypt);   T- F7 Z; W! `% n/ g
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
( i* e& b- J* ]* x( a26  ; w) i& I' Q  n. Y
27     tea.decrypt(crypt, plain);
3 k4 N9 ?) q% }- g5 c! J2 \4 U6 G28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
. K, z$ ^. X1 U' [  e5 x4 T4 Q29     return 0;
6 S% [( d. A7 Z. H) {( b# i30 }
+ `) X/ J* L; C- v0 m
3 I" `( s( W% h) m6 a4 k. a8 g* e本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
' L& \/ P7 j+ ?& N8 h! Q+ F2 `运行结果:
: ^8 Z& o! \9 `2 n+ uPlain: AD DE E2 DB B3 E2 DB B3
" x9 n3 w+ }  s' o1 ZKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
1 g- R4 [+ U; a& Y! _6 |. YCrypt: 3B 3B 4D 8C 24 3A FD F2
8 Y: K" w& n" C, YPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-6 17:41 , Processed in 0.022355 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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