找回密码
 注册
搜索
查看: 38544|回复: 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轮):$ g7 E9 B( ~2 I+ m/ m  d7 H
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 % C3 ^$ Z+ a5 x; \
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 , h. y7 f2 `$ q
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 # t# o5 y/ q8 Y" V: B* e7 b3 B
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
" b+ E1 t# H& U8 @% `在 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. 2 L$ R+ Y, B% Z4 v1 o( q  x2 P
  2. void encrypt(unsigned long *v, unsigned long *k) {
    + ]) K% ]* E) i( g$ \( e* e
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 2 ?9 [8 K1 f5 j3 g5 b9 I; Y
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 2 o' j0 x1 h& [  g1 k
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    3 T9 k/ A' q9 {
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    " G& ^: b4 C/ w% [
  7.          sum += delta;
    3 r9 |8 S* c! k# L; e( x$ l
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 8 c3 Q, V4 B, k* u$ u
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    9 z/ J: ?. G9 D) H
  10.      }
    8 _+ z  n3 g$ R2 l. A! q3 E
  11.      v[0]=y; - f9 t- J2 e7 }* w% e5 R3 N
  12.      v[1]=z;
    0 \4 [& t# B2 W- |5 c! D9 F
  13. } ' e- d) B* K  ~5 F
  14.   
    5 I# w) @% X' A# T8 }  z- u
  15. void decrypt(unsigned long *v, unsigned long *k) { 1 }8 P/ e% s) N& r- r( K# @
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    8 e. S5 H3 ]2 I1 U3 D8 x! P
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    . W6 _4 _7 ?9 ~5 k
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    6 r( _3 U3 _8 M1 M# X5 o2 M+ @
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 0 @2 N/ b7 s; m( P% @5 Q3 U: Z
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    - m  M2 ^3 @$ c( _/ W- |
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    # {7 c7 \9 @) a  T2 ^# l9 z: w
  22.          sum -= delta;                                /* end cycle */
    : y- v$ }: }* [8 K, O/ K  L
  23.      }
    " ?& R+ j; t3 M& p5 L4 g% }
  24.      v[0]=y; 0 O3 P/ T3 e8 b3 a1 a6 g
  25.      v[1]=z; * T% R9 Z& W: z/ g2 p/ K
  26. }
    7 d. F; H  u( }7 v
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H + K9 Q* Y1 e  G9 z4 F6 g
#define UTIL_H
6 ^5 j5 W+ p/ J" j
2 I- o+ A- E" D0 L$ r#include <string>
1 H2 s0 V: O+ A" ~: O* g#include <cmath> 2 z* i/ ]9 W; q# ?2 B; L& b
#include <cstdlib>
% G3 q( I: z7 u& h* T+ x! {: X , ?8 L9 i5 _/ m, q7 I. ?$ h
typedef unsigned char byte;
, V6 h( v6 h; \2 v% Utypedef unsigned long ulong; 9 ~6 F# C' q  e+ b

# t4 F! q8 Z# H/ ?  Kinline double logbase(double base, double x) {
$ P6 o  `9 Z$ s9 S/ a. P0 Y    return log(x)/log(base); 9 d, h0 J( h" s7 g6 _9 s  c
} * s. N+ E- j9 D) d% O0 v

8 P1 O3 j+ [; v8 Z% y9 q( l/* & J) a+ B" w) h* Z0 Z) _/ U6 O3 b' v
*convert int to hex char.
! y! L" p2 \$ w* c3 S*example:10 -> 'A',15 -> 'F'
; Z: ?8 a' Z# p$ \*/
8 v9 |6 ?' Z' U( n$ W- Y' Q% fchar intToHexChar(int x);
6 G7 X7 e( l3 I/ y# q. T7 } 9 Z8 p( Z% S, l
/*
4 j. k. L  V6 B. R8 ^/ D6 C*convert hex char to int.
' z+ h: b& T1 Z. L* ^0 p4 b*example:'A' -> 10,'F' -> 15 4 ?1 X9 N. a  j; E
*/
* @! e. G1 [+ r. s) oint hexCharToInt(char hex); ; y  R5 }# N0 O  ]$ d

5 s4 v6 S! w0 S2 ~# T4 \- _( tusing std::string; ( {: W3 x8 A0 B! A
/* ( C+ ^  j5 g- _" ?
*convert a byte array to hex string. 3 |. E" f( ?% ~  a( f9 b. M( s
*hex string format example:"AF B0 80 7D"
2 m3 v' E) X8 y*/
$ `( b+ R% n+ i/ s4 }6 s' R. Y" zstring bytesToHexString(const byte *in, size_t size); - m( U4 x' n; `' ~. z2 F$ e
* z; l& u9 P0 ]- G8 |
/* 7 n0 Y& p% B6 C7 b' M/ t8 K- E
*convert a hex string to a byte array. # R3 v/ p* a8 D6 g0 o" s
*hex string format example:"AF B0 80 7D"
# Z7 Y* C2 r" E*/ 4 x$ R: q# z/ M- v
size_t hexStringToBytes(const string &str, byte *out); & k7 p' b0 ]- g& n! E! c4 `2 Y) E( w
% a& L5 N' o# w4 V2 _
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 1 y1 U: p" m5 ^* S& L) m% P
#include <vector> + V9 p* ?7 ?3 r( K

" Z3 j- ]1 L2 Q* Cusing namespace std; 2 G; t$ l: n+ x/ x* j1 @5 S3 L
: d3 Q+ o6 R; j% d9 Y
char intToHexChar(int x) {
" M' Z  w- }6 i9 h; C  r    static const char HEX[16] = { ' {+ C/ q( F( f4 A8 m
        '0', '1', '2', '3', + r5 a2 P! d4 P& K$ I! B+ `
        '4', '5', '6', '7',
8 E: g9 m! h& M3 d& k) I        '8', '9', 'A', 'B',
# Y& P, r& q" [/ p! V6 _4 U3 q        'C', 'D', 'E', 'F' " N3 o; _& G- Q/ r3 N9 E
    };
0 Q. b5 v( Y) L    return HEX[x];
; a" C/ j2 k3 k, B6 N6 n9 M}
" m8 r6 N9 r! D: Z. X 2 g3 P. y9 o" v
int hexCharToInt(char hex) { 0 n. f) x- T% p# w+ |( S; F
    hex = toupper(hex);
0 n) W  ^' u0 ?; K( r6 e    if (isdigit(hex)) ) R) r& u/ B0 j' X
        return (hex - '0'); 4 j' W5 B7 E. C6 h) F# Q# `
    if (isalpha(hex))
0 S( Z3 B# S; J1 [* D' b; W( Y( o        return (hex - 'A' + 10); ( l9 f4 Z) U4 ^7 x4 v  j
    return 0;
4 y2 }) Q  N9 U' W}
# h  q' o1 j: i9 K0 T& U) q 7 B1 r4 _8 F, Z3 D1 R" _
string bytesToHexString(const byte *in, size_t size) { ' U& q9 }' i. P, P
    string str; : v8 T. c1 f& Q8 j' w# D
    for (size_t i = 0; i < size; ++i) {
$ {$ n, Q- e6 a" w        int t = in[i]; ) R. R- e0 [! e# }
        int a = t / 16; / W. v2 }, ?! f! \+ e# t: s+ L8 n
        int b = t % 16; , [4 F6 ]. J1 d( e- L, R
        str.append(1, intToHexChar(a)); $ S& q$ c4 D1 @5 S
        str.append(1, intToHexChar(b)); 4 g' z, B. ^: D$ ~3 P( L' i9 ?  q
        if (i != size - 1) / h9 z8 W" o& S; o4 T4 Z: U( p4 C
            str.append(1, ' '); 0 ?0 B, K4 q9 G1 y9 G; u# u0 f
    } 3 x0 P$ h+ ?, C7 }5 y% a- k3 t
    return str;
6 {: _' j1 [  Q}
. N5 C# w  ^5 g- ?5 C1 v% i
5 ~2 k& C, ^+ A9 q1 xsize_t hexStringToBytes(const string &str, byte *out) { 2 A. N* w1 W0 G5 n! C
/ ^3 {: q# K2 e6 r; G& Y. B! M2 i
    vector<string> vec; " B( M$ x' C4 j3 y
    string::size_type currPos = 0, prevPos = 0; 4 }0 L6 z  t' v: h# c8 B4 o
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
) g4 g( O6 C9 \) }0 x, a/ R- M8 r- o        string b(str.substr(prevPos, currPos - prevPos)); - E0 Q# U& Y( G6 B  x
        vec.push_back(b); 8 a% W) B5 F! j. K! j
        prevPos = currPos + 1;
4 y' r* ^/ z' L; [. e    }
6 W$ @$ g+ v" P; o- |    if (prevPos < str.size()) { " J8 u- A: D3 Q/ V' y
        string b(str.substr(prevPos));
1 K- \0 v5 a3 T( D$ P        vec.push_back(b); - N% Y5 `! W2 ^4 e- s/ P
    }
3 Q& {* e, {$ n- Y7 s; ?6 p2 r    typedef vector<string>::size_type sz_type; % ~  Y! I# u4 f
    sz_type size = vec.size(); ) G- h; B# W+ T& K. v! [' ^0 U" t
    for (sz_type i = 0; i < size; ++i) { . S# H" @2 R+ I# G: ~( N
        int a = hexCharToInt(vec[i][0]); ) l9 o0 X: E& ^# U& B" y
        int b = hexCharToInt(vec[i][1]); ; q' i& e. N& T$ I8 @6 v
        out[i] = a * 16 + b; ! g; d; ~( u3 |( y6 O" `* y
    } ) ?! [1 q# f5 o9 G. H
    return size; 4 r7 U) \: Y; [9 Q# G
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
& l5 ~8 x3 }) a( K: N7 b#define TEA_H 2 Q1 K1 V( Q$ L( m$ {
5 M5 R! B, Q; o
/*
7 n+ Q( I1 y: \9 }*for htonl,htonl
# }; }( I( @+ Y*do remember link "ws2_32.lib" * V) Q2 J! Y5 x" ~8 k
*/ # e5 H1 X3 q' v' A* l- s7 q0 L
#include <winsock2.h> - p7 ]) l4 U: P# u) w
#include "util.h"
+ Q4 o. U1 o2 t9 ?0 X6 _8 M $ F$ B! `) L  \* u' V8 y& p1 a
class TEA {
, K; M. C+ k4 N* G( mpublic:
. E; S! f. F9 M# n    TEA(const byte *key, int round = 32, bool isNetByte = false); 7 o" e& |' F2 d  [, U& x
    TEA(const TEA &rhs);
1 H- b1 H: Q" x8 [8 E3 E9 R    TEA& operator=(const TEA &rhs);
+ }- o: a$ I3 m5 ?9 F. W    void encrypt(const byte *in, byte *out);
3 K: O7 @# s/ r3 @8 A3 O    void decrypt(const byte *in, byte *out); - |# j3 C5 |6 O1 x* U
private: 4 V, F4 o% W3 H7 J9 U5 l
    void encrypt(const ulong *in, ulong *out); ; L/ T) r% e- U3 P. J0 p
    void decrypt(const ulong *in, ulong *out); % k; J6 a! ]$ Z% K: H  x# ]6 v
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
" O, T! h" u; a, Z/ _# P, ~    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 5 P4 H/ J  B6 L, W5 Q
private:
7 n/ Z5 p5 ~# x    int _round; //iteration round to encrypt or decrypt ' h  F" o" H; s) }
    bool _isNetByte; //whether input bytes come from network . X8 L& b+ V: y+ k6 s7 k/ B( c4 a+ j
    byte _key[16]; //encrypt or decrypt key ) G) q8 {( l9 a- [
};
9 P8 y5 K6 j# ^* w& z
& \+ t- \; d# A#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 2 h* {% ]( q. |0 P7 b
2 #include <cstring> //for memcpy,memset ; Y% q- q1 e9 r- _9 G6 D
3  # L) ?, T* v4 i4 }/ \
4 using namespace std; 1 l# u/ s/ b7 y" }
5  
& \. l+ U0 T# Z9 U 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ; h  Z1 I( ^1 Z8 n. t
7 :_round(round)
5 S/ P2 Q- ]4 Z% @9 t. p, ? 8 ,_isNetByte(isNetByte) { 7 ~5 }% q: k* z! g) b
9     if (key != 0) . `: S+ F8 G& j: ?9 a' T" y
10         memcpy(_key, key, 16); 3 y; u. j; O; A8 C, x0 T2 [" u
11     else ; |5 O, Z7 q" A6 |- P
12         memset(_key, 0, 16);
2 a' B% k& Q- S$ I6 x4 i13 }
. K! \7 L" d" }, t4 R14  " j. x5 v" F) K0 \" k+ `4 g
15 TEA::TEA(const TEA &rhs) ; P+ d" `$ b$ A7 V+ ?! G
16 :_round(rhs._round)
  ^: e1 b- M# v! _9 I9 E5 O17 ,_isNetByte(rhs._isNetByte) { ; W0 A% ?" v3 q# W& z" W0 j
18     memcpy(_key, rhs._key, 16);
* P0 @( [& K' k- d19 } & H& ^% U( ~$ D9 T: F! I. Z
20  
! k: e% Z' y0 q% A21 TEA& TEA::operator=(const TEA &rhs) {
1 k% n9 i4 R( Z, T) c22     if (&rhs != this) { " T& v$ R. Q# ~+ m% {7 R! t, w$ l" }
23         _round = rhs._round;
/ h5 G$ a% c) D) ~24         _isNetByte = rhs._isNetByte; - Y6 s' t/ V6 R
25         memcpy(_key, rhs._key, 16);
8 W+ Z3 v  q6 M& b( i/ \( V26     }
5 D0 o2 _1 k# k$ F* r' c" s/ |3 l1 W27     return *this;
; h8 i4 Z8 [/ O; e28 }
: F7 \( F; {' R29  
3 c" B1 _9 c! o2 O' U30 void TEA::encrypt(const byte *in, byte *out) { . f$ w! ?; V2 ^. J3 ^5 H! B
31     encrypt((const ulong*)in, (ulong*)out); & }' g2 q9 T" A  E& v
32 }
( `- K+ }6 o! I+ {3 T/ t33  
3 {4 n4 E- q# N' Y( O34 void TEA::decrypt(const byte *in, byte *out) { 8 N3 b: Y3 b8 U$ D: b% o
35     decrypt((const ulong*)in, (ulong*)out);
2 y+ z4 ]/ J% P. z& ^36 }
& `+ p# J( I% q% C' O; K7 |: G37  & H5 q; w2 E6 }: ?9 a& o, q: x( y
38 void TEA::encrypt(const ulong *in, ulong *out) { . ?) k- S7 i4 j9 m
39  
2 r' q" Q) Y& t3 ]40     ulong *k = (ulong*)_key;
& @" ^  l, _, |, l1 Z  P41     register ulong y = ntoh(in[0]);
8 ?: Z) ?/ s3 Q! ?! U' C* U2 s$ P1 \2 M42     register ulong z = ntoh(in[1]); ' b) c$ I$ Q6 f& Y% c1 M: X
43     register ulong a = ntoh(k[0]);
- ^- Y. w4 s9 [- c) U44     register ulong b = ntoh(k[1]); ' ?6 }+ W# J8 A$ P4 P/ d
45     register ulong c = ntoh(k[2]); ( J$ M. z0 ?% U
46     register ulong d = ntoh(k[3]);
6 q( \' b0 e/ m1 ^% s, e: z$ N: S47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & n! M) M1 X- Y5 q
48     register int round = _round;
& r0 h) ?% a# e: Q49     register ulong sum = 0;
0 z" c. d6 z& w7 m6 [: G50  
: M3 C! f7 A' }' ~' G51     while (round--) {    /* basic cycle start */ 9 ]. g; t/ ^8 Q; J3 x
52         sum += delta;
; y! g0 ?* Y) E7 h* s" a53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); # {5 q2 l: A0 [9 e
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
  n" A* L7 o: U) q55     }    /* end cycle */ - ~9 o! f* ?# G7 h* g5 D
56     out[0] = ntoh(y); 0 Y  L/ Q' Q5 Z8 |1 n
57     out[1] = ntoh(z);
* n6 W3 Q3 n  q: i$ ]- A7 S58 }
& u5 \; B% p1 Q; j2 N: c59  ( a7 U' H) ^6 y7 F
60 void TEA::decrypt(const ulong *in, ulong *out) { + f5 l8 ?7 P. g) c
61  
& j, n$ W, y' S* b7 A! h( c3 E/ Z+ I: g62     ulong *k = (ulong*)_key; 1 b$ D$ K/ ^5 z
63     register ulong y = ntoh(in[0]);
* c: x1 f; J2 ^' E" C7 }3 e5 _64     register ulong z = ntoh(in[1]); ; f1 t2 K  Z" ]. F( V
65     register ulong a = ntoh(k[0]); 4 a1 ]5 J- V* {1 Q; s2 M' N
66     register ulong b = ntoh(k[1]);
0 k* `* V  p# G& o; {% }67     register ulong c = ntoh(k[2]);
$ M* g1 v- ^: ~- @( Q8 ]68     register ulong d = ntoh(k[3]);
8 W$ I1 v! _. A$ C) B! @69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 7 S9 r1 D$ B" ^" d4 O0 Q2 G
70     register int round = _round;
4 y: r: X$ O5 y9 H! Z; c, r0 R71     register ulong sum = 0; $ }6 [% |  U- }' _5 j/ q
72  
* m0 q/ P) n( ]4 q0 ?73     if (round == 32) $ E3 w$ ?9 j: i4 j7 w
74         sum = 0xC6EF3720; /* delta << 5*/
: i" M! _% w/ O- O5 c6 v2 ~0 G% w75     else if (round == 16)
! l5 R: e/ \# w2 U4 c+ E76         sum = 0xE3779B90; /* delta << 4*/
/ n3 o+ ?% N+ Y. s/ e77     else 9 f' P  q) M% Y5 F5 k6 f# `$ K
78         sum = delta << static_cast<int>(logbase(2, round));
2 o* g" I2 N) @8 z/ e1 T  S79  
0 I* l1 L/ c% G. x& t80     while (round--) {    /* basic cycle start */
" z  x$ o! V  O/ D! X) m, A81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
  v1 k& y' _' e. s' T6 Q82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 4 B3 M; {* f& ]! k
83         sum -= delta;
  d+ O# A* C. l. \4 N1 R8 ]( F& j84     }    /* end cycle */ 3 u5 R4 N! Z5 h& u8 X; r' l0 b
85     out[0] = ntoh(y);
7 R0 g9 l7 [7 B86     out[1] = ntoh(z); 2 U1 Y$ U4 a* ^+ N  {$ n! v* @$ r/ `
87 }* o7 s, B/ S  D3 E1 y: m6 Q) i

3 ^/ |5 s! l- H  e. f& P需要说明的是TEA的构造函数: 2 r# }8 q+ j3 S8 X
TEA(const byte *key, int round = 32, bool isNetByte = false); 7 o8 c: f2 z0 S6 S
1.key - 加密或解密用的128-bit(16byte)密钥。 0 I: J* P5 \2 N: A3 }, M4 ^
2.round - 加密或解密的轮数,常用的有64,32,16。
+ e0 l. t* r* q2 J0 n3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
# u" Z1 C# r# ?7 G2 }5 |6 z/ l: B$ ]6 \# W- _! E
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" $ T$ o  [! E: ^7 p& @
2 #include "util.h"
  C0 X6 Z; B  q( E 3 #include <iostream> 8 b/ S9 Z: l% M( o8 w' ^2 G
4  
* e. T! o6 f$ Q! Q 5 using namespace std; 4 f  c/ j5 {* J" j3 h+ k4 B) r3 {
6  8 P: E, ]8 W! }/ E. l
7 int main() {
" q0 G! H& c' \ 8  
: \% L& b- R1 Q" q  T. J$ n! M, b 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); , Q. \: u* d5 {* ]( _& d/ p
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
0 k- X  _/ h( E* T" S- C* B4 p4 A11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
! b0 d2 O5 U) Z12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
( d. l( x% Q  r2 R, }13  
8 D7 b/ _3 Q: B9 W: |14     size_t size_in = hexStringToBytes(plainStr, plain); ( d, a8 B# C4 M# q* K$ I( t  r
15     size_t size_key = hexStringToBytes(keyStr, key); 1 }4 q4 ^  p8 ^7 P) b5 S* [  j! k
16  9 M+ h5 d: M& v/ x2 R
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) - N$ m9 F  k1 s; D( z* O
18         return -1; 9 T7 b# ~; v/ o! w  r8 x$ E$ H) }, q% ?
19  4 E7 O, X9 \% r7 E
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 9 j+ r( x' K) R- U/ S' H- p5 w: V
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
' t- T+ r) f/ o9 i22  
! q- Z: C9 V7 \+ B8 C23     TEA tea(key, 16, true); - b( l. @( x9 h, ]& S
24     tea.encrypt(plain, crypt);
, ]$ }, Y9 p" B* w25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
  V1 ^% I& i( s5 Y" ~) ~$ n26  3 e& l$ I9 p5 v  m1 r( W
27     tea.decrypt(crypt, plain);
8 u; L! X/ t6 m) O) M7 g28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; / M5 u9 L3 s7 w
29     return 0;
9 V; }( ^* l/ x2 K30 }
6 s5 \: N9 h0 `1 R* L) N' P' a  F3 F4 t# N1 w: N- H  b
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
9 q& \$ y; Y/ |运行结果: ! `7 I, G5 w8 p0 A5 {9 i
Plain: AD DE E2 DB B3 E2 DB B3
0 p) O3 s" R  O: k& O3 wKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
: v1 I" Y" [) w. X$ k. @Crypt: 3B 3B 4D 8C 24 3A FD F2 ! @, |* T8 W$ u& J% T3 u
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 10:46 , Processed in 0.020584 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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