找回密码
 注册
搜索
查看: 37595|回复: 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轮):
( y4 p$ p& j3 o: r1 P* _微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
. D9 y) t" N# _( K$ |  gTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
  v' P" z& `. S6 `7 O! |之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ) a; _; t- ~% w0 n5 m/ z0 o" E3 T
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
% [" H5 W% K/ p在 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/ U3 V; U( l* j9 ]% H8 M( B  H& H
  2. void encrypt(unsigned long *v, unsigned long *k) {
    : B& c, [# I* b8 ?
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */   Y3 t4 _, r* ?- _5 ]8 D
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    : ^0 w. H4 X. d7 t
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ! I# [* N) \7 _- w+ P7 x9 |9 W
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    4 }- g4 ~. g# i9 `
  7.          sum += delta;
    5 e  B7 o( H% b+ F
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ; _' U5 r8 N6 z2 o3 B
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ - _9 y4 ?  D" K! O( a8 N7 R/ b% f
  10.      }
    ) l  ]; t! Z5 R
  11.      v[0]=y; 4 U2 Q3 |) H! L
  12.      v[1]=z; # V1 A1 s! |" S
  13. } ! Q3 v- E, G+ m8 \- Q! A! p: r
  14.   
    & T# Z1 x6 ^, r: e$ A" C3 j
  15. void decrypt(unsigned long *v, unsigned long *k) { " z+ A! T$ O5 g9 O" B; x+ r
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ! y/ V$ C7 c6 F; y! u9 E. O
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ( A) c* h/ J7 c5 y  Y7 f$ W
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ' `5 t: F6 h! s  x/ O0 C
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    : x9 v/ V9 j! J1 w6 J" j4 R. z% T
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 3 X3 s7 o& l+ t9 |
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 8 [5 o5 T6 b' z3 V; G9 c9 K
  22.          sum -= delta;                                /* end cycle */ ' p, H3 I5 C0 z, v) U; S
  23.      }
    8 E+ n+ h0 Q$ c; K+ @
  24.      v[0]=y; % g2 n! R3 k* w4 @8 q7 o$ K
  25.      v[1]=z;
    ! }. Y2 z5 {& w3 e* |! l9 Q
  26. }8 m1 p. O- w! E
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H & x9 N9 \# [' I1 Q1 j
#define UTIL_H ; A2 C6 t3 ?  |# q
" s% t% U  k  m% J% N2 T5 N
#include <string>
/ j0 ~  ?$ P) K/ X9 o4 N! ~: V#include <cmath> ( ^) Q# J4 K% R% Q3 x* U
#include <cstdlib>
: h) t9 @) J2 M1 Q' Y# l/ k6 N4 S$ r
# W) K: c  K$ h, X3 x5 Rtypedef unsigned char byte; ) E* d5 O! e' y$ Z
typedef unsigned long ulong;
( y' T% g* ]" K% I+ h6 K
7 f" }# [' L- w; W- winline double logbase(double base, double x) {
  k) C" Y) L5 j/ ^# y! M) C' A1 ~    return log(x)/log(base);
( d# g0 _# m2 B, c( a}
8 ]6 N1 {; ^6 m$ \# \% R
( {! S! M. e6 e6 T) J" Z/* " D4 O5 r+ Z8 ?0 ?5 R; U! k0 g  L
*convert int to hex char. " {, [( c" F$ c0 r
*example:10 -> 'A',15 -> 'F' 8 I* [% V$ R% K; |
*/
# i$ L) Q0 h# W1 Y6 S, ?char intToHexChar(int x);
& K# u/ z' L6 z7 i: A$ y$ `# y $ ?- |1 ]) @' [$ h1 X* E( V
/* & Y7 f5 w3 j: |- w
*convert hex char to int. , U! D$ [! b* A' T4 ^  P' `$ R! A9 T
*example:'A' -> 10,'F' -> 15 % {$ q7 O* S; ^/ c4 e
*/ 0 {( T, W+ E/ ?5 M$ Z
int hexCharToInt(char hex);
, O0 A! t: b+ f/ U3 L
" K9 O; c( T% ]3 F: @' Kusing std::string; + O+ u& K6 _  j- c6 m2 D
/*
, g' U5 i& K5 r6 T9 s& J, b/ ~  r8 I9 O*convert a byte array to hex string. 8 [4 ]2 D4 {/ ]/ W. i/ g7 C
*hex string format example:"AF B0 80 7D"
5 E; K. h, x- c% I6 T0 p  D*/ ' W' s( q: N4 ^- W8 ?( \4 A1 C8 J
string bytesToHexString(const byte *in, size_t size); 2 r0 G2 W9 ]. {9 k2 s1 n" A# ^" V

) z$ T4 {1 O  K1 J3 w" T/*
9 B" u2 T0 v4 Z7 U. a  `/ H*convert a hex string to a byte array. - O: y  b* o6 T' T9 F* {; @! q
*hex string format example:"AF B0 80 7D"
2 g! p4 z7 E6 [9 i% L*/ # X+ r& U. m# k+ g
size_t hexStringToBytes(const string &str, byte *out); 3 _  v+ w, E4 Q7 \: G
* E; b! p. t0 [; p( F* z3 j
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" & s6 T! j! @$ A5 T' Q$ M. i: `
#include <vector> 1 n$ m7 l9 e$ f0 j0 q% d

( ~7 U3 d5 e* S* k; b2 |using namespace std; : {5 L9 O& X% f
9 P$ @; Q" `- v( `* G  O
char intToHexChar(int x) { 2 s7 t! M2 k$ q0 }1 V
    static const char HEX[16] = {
4 J6 O- z4 p) q6 K        '0', '1', '2', '3', , |8 \& P4 }: l! h! G* u2 l- x# D
        '4', '5', '6', '7',
$ L8 d' P0 @6 q% v3 T# |$ V        '8', '9', 'A', 'B',
5 N* [( a5 g$ x% H( I0 p% F; }        'C', 'D', 'E', 'F' ' h( ]) {1 p2 ?1 O- i0 y& G. c
    };
( Q4 X) g  u* r9 k    return HEX[x]; 7 S1 T" C  L! a; e4 m* u. m' X: V' A7 ~
}
  J% Z; P! f, z3 l/ x 9 Z5 K2 Q$ |3 m& l* f  p
int hexCharToInt(char hex) { - V' k5 w( S; S% g
    hex = toupper(hex);
3 f' M0 c' r+ u3 i. y/ E& \    if (isdigit(hex)) ! e: v4 M% r5 u8 T% ?' }' R
        return (hex - '0');
% o8 m- G' q1 e8 t2 d    if (isalpha(hex)) $ K, I+ R# m* B$ c# S$ R/ [
        return (hex - 'A' + 10); 9 h( `1 @; N! ]5 e5 A/ O
    return 0;
; |" y. B1 Q3 l" ~}
6 ~5 I: B3 l) T " X! ^0 I$ b+ a6 v! ^6 u: r
string bytesToHexString(const byte *in, size_t size) { % a6 U: W/ }4 k
    string str; 4 h* H/ o; Q& }8 Z3 c
    for (size_t i = 0; i < size; ++i) {
5 C2 c' j( C7 d( R        int t = in[i]; , o! }" P1 g5 o. J; r3 n) o1 X1 A3 b
        int a = t / 16; : J8 L) p* ^0 {) p+ ~- E! j& c
        int b = t % 16;
' r# u. T' x; s9 R        str.append(1, intToHexChar(a));
& I! S5 P$ h8 `" u0 }6 X0 C, [& Z        str.append(1, intToHexChar(b));
. M$ K: C2 |5 `) p& f" H3 Y! ?8 ]        if (i != size - 1) $ o5 @# |: Y7 b
            str.append(1, ' '); ! r: T8 f/ a, m, W. x
    } : B$ Y: U8 R2 N% x
    return str; 8 U1 j/ |& p8 V' i" w6 J
} , F7 J8 i! M8 M2 d) G5 n. p# E( W# F

0 o. ^$ A: ?$ {2 J  jsize_t hexStringToBytes(const string &str, byte *out) {
$ n; ~' z% T) I! j; l1 R& q 8 P" U# v3 x( I" u8 ?0 X) b
    vector<string> vec;
/ C# ^. X, A  B/ P, D& u- Z    string::size_type currPos = 0, prevPos = 0;
/ b/ G* d2 L; C2 c3 ]! L9 G9 h    while ((currPos = str.find(' ', prevPos)) != string::npos) {
# t3 S: q1 G' y$ U7 V1 e        string b(str.substr(prevPos, currPos - prevPos)); $ u6 C) V. [( o2 u
        vec.push_back(b); # @) J' M. V' n* L4 P: G( e5 O
        prevPos = currPos + 1; , _8 m5 v! d# Y8 f3 d
    }
5 I, V& r: Q7 {2 M$ w* n( \    if (prevPos < str.size()) { 2 ~4 \9 x6 A  t
        string b(str.substr(prevPos));
. o! j* b0 D7 r/ ~0 B% h        vec.push_back(b);
; V' Q. r0 Y8 K0 T! n- v    } 8 L. I. A! ?8 R: f* Q+ N* s: u1 O
    typedef vector<string>::size_type sz_type; - B" U- [, ]5 x# T
    sz_type size = vec.size();
8 z7 U* m4 t1 a$ _    for (sz_type i = 0; i < size; ++i) {
: O3 ~0 x3 F. Y+ @5 a; v% {, Z: a        int a = hexCharToInt(vec[i][0]); 2 r6 n; R& X1 c# y1 w* k) r9 b0 o
        int b = hexCharToInt(vec[i][1]);
( x% E. N' H6 p/ k$ N        out[i] = a * 16 + b; ( u/ [5 r: R& ?1 R5 p% S9 k
    }
8 V. D8 @9 q* p4 [  H    return size;
: f- ?. e" @5 [3 c; N1 X}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H + g6 F- F6 T6 \- Q: L
#define TEA_H + X8 [$ q; j$ L5 o2 f4 y0 Q4 A
; ^* e4 r* @# E% N- t* [0 Q
/* + ]2 g8 f* |# J( ?5 l" a1 \( n( U. B7 w
*for htonl,htonl , X# t! C, X# T4 |4 W
*do remember link "ws2_32.lib" ' R- b+ U! J# k' u% E( w+ j* ~& }
*/ ( Z, N$ f1 O+ n3 l
#include <winsock2.h> 3 q( H, v2 D4 P+ \' N9 V) t
#include "util.h" ; K" E8 |" S' X
2 ^8 w* m# f+ t0 m9 k
class TEA { - @8 S( y4 Y) j. e" S
public: 4 S/ f0 _. X3 d- ~1 j1 w
    TEA(const byte *key, int round = 32, bool isNetByte = false);
, E! i1 x9 T0 \: \0 t8 g    TEA(const TEA &rhs);
+ l1 w/ Y6 R+ A- {, ?    TEA& operator=(const TEA &rhs);
1 ~6 z8 J% E2 I+ G( n, X    void encrypt(const byte *in, byte *out);
  C; u) s( r* T$ [    void decrypt(const byte *in, byte *out); : P; l/ `% \$ A3 a) e
private:
, T" j6 a2 Z1 |& N/ c    void encrypt(const ulong *in, ulong *out); - x' a- Q( C! P. x' T$ C
    void decrypt(const ulong *in, ulong *out); # L! N) E% d3 q, b, P' G; y
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } ' g+ E9 |' O6 l3 L& ?7 q! f+ r
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
2 h, i7 O% p0 U9 {0 y& D+ ]8 Wprivate: - W$ E3 t+ h- ]
    int _round; //iteration round to encrypt or decrypt
1 ]7 L' y5 `2 a    bool _isNetByte; //whether input bytes come from network
2 H8 |9 @& R, g2 ^    byte _key[16]; //encrypt or decrypt key
! k9 ?% w) W8 j' `0 B) t# T. M};
/ m0 a; Q- b2 J6 m+ B6 {* h
3 t6 z; T6 s* D#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
8 O' S2 b9 C9 H8 N6 m  D3 I6 d$ W 2 #include <cstring> //for memcpy,memset
, o- L# O" n2 M  g# x 3  
3 j  o! E, G  e 4 using namespace std;
- `9 U$ g  C+ F8 ` 5  8 p/ b/ M' w1 ^
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) , X% F/ `1 R1 T2 t) z8 Z7 k2 n
7 :_round(round)
" ?, h: C1 ^1 {- [) `& d 8 ,_isNetByte(isNetByte) {
' D4 W8 M, C+ ^7 Y* R- W% J) ~5 { 9     if (key != 0) ) ^) ]: N# s- s" D3 G3 V# m+ u
10         memcpy(_key, key, 16); % p! N9 z' V% K8 s# E. q( a
11     else
1 M6 x; S1 ~2 A8 Z2 S# q* I" ?12         memset(_key, 0, 16); 0 q, z9 `! R0 L1 F
13 } . w0 e- F& b) J1 V
14  & V- }" P2 R* i( K1 `/ j
15 TEA::TEA(const TEA &rhs)
4 ]9 v! E; d4 U; X16 :_round(rhs._round)
, @4 y! Z7 e; m2 G* q2 R17 ,_isNetByte(rhs._isNetByte) { ( t6 S1 l- c4 q, V3 z
18     memcpy(_key, rhs._key, 16);
$ X3 z% J: E$ W2 |/ ]2 P$ q3 M19 } 6 Z, g5 H! `  L$ F* i# ~# E; F6 {
20  
1 |9 _, `9 c- b6 _& p: b7 ~21 TEA& TEA::operator=(const TEA &rhs) {
: a4 G8 w/ B8 I* \  C+ z22     if (&rhs != this) { / ?# q8 g4 |6 M: s. R# m
23         _round = rhs._round; ) }( W+ t: G1 b4 d: G% }7 L
24         _isNetByte = rhs._isNetByte; # K# b, r7 U! b8 g/ I" x
25         memcpy(_key, rhs._key, 16); " \$ X0 L3 g+ u
26     }
" Y5 u. H$ L4 P# Z3 h27     return *this; 4 g/ u+ P" J% n9 N# |7 h4 |6 d
28 }
. U" n2 B/ j6 q29  
* {( U9 Q/ M2 H8 h6 B0 d30 void TEA::encrypt(const byte *in, byte *out) { * u" T- W3 Y; I; t' |4 `( S6 f
31     encrypt((const ulong*)in, (ulong*)out);   _3 X( e; P; P3 I" E
32 } 7 h' |0 G; r8 m3 J* y# l
33  ! ]( A0 y! z. p3 h) @
34 void TEA::decrypt(const byte *in, byte *out) { " P) |$ Y5 G5 d: ^- y5 E1 K
35     decrypt((const ulong*)in, (ulong*)out);
* ]- }8 e+ v* w: R2 d0 {' \36 } ) j/ s% B1 ?7 j, }
37  
4 B! Y% Q0 s& W8 f38 void TEA::encrypt(const ulong *in, ulong *out) { 4 x. o3 f  s2 \( P3 T! Z
39    N. |+ P- O7 t! C* h* S
40     ulong *k = (ulong*)_key; % z/ T$ j' b0 C# {4 s5 }* j
41     register ulong y = ntoh(in[0]); , g5 ]8 @: i; x2 j& G
42     register ulong z = ntoh(in[1]); 4 G7 S* w9 ^/ c3 G1 \1 M
43     register ulong a = ntoh(k[0]);
$ D$ B" Y  Z- \. i2 P1 B% b3 S1 a44     register ulong b = ntoh(k[1]); 8 R5 n* d: P" f  J, t0 ^# h6 m
45     register ulong c = ntoh(k[2]);
4 v- {- _" N, b46     register ulong d = ntoh(k[3]);
( z6 N# A. I% ?% r: R3 _  L47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ / ], o7 b; k' V  Z7 z& Q$ \  o
48     register int round = _round;
9 S1 b  b' }% l6 g6 p) d8 G! I49     register ulong sum = 0;
' V$ G, P2 t% S  s0 `50  , e, B8 e/ C' |3 ]2 E
51     while (round--) {    /* basic cycle start */ 5 R1 Y6 Q5 r  C& X) a; m  j% j
52         sum += delta; 7 s; _  X. f) y, y, L
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
3 g' n+ J0 i( S* A54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
. ?  a$ s. N# B; O# Y  t7 v55     }    /* end cycle */ : X) F$ J6 c% P; {& }6 h0 {
56     out[0] = ntoh(y); , {: C) F4 Q& s
57     out[1] = ntoh(z); 6 J: d) }* ?& x
58 }
7 M  @: F4 M% r: ~! m) S  e59  
0 u( V0 r8 M% m# H& H60 void TEA::decrypt(const ulong *in, ulong *out) { ) F6 i& ]: {' j; {% C. u
61  : D$ C+ H/ T1 R+ I- f; F& B
62     ulong *k = (ulong*)_key;
: g/ X1 _6 j0 d63     register ulong y = ntoh(in[0]);
$ `0 i6 F3 F0 m* Z& r" q64     register ulong z = ntoh(in[1]);
, ]6 J& F5 p& b. q65     register ulong a = ntoh(k[0]);
% h6 J- z7 p# H) e4 G4 ]  |$ {66     register ulong b = ntoh(k[1]); ; {8 t! a4 C) _' m2 T
67     register ulong c = ntoh(k[2]);
9 Y7 z; Q: ]! l9 @1 E( g) }68     register ulong d = ntoh(k[3]); $ \& a& b* P/ S
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
- U1 Q9 z7 U) r  ]. p) I* \70     register int round = _round; ( k2 V9 q" `$ Z7 q+ ^5 `
71     register ulong sum = 0; # U+ X/ \# r# a5 G3 D, E3 I  R! ?0 f
72  
( D1 o: g- y) `# @" y  r- q8 w73     if (round == 32)
9 t% u* i& y1 l/ V4 x6 s; F6 x& b" e74         sum = 0xC6EF3720; /* delta << 5*/ ! u1 O) {8 D* j
75     else if (round == 16)
, a/ t! ^# o$ Z! R: {2 y( Q3 ?76         sum = 0xE3779B90; /* delta << 4*/
' r6 H# T7 y8 D. U. _& e77     else % d$ \/ G* V7 A. P! P6 P
78         sum = delta << static_cast<int>(logbase(2, round));
2 {7 E9 b5 Q6 [7 c. X79  
1 |8 e. g# J6 B2 j  M  q80     while (round--) {    /* basic cycle start */ / k5 u& P% R- T' j- b
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 9 [! L  D4 U: P) @  R1 s, V
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); + e4 F0 H) v; F* s
83         sum -= delta;
- d0 B) D  l4 G" X84     }    /* end cycle */
, s' `2 ]0 [/ l4 Q& w3 A85     out[0] = ntoh(y);
7 p  h# Y2 _. A* }; W- ~86     out[1] = ntoh(z); 9 E5 o) u9 G# j# N2 c8 b2 r
87 }
$ t! E$ ?" V& n8 ~( X  Y5 c3 f7 A; @  k4 U0 D, d
需要说明的是TEA的构造函数: * L" c8 Z1 f; S
TEA(const byte *key, int round = 32, bool isNetByte = false);
; {9 Q, r" C- j2 X" {; q) H1.key - 加密或解密用的128-bit(16byte)密钥。 * B/ i" _+ z3 @
2.round - 加密或解密的轮数,常用的有64,32,16。
, Z  i8 J+ E5 N+ w" U1 G& d. T. d3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
% G# j# y% F6 Z" R
  F: w: [- p5 {$ R2 Q最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
4 M* J# {" K. \( H 2 #include "util.h"
/ p# {! O% `6 g- u; q, k+ W- V 3 #include <iostream>
, U& Q, r$ w$ m1 ] 4  + p, M' b# X- Z4 A# H0 H4 s
5 using namespace std; * B; q2 ~6 w$ ~8 {3 a+ e
6  1 @0 |4 N6 E0 h  ?) d3 e
7 int main() { ! x7 J% h9 J4 {4 g/ ^) A( `$ E5 b
8  3 Y, m/ P" V) t/ }! I1 e5 K/ ?1 \
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 6 K% H& Y  D# O6 O
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ( N- D# R5 o1 V
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 5 s' L6 l8 E+ |' P6 e2 g2 F5 a
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
9 B6 u' A! f6 u6 z" i9 w, R, a% U13  , g6 x9 T8 V- t( M' B
14     size_t size_in = hexStringToBytes(plainStr, plain);
5 e6 K% u, d+ ~- `4 w! W4 R( A15     size_t size_key = hexStringToBytes(keyStr, key);
% }! b* e. `5 U( o) N16  * q- ^/ s6 G# s! y
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
; g+ V7 u; k) _& X3 G18         return -1; 9 s- @  _3 y0 _. ^/ U0 A
19  6 g8 B6 U5 F" `( S, Q
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
, g$ {/ i5 k' g- C1 k$ F- x6 ?$ z21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 7 K9 Z8 ?* r& O: R
22  
1 q! L5 a0 I# r: T8 W3 a4 z" ^* `$ c23     TEA tea(key, 16, true);
& g" r* K2 t. r; Q24     tea.encrypt(plain, crypt);
. I  a1 X1 q: C7 _# p# U* f- A, w25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
. o# V+ q3 h$ D/ K26  
' [3 ~. b9 v9 L# M6 q" e4 Q27     tea.decrypt(crypt, plain);
: I" e/ s, ^4 B' B3 k28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 4 @# l/ }: |' R. B
29     return 0;
- u1 }( m/ U: m% N30 }
3 E$ J* a% @) F8 \, _# V; [2 }
1 f4 A1 R& P- G: [# X本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
" ~" w/ c1 F' R) B运行结果: + l7 K2 r" e3 b+ @) F6 V# U* y
Plain: AD DE E2 DB B3 E2 DB B3 , N: E1 w8 e4 }7 U! p, u
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 # [  Q4 y: ~7 D% l! g  o% R
Crypt: 3B 3B 4D 8C 24 3A FD F2 : B' s+ O6 `2 s. _5 C; I& Q
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-5 09:38 , Processed in 0.022611 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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