找回密码
 注册
搜索
查看: 37741|回复: 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轮):6 Q# P9 X/ F% W1 O# R3 o" |4 w
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 5 Q5 N& q& W6 G* M$ f6 J, O
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
* D- k/ N8 \9 u/ ]之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 7 R3 `, `+ d5 ~* {5 y1 Z% `* K9 S+ m
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ! x3 d6 o! a- q& O
在 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. $ f* X$ k  O9 }, z+ E0 X
  2. void encrypt(unsigned long *v, unsigned long *k) {
    $ k# o8 k. `6 I7 K0 c
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 0 P/ J9 `/ C. f9 r) o8 V% y
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
      A" v1 W& ^& E' o
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    + c% b+ O* Z$ l7 n7 R4 S9 a
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) ]  g: o4 J7 O' _
  7.          sum += delta;
    3 X- c" L; Q3 c1 d
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ) J, m7 i$ ~) t" l4 R( }
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    " z* J2 h6 E3 a  V' m
  10.      } 3 E8 p7 e9 R% ?# ]2 W! w
  11.      v[0]=y; ; L& X. U# A: [) p
  12.      v[1]=z; 5 f+ ^* l( J2 r0 \
  13. } & w* p* Q( f6 B* |) P& B. [
  14.   6 ]1 W2 G; H  t, B( j# l: U  d
  15. void decrypt(unsigned long *v, unsigned long *k) { ) K' U6 p  H$ u6 H
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 5 v) c' T9 p' {/ P& a
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    8 N* G: }  _+ v) U- v0 A8 z' [
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ * ^  g# a$ R$ x( }/ ?+ g
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    # b) e2 ^. k# T! E  J2 x( z7 t
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ! p! K* ~; g/ l; i* M7 c( R
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 6 A3 o8 `; P7 N  F9 a
  22.          sum -= delta;                                /* end cycle */ + v% S) K7 l' m* F8 W
  23.      }
    9 b# h$ {5 Z  v8 V
  24.      v[0]=y; 4 ~) _* R+ |* E3 O
  25.      v[1]=z;
    . [9 |. z  _! L: v& q
  26. }& e8 Z3 ]) K4 ]6 l6 n2 v
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
* O; Y1 Z" k& @6 ]& U! Q8 K+ w9 h#define UTIL_H
  y2 M4 H0 Q! I* P& ^7 s
% ^/ n9 U& m" Z& ^0 t  G% ~4 o#include <string>
! {" C: p7 P$ w9 D1 ^9 u#include <cmath>
" p9 Q$ ^# M( z: h0 T5 ^. S' Z#include <cstdlib> ; g, l0 p! Y1 i' C
0 u, H" s5 \. d
typedef unsigned char byte;
+ s. F( Q5 `/ T7 K: `typedef unsigned long ulong;
# v% I% B" U6 l
5 P" {( E( g3 P" Winline double logbase(double base, double x) { * ]$ i/ q4 K- z$ i
    return log(x)/log(base);
9 ~, N  |4 e- K! e/ Q4 X}
6 K, G9 H( F% J- {9 Q1 U ( ~6 B* F- K* |0 A0 F2 X
/* $ J6 \, R" u2 W# w5 \2 U
*convert int to hex char.
3 p, C4 S: N0 ?% T0 M*example:10 -> 'A',15 -> 'F' 0 G8 Z' B# h4 b3 i* C* y9 C
*/ % `  A& `8 s6 {9 I/ `
char intToHexChar(int x); . [% L% e; I  U4 c. w3 F. J5 ]& l

7 b7 B6 U0 m0 @+ ^/*
+ Z, G2 V6 @" Q' f* t* a- r*convert hex char to int.
* S3 j+ Z2 t! i) I, t0 V$ |& R*example:'A' -> 10,'F' -> 15
8 x; u2 d6 t1 k7 O4 m7 K5 F*/ , f* `. u% T0 Y/ r+ N
int hexCharToInt(char hex); ' T, F$ G0 Y+ f+ T) W2 I# i& ~+ B

( w- K  q8 _- ~& ?using std::string; * [1 i' R1 |1 c  b" V2 z; D' S
/*
/ t1 Z# J  L" h*convert a byte array to hex string. 3 a! h" N4 b+ Y6 e% T+ O+ f* a
*hex string format example:"AF B0 80 7D" $ y6 T9 ~; X1 A2 ~2 j9 N1 E2 X
*/
! L! r- J: o# s$ S5 k5 w% N8 ustring bytesToHexString(const byte *in, size_t size); 8 J8 H% A/ `  |& u6 `! G6 Z& y8 C
) a8 f! |" U+ W2 ~* w7 n
/* # h+ }, u9 h4 c" A; V) t4 Z
*convert a hex string to a byte array.
/ P" ]1 Y" B1 ]/ H5 r3 T*hex string format example:"AF B0 80 7D" + t) ^! B; x' J) t# K( ?! N0 Z4 C
*/
# t4 w9 D9 h+ ]size_t hexStringToBytes(const string &str, byte *out); : J% D+ a: [/ g- Y

9 D7 ?+ ?  p* ]6 K2 H0 \) X$ s: s#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
2 `! O1 ~# m. u#include <vector>
4 F" S1 O: M/ w. p# Y) t
6 T4 e2 J+ ~# a8 i+ i- K0 m4 |/ iusing namespace std; + W* ], J9 T  |; c2 e9 E" _
* D4 H) H$ x# Q" H; p5 Y
char intToHexChar(int x) { : e+ F5 E" }- X5 W0 x/ l+ w
    static const char HEX[16] = { 5 b. q$ q! w- Y5 J6 ?4 Q0 n
        '0', '1', '2', '3',
$ U+ ?  I+ E( U- ^. f) W3 |        '4', '5', '6', '7', % U6 g. R" Z/ R' d, E4 {  n
        '8', '9', 'A', 'B', & g8 q, l$ \, A
        'C', 'D', 'E', 'F' , ~8 o+ ^/ m$ N" D0 Y
    };
2 `# f* H9 K3 _    return HEX[x];
: L2 n% V& i- j& p}
. i1 h, i! `8 G0 T  |" i9 O
5 j" `3 M  j4 p/ gint hexCharToInt(char hex) {
9 R# L2 z& j6 Y. |7 X0 I    hex = toupper(hex);
) {  f2 V2 w9 e' _. Z) F# Z    if (isdigit(hex)) 1 A! }# X* E( S. `" U
        return (hex - '0');
( J9 K% K# M* A$ g, G7 A5 B& ~+ E( }    if (isalpha(hex))
" l+ H+ n) L/ z* }        return (hex - 'A' + 10); , Z, k! n# n" j8 V
    return 0;
7 V% E& |7 j5 H}
' _! ~5 P7 X4 P  G9 m& Z
0 O4 E% ^. v. v! {9 ~/ tstring bytesToHexString(const byte *in, size_t size) { 6 J7 ~0 _# s2 R
    string str; % p$ i: Q! r7 }: X+ Q
    for (size_t i = 0; i < size; ++i) {
3 }/ L* {# h# ?: X; ^/ ^' h        int t = in[i];
) K0 \" S9 _+ {! h6 P        int a = t / 16; % Y  i  D- S  m
        int b = t % 16;
0 x. d/ r. c* k: n( w3 Z% e% ^# Q        str.append(1, intToHexChar(a));
& Q4 M* P3 r  }# K4 G/ X/ @        str.append(1, intToHexChar(b)); ) d. R# A. X  b: s7 Z& z3 Q% \, I( Y
        if (i != size - 1)
0 P6 b) k; N7 m' ?, A% U            str.append(1, ' '); ; c2 l, X! a  W
    } ! Q8 X( m7 C5 m' n% B! ?$ U0 z* j$ z
    return str; & I  H) I- y6 l" A
} 6 X) u( r) {' F2 o

* f$ x" q. b% Y$ @% R. L) b9 y4 vsize_t hexStringToBytes(const string &str, byte *out) { 1 v- d: A% ^- v1 r3 y4 c

: Q4 p" C2 I+ P6 V! B) \) Q    vector<string> vec;
9 z+ o- _- w4 |& ^) ~    string::size_type currPos = 0, prevPos = 0; $ v2 Z4 n% L. L! ?- E
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 0 z% d0 D% f) T9 O3 w
        string b(str.substr(prevPos, currPos - prevPos));
  p- w6 ]4 Y2 }        vec.push_back(b); ) C8 M7 h% }: k$ _
        prevPos = currPos + 1; & o" g) C) D, q7 S. s
    }
9 ^" r) [) `/ o' }: ~    if (prevPos < str.size()) { 3 S8 u, P3 m" V9 n& _4 t/ ^" i4 g& d
        string b(str.substr(prevPos)); 2 B/ S3 {( a& \/ }3 f9 }
        vec.push_back(b);
" l* A) ]& U- T, w* T% }    } ' y$ ^! J9 ]" I" o4 n8 X8 c* l1 ^) o
    typedef vector<string>::size_type sz_type;
1 E( M+ Q. u, r4 V    sz_type size = vec.size();
5 ~6 H7 b( i& h5 C: q    for (sz_type i = 0; i < size; ++i) {
  M  ]0 x9 G( [4 r. G- ?        int a = hexCharToInt(vec[i][0]); ) d' }' i9 e" ~
        int b = hexCharToInt(vec[i][1]); $ i6 b6 p2 ?" i) K; Y" n3 s$ G
        out[i] = a * 16 + b; 7 F" |5 Y) D5 F; B
    } 1 s4 C% ]' q& l1 Q) @
    return size; ' h# r. ]1 w$ k& d
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H * J# y1 P* ~/ i
#define TEA_H 4 Q# M9 @* w) F6 |, @* y5 [

$ l# W- ^0 g1 E- t- E/ x/*
, ]) i) z& O9 L: u*for htonl,htonl $ E! v- R, G7 j$ `6 R
*do remember link "ws2_32.lib"
5 }5 H% }/ Z5 N: S: S1 M/ b*/
* A  v% q7 Y+ Q. m- u. N2 m6 Z#include <winsock2.h> + Q) x( D/ k+ B% r4 L6 T0 ?% C+ T
#include "util.h"
( S& h/ t* m" |$ z" F
0 q8 H/ @0 x! q2 ~& t. @; }& Oclass TEA { + L% j* i3 y# M, O
public: $ M) M- M8 {0 z- `* s
    TEA(const byte *key, int round = 32, bool isNetByte = false);
( ~' ?, I. F5 }    TEA(const TEA &rhs);   {6 ]! M8 }9 k( t& ?4 J" |7 ^7 z
    TEA& operator=(const TEA &rhs); ' m9 ~# `2 l. Z9 `# U# n
    void encrypt(const byte *in, byte *out); 2 A6 }5 N3 n  E1 Y0 I7 O  Z
    void decrypt(const byte *in, byte *out); 7 }0 U* O) x  a5 c3 d6 b2 H
private:
+ O3 `0 e1 M- C; o4 x5 h4 l    void encrypt(const ulong *in, ulong *out);
9 O( E3 M: D4 _' h" u3 a    void decrypt(const ulong *in, ulong *out);
) S- ^% I- M6 ^9 Y: R    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } - n! J: L+ j! f0 [  ?
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 7 l$ }0 X7 h1 g( o+ g9 J
private:
9 c2 Q: ~: O$ f# _6 ?, `8 ?/ {    int _round; //iteration round to encrypt or decrypt
' X, c4 ?3 i5 [  l* R    bool _isNetByte; //whether input bytes come from network
: z* S4 s* z% F4 M) X; o+ {    byte _key[16]; //encrypt or decrypt key 6 G2 Z: O/ ~% v' W- c: n
}; , R# A! q2 }- r8 ~

3 S# k% D: {0 Z: M3 k. ^#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"   S2 h% F9 P( o% e0 ~# x
2 #include <cstring> //for memcpy,memset
& d2 p: W: P( u, r9 K 3  
4 |# p9 j' A0 a7 i1 w7 J 4 using namespace std;
3 e  X2 R: \  O 5  & |* s( e: P* L7 }
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ! V8 o( l! P2 ?; e' p; k
7 :_round(round)
2 X0 g5 q; h" O) Y: r 8 ,_isNetByte(isNetByte) { 9 Y5 U. q$ X6 c& C
9     if (key != 0)
; H" b' h# P( |/ t0 z8 n7 {10         memcpy(_key, key, 16);
' P3 ?9 N: W0 w" H3 U7 p/ T+ a11     else ! s% C6 ^; X" h0 l. {- N7 F
12         memset(_key, 0, 16);
" Y3 n/ q+ f9 q2 ]4 t3 ?/ P13 } * R8 Q3 Q$ f9 I2 I; b
14  
. z) `, f3 I& i3 f6 C15 TEA::TEA(const TEA &rhs) * l) ~, S6 A5 M! a
16 :_round(rhs._round) & z/ c8 }0 v- E0 D/ c3 P! z
17 ,_isNetByte(rhs._isNetByte) { 4 g3 S& v- f: p8 a1 V
18     memcpy(_key, rhs._key, 16);
3 v' Q! E( J  p/ m19 }
1 U: M- w8 O4 S9 t20  8 |6 P* t( U( l! @
21 TEA& TEA::operator=(const TEA &rhs) { , {% u! N! h1 B- t2 M  Z  `6 G- {
22     if (&rhs != this) {
+ E( N# U$ U! y4 `& s8 e7 p23         _round = rhs._round;
3 r* G; E: L3 R7 l$ q, r& ~! i% i: o24         _isNetByte = rhs._isNetByte; : d4 N1 U( j2 u) B8 |5 d* l
25         memcpy(_key, rhs._key, 16);
. Y+ c, c. T$ F4 }- e1 }% p2 |. ?26     } 5 q' d3 a0 Y. g$ |& O) F
27     return *this; : L5 D# F7 S9 s
28 }
; L( }0 s% |0 ~( i! L% [  D29  
; y/ L5 i8 c  L30 void TEA::encrypt(const byte *in, byte *out) { 8 c" X% i  {" w, y7 f
31     encrypt((const ulong*)in, (ulong*)out);
1 G& C" D$ L: ]32 } / D; B# \" p8 J" W5 |, K7 J& D
33  
. F$ o. f$ b" }- q( l6 Q34 void TEA::decrypt(const byte *in, byte *out) {
( f+ d7 }# G8 o' P35     decrypt((const ulong*)in, (ulong*)out);
2 Y, l# S. G5 T* R1 L* c36 } 0 c: t9 R; P% V2 y+ L" e) t6 G
37  
% }' K- s: i+ H# t% d38 void TEA::encrypt(const ulong *in, ulong *out) { ) F9 T& o: i8 |& x; x* c  Y
39  , j4 d, R3 @7 v+ O( L
40     ulong *k = (ulong*)_key; ' C9 r2 A# V3 O1 C/ g" ]
41     register ulong y = ntoh(in[0]);
: t1 v, t* F+ L; S0 H0 \- d! r42     register ulong z = ntoh(in[1]);
8 D- |# _: O0 t) r0 D# ?3 `- g( O43     register ulong a = ntoh(k[0]); ) b4 e* S4 d6 T2 y2 s6 Q' Y6 d
44     register ulong b = ntoh(k[1]);
8 i! r' d! m, H) S9 m- N/ P45     register ulong c = ntoh(k[2]); ( L2 m) R$ _; S$ O7 x
46     register ulong d = ntoh(k[3]); 6 q8 |* f3 S  G* C+ ?  w2 D% @  z  s
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: }: T  V  w1 P5 a3 X9 P! e48     register int round = _round; # p, ~/ V) `% Y; c. c! F: `, t4 B
49     register ulong sum = 0;
- K( W8 \: R& z& V$ P- _* u9 O50  
9 d/ s$ q# n- F: b" |( p: T51     while (round--) {    /* basic cycle start */
- [: T5 @% ^7 u2 I+ |2 ?52         sum += delta;
1 ~5 o8 G  w$ ~- Y53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
- w2 ^. \' j+ F5 r: k54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); : l' F; O0 f' p6 ~
55     }    /* end cycle */ 4 i0 b. r3 e$ i# A8 t
56     out[0] = ntoh(y); / E- y5 c' @  E% S$ `8 e! K
57     out[1] = ntoh(z);
: N# @4 j) o* t5 a+ g( b; a0 K' _58 }
# b  r/ R+ i! j59  # J* d3 @' e9 h8 W  s
60 void TEA::decrypt(const ulong *in, ulong *out) { 3 T- g4 X. X+ V6 G$ d
61  
8 @, @5 F7 h) P- @/ ]4 c, X9 g62     ulong *k = (ulong*)_key;
" ^+ j1 O& l7 A& _63     register ulong y = ntoh(in[0]);
" z  c! r2 V! Q+ v# i2 _64     register ulong z = ntoh(in[1]); 0 N+ h# U% c- U6 c
65     register ulong a = ntoh(k[0]);
+ Y0 E, ~8 M# D8 M, @66     register ulong b = ntoh(k[1]); / O* ^; ~' ^  P8 g. M+ A( o
67     register ulong c = ntoh(k[2]);
2 x3 n& G5 t) X* y& M4 t+ [68     register ulong d = ntoh(k[3]);
0 a) f: U+ C5 K# s# G0 X2 |% S9 j69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */   o) `- ]. q* L' j/ V- }) |
70     register int round = _round; + H+ [8 \9 W5 {
71     register ulong sum = 0; % B6 x# T+ C' y- x$ T  z& ^
72  3 Q! l. Y# P5 D! k, v2 i5 \9 [1 y  ?& t: f
73     if (round == 32)   D) [. i# b& m- ]* U* `5 N
74         sum = 0xC6EF3720; /* delta << 5*/ 5 t8 A8 k9 B% W% z" p; W
75     else if (round == 16)
- V0 `, M' Q# E  s, o  N76         sum = 0xE3779B90; /* delta << 4*/
; G( |' s! C2 k2 }( W77     else
" a. k5 v( R6 X: O78         sum = delta << static_cast<int>(logbase(2, round));   o7 ^3 [$ }9 F& U
79  ) M; _$ F1 j+ Y9 N% p) p! g; o
80     while (round--) {    /* basic cycle start */
: r% s* l! ~, f( }: ~( Q7 d. H81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
& u7 X( F! O! @& |: c: U: W5 V$ J82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 3 H' }' L$ ^& X6 o; A6 G, x( s
83         sum -= delta;
& u* a! q$ s3 W& G' F' X0 T& o84     }    /* end cycle */
5 L8 A0 _, O2 l& o0 n' x0 b85     out[0] = ntoh(y); 8 p, h/ N* C/ n7 u/ o- `
86     out[1] = ntoh(z); 5 l6 M8 H5 P. C2 }2 _4 Y9 H
87 }
# |% i& o1 D2 q2 z5 z  s4 {
" s- K+ ~/ K6 u7 w6 O需要说明的是TEA的构造函数: " j5 g2 [: `: x, \$ z# \4 `
TEA(const byte *key, int round = 32, bool isNetByte = false); 3 M+ b6 B8 ?/ M" t/ T2 j
1.key - 加密或解密用的128-bit(16byte)密钥。
% t3 z# c' X* i+ F2.round - 加密或解密的轮数,常用的有64,32,16。
1 T+ ]% j2 E& X3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 0 T( J) Q9 `4 F7 S) ]  j1 r

. ^: d2 H2 q: a3 `; D9 E8 I最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" # q; {& }7 S6 o; f( g
2 #include "util.h"
3 @4 l4 m, n  e1 r# I 3 #include <iostream> 4 B* O# N( n; y/ x  z
4  
9 U0 T* L1 O, @, G+ } 5 using namespace std; ( j; ^. `# ^) ]2 E& T- O
6  ! K+ d8 a1 ]8 `
7 int main() {
, U7 _6 r2 l+ ?7 ~8 \6 c: k. x 8  % }' P0 V% q5 R
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 9 S/ q# {8 N$ ?, F) m# U
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 8 n* {! ?$ f/ K2 e+ B
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
& E) [6 _* K3 K. o$ S12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; : g9 p( {% g! B# J2 K
13  : @; J0 E/ X; r+ r
14     size_t size_in = hexStringToBytes(plainStr, plain);
6 p  H$ A5 L" j) L; Y15     size_t size_key = hexStringToBytes(keyStr, key); 5 p. L: c! _. A3 X5 C6 c& d
16  : p- x4 Z& }, M6 H1 Z. @
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)   D" g+ Q  k  P; I1 ?
18         return -1;
1 m- ]0 q: j# `$ |. E! s19  7 R  g1 g  A2 b0 {/ P* Y2 U
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
- l# N2 S8 L; M) c8 W1 W* l0 W21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 2 p9 X. t5 P0 g* G& c
22  + F2 a5 X6 F3 P1 h0 N0 R
23     TEA tea(key, 16, true);
4 P9 `4 u6 i4 k0 E24     tea.encrypt(plain, crypt);
7 f& }3 N" V4 ?9 |7 G' k- Y/ |9 Z25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
3 m2 Y! W2 m; D26  
2 n' z, u* `) [: G0 ~27     tea.decrypt(crypt, plain); ( w% B( J0 M1 `7 i8 `* E+ K) C) }* K) U
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
/ w) I4 O; [' p7 G# E% `5 K29     return 0;
) i/ d: n# {3 M8 e& }6 S30 }
( w/ Q9 x, w$ a) w6 ~+ O9 f4 o
; r/ A) w) J2 ^5 L本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
7 k/ `+ P+ g: g( T运行结果: 3 }0 p  u9 v& [% X7 ^
Plain: AD DE E2 DB B3 E2 DB B3 ) R! T2 J3 J2 D3 v: x* e* |
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 2 t. w/ x# l. ?$ }6 b
Crypt: 3B 3B 4D 8C 24 3A FD F2
$ M% \2 X- ~% p0 OPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 19:59 , Processed in 0.023532 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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