找回密码
 注册
搜索
查看: 37818|回复: 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轮):* f: c, Z" ^& h9 Y, _6 T
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 5 f5 r. D8 b) o; I( ]
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。   R8 m- D+ s$ [5 l) n. P: I0 t
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
8 s# X2 r2 y# g+ c7 o3 M$ W4 H在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
  a8 ~4 e+ G9 i( ^4 O  U/ r在 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. , h+ Z' x4 {& l* k, j
  2. void encrypt(unsigned long *v, unsigned long *k) { 4 i/ J; X0 ^6 w9 G  e( h
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */   v$ F& [$ \, Z2 a, p4 B
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    5 K: M0 f- o1 v4 s$ s  G# z8 x
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    1 `. ~& h( u2 c; v7 _2 B
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ! V) m& F8 y& ~
  7.          sum += delta;
    ' Z  B0 @4 \8 M/ M
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    % _5 {# Y* q( `% Y! K
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ : c( O: V) U9 |& a, w0 I
  10.      }
    8 }( x* @* \, }1 M6 T
  11.      v[0]=y;
    7 z; L; ]7 v; T! L( M, |
  12.      v[1]=z; " V; T+ w2 G' A9 u8 f
  13. }
    4 A; X7 _. S% l5 }, h4 m1 C
  14.   
    ) f8 r0 a" u! C+ B. K4 F
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ! ?5 X7 t) E5 a% L3 l# n
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    * [; t" E. x0 t5 ~0 F9 L
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    9 ^) s# P. ]4 m' p9 f
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    % b; k: W* c0 C+ q1 ]. Z! p. l7 F2 o
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ # d- F4 C, @! g! F0 b
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    5 M+ I* f0 g( y2 b' F
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    1 L9 B8 ^# t6 v- Q! t9 V! D
  22.          sum -= delta;                                /* end cycle */ & i& l% q. [# V0 \3 L/ ]" d* y
  23.      }
    " k! ~" [% N" ~1 I
  24.      v[0]=y;
    , j* J4 T0 u- S3 F  A  \6 t' g
  25.      v[1]=z; ' u% J: ^+ Z, @- X  o) G
  26. }0 |: `, J3 D, r, R4 U
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H , g' K& S$ Z: }, V1 e8 q' m8 W8 G
#define UTIL_H
! c) z5 w, ]1 K3 ?  u; W
" E7 m8 o* M) z: I9 p, t7 \#include <string> ; n: ]; U) Z' T! E8 v/ m
#include <cmath>
; x, D1 m/ w3 t#include <cstdlib>
8 u1 d' Z) Z. Q1 w4 u 3 ~% V* O6 a! d& z/ @: L
typedef unsigned char byte; , R; r  v# k/ n' Q( w; h
typedef unsigned long ulong; $ y5 _- ^& E) C
5 G3 p- A% P, X' C( t; B. F  J
inline double logbase(double base, double x) {
5 k9 ~9 b. d, n    return log(x)/log(base);
4 n) i  t& |% F- v' N# L} - Q' C+ i0 |+ X: b& w
: b6 x: P7 \; R' m; L5 Z+ K! c
/* 4 i1 v# [5 n& T1 {" n* X
*convert int to hex char.
. I+ n, s4 ~0 D( Q& j*example:10 -> 'A',15 -> 'F' / A0 Y# y9 h3 C, d$ \
*/
7 h, ]5 h: y# ~0 y& L$ f3 Hchar intToHexChar(int x); 3 I- E" J# ]! w
. O' s$ Q: a1 c# k, \. Y3 F
/*
; K3 {' B7 A; Z- U" k*convert hex char to int. 7 L* r, _) U% _+ n% P2 o, Z5 ]
*example:'A' -> 10,'F' -> 15
: U3 q7 T- O  [. b0 p. b" R*/ ( u' [5 e0 Z7 r. {
int hexCharToInt(char hex);
; T& W; ?; D* | " O- \% s* y" x3 e* I
using std::string;
% @/ x7 ^. Z3 l( Z, r6 T, @& F/* ' m: N  W* e! @/ Q4 r; W$ \  w0 Z
*convert a byte array to hex string.
  r+ a" p! c2 v1 |*hex string format example:"AF B0 80 7D"
6 W' _  [- y; T8 t*/ 9 K: }' l; c$ |! P' ?- U! j
string bytesToHexString(const byte *in, size_t size);
3 `: b' q$ _) K 4 a: u, U2 V  z, h# H
/*
( o# h# h0 b( E5 o* C7 @' ~. k*convert a hex string to a byte array.
4 U, B, o. a7 g( ^  B. d3 w3 O*hex string format example:"AF B0 80 7D" 4 O; S4 e7 ?: [# z
*/ 8 I$ v, u5 f% z) Z& B5 e
size_t hexStringToBytes(const string &str, byte *out);
' a6 \0 r% [$ S3 d9 x5 w
& }- E: \9 t% i#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
" p& |  @; G4 l7 ]- G, I#include <vector>
# S6 x# G+ a) y5 c  Y, ]7 P
8 N2 g! L/ u/ N/ i- z- T" Ousing namespace std; ! K: z+ @6 ]/ a( M1 g" z

) _- t, k+ [8 H% w1 {char intToHexChar(int x) { 6 {; c" N3 t, K% a. N% G/ `
    static const char HEX[16] = {
- m4 J/ Z: d  ~! _5 ~2 v        '0', '1', '2', '3',
+ \) ^6 }0 s7 U+ M5 H- e) I; l        '4', '5', '6', '7',
% ^" L' g* s7 ?$ T0 ^) M        '8', '9', 'A', 'B',
5 Q1 [& Z: c) t% _        'C', 'D', 'E', 'F' 3 f5 R; z/ j) }1 m" F6 f! b. M
    };   p3 n0 w1 T8 v& ~
    return HEX[x];   q( f. l9 Z0 X" y7 l. ^- }
} 0 H7 b) v, S! \4 u0 j" g
; H3 y4 D5 _7 |$ a; ~# `% y
int hexCharToInt(char hex) { 9 Z) U  m7 Y7 q0 T  I
    hex = toupper(hex);
, p) z: ]( i: Q2 H. ~    if (isdigit(hex)) $ r+ I' V! G9 I  y2 f( B
        return (hex - '0');
+ t* O- t2 y% k; Y& I    if (isalpha(hex)) 7 d4 |$ l1 o$ H
        return (hex - 'A' + 10);
2 Y! q' u* L- }; E  k1 h5 Q# L    return 0;
4 P9 M4 S6 W$ W} - C5 r/ L4 r" {6 q2 e/ o. W9 J+ N% e

0 t) D4 [1 m$ d/ [1 V$ {# }string bytesToHexString(const byte *in, size_t size) {
" D  D6 E1 s8 ?9 V2 P+ Q) [    string str; 2 I. P6 ]6 p) l( k0 I  }
    for (size_t i = 0; i < size; ++i) {
; P3 u) z$ B0 k, j( |! X4 c        int t = in[i];
/ g% H& d; V' E- \' v1 K, V        int a = t / 16; ( e" q5 U3 \2 N2 x* f% v' [7 E) W
        int b = t % 16; 0 A) Q6 p  r) U  @3 ]3 _" P
        str.append(1, intToHexChar(a));
+ O+ J& B, c2 L! b        str.append(1, intToHexChar(b));
6 }# ~! \" J8 f3 b2 c        if (i != size - 1)
' D+ W/ X  U3 z# z/ h, i            str.append(1, ' '); 5 E3 p. f9 U) O: b2 ?8 @/ [$ O2 x) t
    }
2 K0 o, t8 y9 e3 P* D. ~4 L  u    return str; % H9 t0 x; I) d5 |1 j1 R
} 8 p8 K2 C  E9 q  z: a

0 a$ w, C( J) O& ]size_t hexStringToBytes(const string &str, byte *out) {
; z# s' ^) {" C$ {: P 1 }' ~( ~7 y9 }  E  h# B
    vector<string> vec;
9 w, @! f7 L3 A" E$ p; u/ B/ R" \    string::size_type currPos = 0, prevPos = 0; + }. q& {" N7 P, O2 `) C) O
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
' V3 N$ x$ I3 p' z        string b(str.substr(prevPos, currPos - prevPos)); 4 C5 P! [  E$ N0 e
        vec.push_back(b); - W' E, I$ Q1 Y( a
        prevPos = currPos + 1;
. @* B( p% [9 e  p% ]! h# V" d& s    } - k. ]9 l$ [2 ?  \* ^
    if (prevPos < str.size()) {
# g% U0 w# ^# _0 X        string b(str.substr(prevPos)); & F  T  L" k+ J1 L- y2 x
        vec.push_back(b);
) U4 d- N! D7 K$ n6 M4 W    }
7 [& n  Q: ]6 H- `$ @/ b. a# {    typedef vector<string>::size_type sz_type;
' z* Z% V& Q, V; E  h; A* G9 b    sz_type size = vec.size();
1 E& f  w( m2 I  f. C0 A    for (sz_type i = 0; i < size; ++i) { 0 w# f, z$ q9 `- [9 P- J
        int a = hexCharToInt(vec[i][0]);
9 ~, J; B' ~5 J& M8 B. ?9 D/ i        int b = hexCharToInt(vec[i][1]);
* d8 M6 ~. Z+ ?/ [* ~; M        out[i] = a * 16 + b;
+ l! t+ X& K; s. p4 r    }
4 S. }0 E; G1 j/ r' \    return size; 3 G, x4 m, l2 u
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
" @3 r4 E, {3 k8 R* C#define TEA_H # i% ^7 n4 K* S3 j

& g4 F; R5 f3 v4 u' a4 d, L/* 4 a3 H5 L+ W, q1 ~2 C* |
*for htonl,htonl * w. r) W& m4 X0 J9 u- N
*do remember link "ws2_32.lib"
& @4 c) S8 U/ i*/ 2 k3 S4 Y8 y0 q
#include <winsock2.h>
6 L0 D) S. L' F- I+ D! O#include "util.h"
3 T0 ?1 J( k2 {9 U6 Y+ ?9 A$ v* V # m. I1 C' P8 R
class TEA { 9 H# M" e5 |6 a7 v; k" w, G6 x+ Y
public: / t2 W/ Z+ V' F1 Z: n! b3 i2 R
    TEA(const byte *key, int round = 32, bool isNetByte = false);
1 h  d. d) W- A) D0 {    TEA(const TEA &rhs);
- u5 x; a  w6 Y4 w- a, _1 c    TEA& operator=(const TEA &rhs);
9 c0 |8 V% c, c; N    void encrypt(const byte *in, byte *out); & }- f$ F  a3 S4 U
    void decrypt(const byte *in, byte *out);
- D& q+ W$ B; g' g* g. m- Wprivate: / e# @+ m4 ^7 y( O8 S  d1 Z
    void encrypt(const ulong *in, ulong *out);
5 A4 q' r7 M+ P: y7 N  O    void decrypt(const ulong *in, ulong *out);
8 @  F  x3 w" W2 k4 |5 K5 S    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
; ~8 t" s" |* ]9 t& y# C+ m" B    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } , E8 U& a1 ^  T5 [+ I
private:
- Y! J' \! X& n& m    int _round; //iteration round to encrypt or decrypt ( |* ?  z2 m7 t6 h; M& i! [+ z
    bool _isNetByte; //whether input bytes come from network % _) s1 h, J( P
    byte _key[16]; //encrypt or decrypt key * v5 [7 ?3 M9 x2 h- y
}; 2 `' A1 R. w' R8 J! e

" P8 }/ q- T- U  I#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 5 G% [; R; b" l) {9 y
2 #include <cstring> //for memcpy,memset
* [: {& X1 Y7 Y7 X) g4 r; U2 D 3  2 K& V/ h. z0 @% w
4 using namespace std; 3 O) b  I+ f! l3 x7 z
5  
1 K4 Q( h! |- |" x/ B# p 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 8 n! B' H8 E) d. `, ^6 d9 s, C6 z
7 :_round(round) 8 @* a( w4 T! k# v$ [
8 ,_isNetByte(isNetByte) { % y7 N2 T% Z. a; N0 p# u- L+ Z
9     if (key != 0)
* K0 U/ ~/ h$ }& g; d10         memcpy(_key, key, 16);
* \& _' {: o( J# ~& ^" Z7 }3 R7 }11     else
- K4 g) o  R9 @4 m$ e% ]0 ]& y12         memset(_key, 0, 16); 6 u# d6 e0 ]: A+ o  P/ _
13 }
  }( s2 k, F" j4 K9 Q+ Q5 b% V$ W14  
* f7 v6 E) U4 E* {3 t7 r8 R15 TEA::TEA(const TEA &rhs)
& o- w) g9 q' P6 A0 g5 E  R' [: x16 :_round(rhs._round)
8 i' K* [* H# L17 ,_isNetByte(rhs._isNetByte) { - O' R- S  D+ D. P
18     memcpy(_key, rhs._key, 16); # P+ v( _" G& E% G
19 } 0 `7 e, v+ U) p
20  
& D' y/ Q  S& C+ _2 ~' e; h. q8 r21 TEA& TEA::operator=(const TEA &rhs) { ; }3 E4 L( J3 z0 }8 H. a+ c: C
22     if (&rhs != this) {
& r5 V( g3 K7 M, K% |( U23         _round = rhs._round; 2 W( @2 @, }+ g
24         _isNetByte = rhs._isNetByte; : ~0 z1 x2 N1 k8 A% `3 {+ I7 E6 s2 C) H
25         memcpy(_key, rhs._key, 16);
. W/ s9 R$ z7 `  F$ D, g26     }
( [9 P9 i4 W1 x  I27     return *this; % Y* k* z$ N% i. X- J
28 } $ z' {) y8 G9 F
29  ( }4 a/ l& K  T% ^  K; w/ ^
30 void TEA::encrypt(const byte *in, byte *out) {
3 ]4 W, L2 E% p/ P( a' E" t31     encrypt((const ulong*)in, (ulong*)out);
8 Q0 D- @& Y, X" z' ?: _32 } / ~/ M7 z8 x8 N- H% J  t' y
33  ) A& m1 R* q- m1 X% S& a
34 void TEA::decrypt(const byte *in, byte *out) {
4 ^7 f1 N% h8 i* G5 ~* ?35     decrypt((const ulong*)in, (ulong*)out);
! E, A% V, y. z7 H( x# ?5 P36 }
4 w9 p2 u, f0 r37  7 s+ U, j1 a  g9 \
38 void TEA::encrypt(const ulong *in, ulong *out) {
) f3 @$ p+ a* U8 o3 f5 j5 }39  1 w6 y) x/ `; ~2 M$ ^3 _0 u) G
40     ulong *k = (ulong*)_key; 1 P. s  Y& n& T' D! N$ O5 s
41     register ulong y = ntoh(in[0]); " H. ]$ k  }& v7 O
42     register ulong z = ntoh(in[1]); 3 O5 S; ]- Q; `9 u6 E
43     register ulong a = ntoh(k[0]);
9 z7 \! H; W6 L8 k; s3 x44     register ulong b = ntoh(k[1]);
8 e  Q$ V: ~3 O( y8 a9 R45     register ulong c = ntoh(k[2]);
* P. G' i% m! g) l4 l0 R) H6 @46     register ulong d = ntoh(k[3]);
, E- c6 J/ o& ?$ s2 t* Q47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
; W; g0 ^/ f9 G, W! L; A48     register int round = _round;
0 w; ^) I2 J6 K9 A% \* N49     register ulong sum = 0;
" l+ V7 ^7 O; R' Q50  
: {9 D% w$ c7 g# P+ h, B4 I; I51     while (round--) {    /* basic cycle start */
: z0 [2 t& H" |( _% H- |* \52         sum += delta; 3 Q/ @% F- u8 y0 K" [
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); / v7 f6 c) M+ n5 K/ C& w! `1 l3 J
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 3 J! e% A6 \; T5 l- C
55     }    /* end cycle */
9 M0 c$ B! D- B" _- U& r56     out[0] = ntoh(y);
) T5 [2 p6 `$ {+ g3 ~) W- W, _3 j" ]57     out[1] = ntoh(z);   E% E! B* ]. p* @
58 }
: h! u6 v3 ^5 q59  ) \" t% o8 w; H! o5 S* ^; n" X% s
60 void TEA::decrypt(const ulong *in, ulong *out) {
) O3 E! _3 g: R) g4 i61  2 p* i5 `& {- e6 X% p1 w* D
62     ulong *k = (ulong*)_key; : Y1 t8 w. t' e9 J% h6 ]( s
63     register ulong y = ntoh(in[0]); 1 f/ H+ ^0 b0 ]- ~5 z7 Y
64     register ulong z = ntoh(in[1]); / f2 m9 [# L, W* U& p9 y
65     register ulong a = ntoh(k[0]); ) h( c# }0 n  W% p6 q6 @0 ?  v5 Q
66     register ulong b = ntoh(k[1]); 6 A% k" Q; G8 A6 Q0 g$ r
67     register ulong c = ntoh(k[2]);
1 ?% d: L/ V- ^) Y' T3 r. j68     register ulong d = ntoh(k[3]); , n) U! h5 n( x/ S* s) T% s
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
% u4 F: t& r" y70     register int round = _round; ; A( ]0 o: U. o1 [# ~4 x; l) X
71     register ulong sum = 0; 8 L# y' _8 l! _3 K
72  5 N7 o  p  E  X1 i9 m7 \
73     if (round == 32) # u' E. Z- k- e2 E! {6 `6 K1 H
74         sum = 0xC6EF3720; /* delta << 5*/
# T( s! S$ u( W6 z0 k7 x- p' Z6 m+ Q3 [75     else if (round == 16) 6 Q9 Z: g$ K, Q. J
76         sum = 0xE3779B90; /* delta << 4*/
* x6 Q, r+ z5 J; |+ N" _& F77     else
- a5 Y3 G3 y/ x# {7 ]0 x9 a78         sum = delta << static_cast<int>(logbase(2, round));   m, c2 }0 S8 [, u, H* m9 Z* u
79  8 r) |' T& L9 ~8 b' Y3 J
80     while (round--) {    /* basic cycle start */
4 w* V7 w, {6 a& R; ?81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); " I0 ~6 N5 g4 \/ n6 S) k, h
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
/ i6 J! R9 Y* X8 Y; O0 w83         sum -= delta;
, v( ?1 ~7 }! M4 Y84     }    /* end cycle */
3 _; F$ Q7 M/ ^% {( Q8 O- i+ G' J85     out[0] = ntoh(y); ) T7 q+ ?( V- J  h0 D! s0 ^; ^
86     out[1] = ntoh(z);
  m8 v. [7 q) \4 a87 }1 K6 q3 h4 M/ C0 c# D5 {
4 r4 M7 Z+ D/ B! J* o6 e
需要说明的是TEA的构造函数:
' Q* |4 _9 F& z6 R' ~TEA(const byte *key, int round = 32, bool isNetByte = false);
$ N9 `  G6 v6 l8 s  Q: W& L7 ?( u1.key - 加密或解密用的128-bit(16byte)密钥。 & c  C5 v: _  G; }5 T) D
2.round - 加密或解密的轮数,常用的有64,32,16。 * r  g2 x& D! K! P3 d$ n/ B- k
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
' i& h3 ^! A, x4 R! b
5 L( c/ ]  B9 ?9 v最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
8 S( V3 E; M+ z 2 #include "util.h"
  L* h0 O5 M! \3 V- O 3 #include <iostream>
7 e0 e) B0 t; ~& ]5 g 4  
4 @& X1 ?8 ^2 p 5 using namespace std; 6 k" s4 x$ B9 u# X0 n$ a5 B
6  5 N$ s" L+ F* t1 ^
7 int main() {
5 B7 R4 x: l: U# N. V" l$ K1 Y 8  
9 b8 n5 t2 Y1 w 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); , {* J8 {% A" h6 {4 m+ o) J
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
0 A4 k6 D# m. S' v1 x" X6 w11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 8 ^8 ]. S* \& N8 w0 L- y
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
% |9 ]9 k9 C; a/ O; b7 V5 h13  0 W. M2 E0 P" G1 F4 e, F5 M
14     size_t size_in = hexStringToBytes(plainStr, plain);
4 N) M& q. e% }15     size_t size_key = hexStringToBytes(keyStr, key); ) Q1 l; O1 W) v1 c
16  
2 T5 [, o2 d( K! Q5 f% [0 {3 r, S17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 3 x4 O2 C4 U( E6 M# j$ {$ ]
18         return -1;
2 f3 }; i! K& L7 u1 c+ b5 ?19  ) s# P* _, @: {% l+ v
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
, u# G; r' x# |) E21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
$ U& W( }, g' Y22  
* g% U/ w  J8 Q23     TEA tea(key, 16, true); + O" P, K' B$ A; c9 k7 c/ N5 {- r
24     tea.encrypt(plain, crypt);
& E' k. J" i2 @25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 9 W! ?! ~) K, b, c! N. L2 t
26  
; H/ f% V) a+ s' r27     tea.decrypt(crypt, plain);
3 H  N6 o7 f- z& L28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; $ u5 P  b/ R) e; N5 q
29     return 0;
6 |1 g7 V- [9 L: o# s30 }& @1 t: W2 a6 h- a( r5 r+ Y8 m9 Y0 V

- o6 a3 F- n& x! X& q本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
. `8 }6 X% E3 l( W3 y2 w. t运行结果:
5 l/ W6 x2 `, n2 F- H( xPlain: AD DE E2 DB B3 E2 DB B3
1 M- A7 E  Q; G+ g# j/ @" D: a1 VKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4   x- B, h! B) g$ Z
Crypt: 3B 3B 4D 8C 24 3A FD F2
0 r/ M8 G! o+ x" H" ~, W# XPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-28 20:46 , Processed in 0.019731 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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