找回密码
 注册
搜索
查看: 38830|回复: 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轮):0 m: ?. ]* E# ]8 V6 {5 `2 y3 o
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
. b, B* p8 G2 a+ R  ITEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 0 r. f( l/ O! q& ^8 r4 r0 c
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
/ `( `: ]  j3 `& |! `1 B在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 8 `7 w. C" w8 [7 W4 y
在 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. + M' X" A& A( q0 f
  2. void encrypt(unsigned long *v, unsigned long *k) { % I) `2 U3 t% m( ^
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    - D3 C; O. ?' |! V. a; q
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    + h. E2 b- b; I' X
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ : t# E" S$ h8 x8 S; U+ f
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ( M) J6 Q3 ^3 f8 ?
  7.          sum += delta; & j6 H* G& S! z& [/ D
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    - _8 P! O. T8 N5 v+ H6 ]: _
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ' \) o7 i! Q( Y# g
  10.      }
    ' ^: A' @6 [: p3 ?" q+ Z
  11.      v[0]=y;
    * i" _% o  C7 j5 T# q
  12.      v[1]=z; % r, J' P# M2 G9 Z! b) Z
  13. } 4 M7 ^  f( m4 G0 B+ o( W" i& x
  14.   5 U% I( H/ b3 W9 ^6 f, D2 c* p
  15. void decrypt(unsigned long *v, unsigned long *k) { ; @% q$ c, |5 q  e
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    6 N# b) {# X9 i6 m2 H! u1 C
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ' z) T3 Y/ D+ m8 |+ W2 A  }
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 0 \7 ]% |& Z3 n! J. N( X
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    - m8 k# z. a% ]0 J7 _
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    , @8 b9 y1 Z0 ?8 H
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ' s% }, u  Y5 e# A7 Y# O& h+ Y2 w: Y6 ~- D
  22.          sum -= delta;                                /* end cycle */ ' _$ Z8 z) x4 t9 V. ^
  23.      }
    1 {: g" y5 A; X) `. ]$ j" U
  24.      v[0]=y; 6 I( w# v  s6 E
  25.      v[1]=z; 1 {; ~5 x# y: @$ N6 P
  26. }
    2 A1 N* _# P% g+ k1 G  Y
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
; t: o! u. z& [' S#define UTIL_H
% ?6 @, V# n; T- R
8 w: |: g' s  |" y* w#include <string>
. v/ v" t& g- ?$ W5 d#include <cmath>
( ?, A& |5 K8 J( D#include <cstdlib> - C; s  n! m$ ~7 x# w  w

" L$ [# O0 \  L. ~; G( P  Wtypedef unsigned char byte; # g% L' J2 U  c, @/ m5 o. X$ k  `
typedef unsigned long ulong; 9 P& a9 ]8 S# }9 a6 t( U2 J

0 k, N4 ?& M. ]1 G. L0 Zinline double logbase(double base, double x) { . ^" `$ X3 W" K$ X- A0 _& k; x
    return log(x)/log(base);
" f& V9 B. z/ j2 }}
! Q6 `& P/ Y5 j1 K- e/ C9 [
* N- f* d* I( s+ U4 C$ R% B4 a* W/* - N7 \5 N* l; z3 F- U7 m
*convert int to hex char. * d2 e: Q- H5 @1 s
*example:10 -> 'A',15 -> 'F'
2 r4 }8 e% }2 ?+ g! b. z' l/ {  ~+ S*/
, A: g; }6 J0 K2 Schar intToHexChar(int x); 8 S1 a4 o' A. c  V' E. j9 f# `
2 w) Q/ D8 F( Q" {# \
/*
+ o- b9 S4 @7 v- R0 N& D9 u*convert hex char to int.
' g+ J3 G, B* f' ]) c" g*example:'A' -> 10,'F' -> 15 9 e3 k* B# m2 O! N% H' I
*/
7 e" v; l- C. ^4 E: Y6 b# k2 Fint hexCharToInt(char hex); , M" b3 @/ ]# I- q
4 e6 W: c" b- e) |6 U
using std::string;
4 S) I: b9 E) c! j4 v/*
2 t: C; `2 U$ w  ~2 I9 z% }/ F3 a# K*convert a byte array to hex string. , H& C( [/ K& x) b
*hex string format example:"AF B0 80 7D"
0 m& a: z7 \8 u( f( q# q  Q*/
% k1 |0 i0 Y/ H% @string bytesToHexString(const byte *in, size_t size); . e0 o8 R* B" Y" I

4 n" E5 O" B: U9 a) Y' [2 U6 V4 h/* 3 |' L" k4 H+ k
*convert a hex string to a byte array.
5 `9 x! o/ ]' L* p) `0 }- K*hex string format example:"AF B0 80 7D"
6 M' \% H6 R6 o+ n: h*/
, Q- k! c' A0 O) _$ lsize_t hexStringToBytes(const string &str, byte *out);
/ B; B  O- z: K# S& \- W- q4 X " H# r% f+ W4 y5 P
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" + p/ q- X! _9 J, U- N8 i' W
#include <vector>
  }% |- n& j% ^) \
  a* n- I6 l7 j- xusing namespace std; 5 f8 m0 }* |& r+ V1 m
1 e* d4 I' Z; O+ j, h! Q) q$ z5 K: a% l
char intToHexChar(int x) {
/ v7 T6 B  m$ E9 x- v3 h    static const char HEX[16] = {
6 ]' F) v6 }9 e5 P+ I& ?" O6 t! n        '0', '1', '2', '3', 6 X6 b: q5 [5 o: v4 S
        '4', '5', '6', '7', $ Q# C" R0 A* y- G$ d
        '8', '9', 'A', 'B',
+ M. _! ]3 @/ w% ]3 H3 ]2 r0 y        'C', 'D', 'E', 'F' 7 D# P! h2 ?5 b  ^( z" i% f( ?4 N
    };
& y" ~* S( e. [& l8 P! e# [7 r    return HEX[x]; 9 t8 I' C$ k6 u/ b
} 5 u$ j* g. n4 {& `9 e- ]
' S6 h' _" R: `
int hexCharToInt(char hex) {
( q/ ~  R4 p# j' z    hex = toupper(hex); 4 e9 @, Q$ w; d; M0 l1 Z
    if (isdigit(hex))
' U7 U" }" S. ]( a& a        return (hex - '0');
2 E- r$ w0 G! {( Y' [! V" k) i8 ]' P    if (isalpha(hex))   \  G& q' o" F5 C+ h# s
        return (hex - 'A' + 10);
/ C& v: @0 A( d* y7 \5 |    return 0;
! `1 J3 D  ?/ j# Y8 k, h+ B0 j} 3 y0 f7 W( T- q3 m: t
: L" x7 s4 o* H3 p4 g$ e8 ^) w
string bytesToHexString(const byte *in, size_t size) {
$ F; u! T& [. s3 X( t7 E- R    string str;
8 C+ i- I- ^: B0 l, X' {7 D! L$ F    for (size_t i = 0; i < size; ++i) { & I3 e& {( w4 v% [* ~% F. a  w
        int t = in[i]; : e5 J( j% C6 C' f$ ^: W
        int a = t / 16; ! \3 \6 Z8 n5 r1 Z4 ^  G# B
        int b = t % 16;
# C" f" N0 P8 o- H3 p+ N        str.append(1, intToHexChar(a)); 0 D6 L, Z, K* E8 [" l' V0 ^0 u
        str.append(1, intToHexChar(b));
4 J: I4 j  X: y/ }7 E        if (i != size - 1) 4 ~# B3 h& B8 P: A" \: B$ _
            str.append(1, ' ');
  o0 p  p$ d& r: A2 y    }
$ u; U/ A8 v- _, N- n    return str; * W. w: G- @/ u% w
} # B$ Z9 Q9 j  e
( N$ V6 a7 i' r1 l: E
size_t hexStringToBytes(const string &str, byte *out) {
+ {  I7 B: F2 R9 s3 K" K( J- }" l1 |2 f& f
) {' q6 \" @9 l1 [    vector<string> vec; 2 G! o$ r9 L4 S$ g+ H, L+ m/ L: P' u
    string::size_type currPos = 0, prevPos = 0; 7 k8 g& l6 {1 C; M
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
; t( h  n1 v" P, W- H        string b(str.substr(prevPos, currPos - prevPos)); " O$ f& ]. a" o2 P! Z" ]
        vec.push_back(b);
9 p4 e6 I+ q  y2 j4 ?1 b        prevPos = currPos + 1; ' s% g/ V9 P9 V8 Z; u/ X# g
    } 0 F- Y/ h3 ]2 V/ N$ N, k
    if (prevPos < str.size()) {
3 ^9 S1 G! L" b& r: F$ U' L( Y        string b(str.substr(prevPos)); 4 W# J( N  ~, P. G
        vec.push_back(b);   w! C5 X5 M# W1 U4 e
    } 0 i3 H3 U% T/ U. \1 o
    typedef vector<string>::size_type sz_type;
" R: @0 ^, V, o% M    sz_type size = vec.size();
8 o7 y2 J( K2 c) I' D' e    for (sz_type i = 0; i < size; ++i) {
- v6 o" a3 S. N1 c6 G9 w" d- i. g        int a = hexCharToInt(vec[i][0]);
1 B9 F1 c8 H1 I4 y( w        int b = hexCharToInt(vec[i][1]);
( {* @& @1 J6 j/ c8 |1 M3 R2 F# M4 M        out[i] = a * 16 + b;
3 J. k1 M0 Y0 }+ @! _8 v. L+ U8 o8 s    }
0 h/ w6 S! v( I1 ], u9 r2 H    return size; 6 x8 I+ s- _' ^0 Q. m, i
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H & K! [' q8 k0 X! _7 Y5 R' b6 i6 ]
#define TEA_H
  A# o+ T9 m- T# k
/ f  g1 v$ n3 z2 t4 h, \/* 7 y- |5 x' b" F  I/ h
*for htonl,htonl % \' H5 z8 k- X( V! e
*do remember link "ws2_32.lib"
4 w% u8 h  g3 }2 Z*/
, j  F% X4 O9 A8 G* \#include <winsock2.h>
2 O! r  |! t% g8 f7 q#include "util.h" 3 O# }" l8 g$ Q0 ^% E* m  v
3 r' [$ m9 g0 X3 b5 b- E
class TEA {
$ ~) o5 \  }0 [public: 2 U! k4 e1 `, M7 i4 K2 a
    TEA(const byte *key, int round = 32, bool isNetByte = false);
. \' W0 H0 `0 g+ s+ b& q. k    TEA(const TEA &rhs);
, N! o1 `% X7 V+ _6 m+ f8 F    TEA& operator=(const TEA &rhs); , h6 y5 h/ j  f; y* a
    void encrypt(const byte *in, byte *out);
! s3 y: v2 e, p: f9 M    void decrypt(const byte *in, byte *out); % z# F! r" K1 i5 T& v
private:
# [% |" g' N, B1 t% W: B) ~/ E0 g    void encrypt(const ulong *in, ulong *out);
& x7 m1 r5 v6 X% y0 @* B    void decrypt(const ulong *in, ulong *out); 7 s( N1 d, ?) [/ H' w  K6 n
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } ( D2 B6 P: S  }( V  M; N' ?
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
2 c6 G, k7 t5 m+ r  x; eprivate: 7 V$ ^" a5 Q  w- X
    int _round; //iteration round to encrypt or decrypt 6 `& ]6 l: I; Q( Y
    bool _isNetByte; //whether input bytes come from network 5 s' F7 c0 U8 h* A* \9 i  A2 V2 d
    byte _key[16]; //encrypt or decrypt key 6 J4 c$ M; t# h8 }2 N: l
};
. A! ~/ }6 T) H" A, ]  p 5 y7 w9 p/ [7 `4 T' P# w
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
) Y3 ]3 t  H% |$ P6 i( { 2 #include <cstring> //for memcpy,memset
  i9 U" j3 e5 R1 @+ }% ]. G 3  
6 [" L* F. F& Z5 s1 g 4 using namespace std;
8 e  w& M) p( x- U6 L" {# ^ 5  
" `0 A9 x, L8 E1 X7 C 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
  K9 y4 r4 \& Z, i- D; O 7 :_round(round)
  ~: |% E6 F/ T( t/ [ 8 ,_isNetByte(isNetByte) { 4 p. g1 E3 U4 l  A& `
9     if (key != 0)
; y7 o  b' y! F10         memcpy(_key, key, 16); ' H* T  }, s6 h! b4 O% \, M
11     else
- {) X( R& u2 l6 F12         memset(_key, 0, 16); ; @" C- `- E, p4 m& p% T* Z' Z
13 }
) c0 Z& c: R% y- T8 l+ }' f7 L14  . }* h) F, f2 D% u5 o5 c
15 TEA::TEA(const TEA &rhs)
6 Q- O( F6 r4 a4 T- D8 {  O5 j5 f16 :_round(rhs._round) * R/ g2 q" i/ J0 U
17 ,_isNetByte(rhs._isNetByte) {
3 a) r3 ^2 y4 ?18     memcpy(_key, rhs._key, 16);
# s- p0 [) V- j9 ?- ?" N19 } 8 f  _3 H4 b7 g0 P9 V
20  
1 ?0 i* m2 K! ?21 TEA& TEA::operator=(const TEA &rhs) {
5 P7 s& b* B1 k, J- `! _22     if (&rhs != this) { $ p8 N! T) W% {' E; B8 m
23         _round = rhs._round;
+ g" }8 v) b  B3 O7 n+ I- y" e24         _isNetByte = rhs._isNetByte;
2 E! a( \; [. J: H$ L25         memcpy(_key, rhs._key, 16);
" W+ U7 }! Q! r; y26     }
' D) K5 R5 p" l27     return *this;   {6 h6 Y- P. U1 ?/ F$ c
28 }
9 i4 H1 b# S4 u1 S29    @7 [+ B, n" b
30 void TEA::encrypt(const byte *in, byte *out) { * Y! ]# D% Y1 ^7 d0 v$ }
31     encrypt((const ulong*)in, (ulong*)out); + c* O% s/ ~7 q7 ?7 \2 U4 ]
32 }
) J9 a9 [# ]2 I7 C* c6 e33  
# k4 F. `( j3 J: k* k% S34 void TEA::decrypt(const byte *in, byte *out) {
+ Q# W# p% q6 m) e# m) q35     decrypt((const ulong*)in, (ulong*)out); 4 ~" U' J% M+ t* ]! K# F7 V* T- N
36 }
  }7 [' @& d/ G- ]5 _: V, i1 m1 g) {37  8 p1 Q  i1 p+ k0 U. I* P
38 void TEA::encrypt(const ulong *in, ulong *out) { + Y; y+ E' Q; i  b4 {
39  
- w6 v0 Y4 f; \. F; o. T- v- y, J7 Z0 Y40     ulong *k = (ulong*)_key; + x$ d' i; g/ n5 }- a$ R+ Z
41     register ulong y = ntoh(in[0]);
' O) i+ Q. w" x4 O+ ?42     register ulong z = ntoh(in[1]); " r0 O( d. z* R: L% W
43     register ulong a = ntoh(k[0]);   }3 R+ ?/ }7 o/ J' o
44     register ulong b = ntoh(k[1]); 4 R! J8 p0 [& x6 o( q  g. p- S& E
45     register ulong c = ntoh(k[2]);
' N2 }+ J+ k; A/ k) h  k46     register ulong d = ntoh(k[3]);
+ n  g) G8 Y5 h" J5 ~" P- t47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 3 h/ I% ~& G/ ~5 c- w
48     register int round = _round; * N1 l+ e3 D9 C' Y
49     register ulong sum = 0; 1 J; v% w1 a  S$ g! d4 Z9 _9 W. F
50  
' K( Q; W) Q5 y/ {' }51     while (round--) {    /* basic cycle start */
# X* |; |6 y/ X$ Z$ G/ P52         sum += delta; + {2 D& J/ u4 H- O" L0 C0 V  U3 G
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
$ R7 H' L6 t3 r$ A* p" ^( G54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); # c6 m( Z% L# Q6 \- r) _
55     }    /* end cycle */ 0 g2 g- Y! a* L1 `% }  {' j$ N
56     out[0] = ntoh(y);
; m. X( G9 l6 k- h4 W57     out[1] = ntoh(z);
$ y3 ~9 w# t7 }) @8 `$ O2 I# O58 }
$ K. j( V! z4 c. y% {" u59  * L* F7 h! U+ _) z: E6 ]+ `, {" u
60 void TEA::decrypt(const ulong *in, ulong *out) { 0 F6 K7 S  m* J# T% w) y9 \
61  5 G3 S' G  G1 J2 N( e
62     ulong *k = (ulong*)_key;
3 o) l( T9 {* R) [. b63     register ulong y = ntoh(in[0]);
; S. j+ ^7 \5 X" F64     register ulong z = ntoh(in[1]); / _( |* a" B. ^0 r. {) G
65     register ulong a = ntoh(k[0]);
7 ]/ C, w1 ^( r7 j! o) I) ?7 l0 v66     register ulong b = ntoh(k[1]);
& @% X# y# o9 o+ I- y/ G7 I' }- w- Z67     register ulong c = ntoh(k[2]);
! `& }; Q, V: k1 }# Q4 B0 K68     register ulong d = ntoh(k[3]);
# H5 j" y; x! W$ S4 Z1 @8 B" B4 L69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
8 j9 N) O2 {9 e1 q) O70     register int round = _round;
/ q' V1 A" X  S( g7 Q71     register ulong sum = 0;
7 H# b! o9 Z  z' P7 R" ~, d2 `1 I3 ?72  3 f/ l, U+ ?; M; I% P
73     if (round == 32)
( C' {/ H' [8 L, v& o0 Z74         sum = 0xC6EF3720; /* delta << 5*/ 9 G% k+ H  X$ ^% }7 a: y' }# s! l
75     else if (round == 16)
' C; y7 i. s  _! @; p76         sum = 0xE3779B90; /* delta << 4*/ ( A2 |+ {8 V: B6 y0 U8 H
77     else
6 \3 j* h1 j  R; }; d) ^9 z78         sum = delta << static_cast<int>(logbase(2, round)); . y/ A0 x. Q4 V2 `: _6 u
79  9 ?  l$ x: R7 l! Z5 d3 a
80     while (round--) {    /* basic cycle start */
# E/ a- c/ q6 [1 Z* R) u8 k! L' r81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); + o7 m+ K1 Q4 X# z# P3 x( Z! z
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ) \% {' F: L+ F3 q1 s' J2 ]
83         sum -= delta;
& V8 W3 \) }+ A) ]& k& T' A84     }    /* end cycle */
0 J! _: A# Y% X% Q: L1 g85     out[0] = ntoh(y); * O: j" h% G) S
86     out[1] = ntoh(z); ( P. C4 f, }4 h/ J% z
87 }
# ~) p; J7 P0 K, a3 Q4 ^) w$ P8 g+ k; g. S
需要说明的是TEA的构造函数: & @5 u1 i9 V, w9 i( B
TEA(const byte *key, int round = 32, bool isNetByte = false); % A! P/ ]8 o  B% k
1.key - 加密或解密用的128-bit(16byte)密钥。 , d( R1 D4 u* F! o/ r+ R7 @
2.round - 加密或解密的轮数,常用的有64,32,16。 5 i3 s& O( N; A$ w, O8 ?
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ( r- ?; V+ E/ i9 ~
& x( D: k! _+ F9 d
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 6 ~7 g/ @$ K: k
2 #include "util.h"
- d% w  U# Z2 n& {8 C/ L) r 3 #include <iostream>
: P) p! j/ w2 m0 ~ 4  , O# A/ J6 F9 o( p! S% t3 e
5 using namespace std;
7 P9 q6 q: n! J! Z 6  
! R1 E3 o* l' l9 p  R 7 int main() {
+ O+ n- o6 t5 t: k) p 8  
% d% j' ~$ T( M9 |7 v 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
, f, ]& F1 X  G6 a# j10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
' h/ D4 I) y" y( H' F11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
- }. D, m9 @9 b8 O- \% [  a* O4 Y12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ! O+ H8 [) V1 m/ h
13  
- z) F6 x1 m5 B& S% K0 l14     size_t size_in = hexStringToBytes(plainStr, plain); 1 v( Z7 o$ [8 M; N8 {
15     size_t size_key = hexStringToBytes(keyStr, key);
3 t. k8 r5 v9 _! c+ @16  
# ?% A: \1 @) c" Z) P8 r17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
' o9 s4 S8 @8 O1 G18         return -1;
- e1 U" E( T; f; n1 {19  
# A6 _! n2 Y' n20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
! V9 A8 h+ T& I+ Z) I& q21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 9 G2 Z( ?8 w( F7 L
22  7 k& P& `$ J) i4 G1 t
23     TEA tea(key, 16, true);
# t- t5 |( M- w; n5 p0 m, z24     tea.encrypt(plain, crypt);
* Z4 {7 G0 B( P3 ^/ K4 o" R6 e' n% g25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
" J/ W# O+ b) L5 y' _% D$ q' y26  ! Q2 Z$ _& j0 s2 I7 p
27     tea.decrypt(crypt, plain); , \2 @# e$ O+ i9 ?* O$ F
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 4 G! U1 v; B8 a4 C# V% V
29     return 0; 9 _7 h" X  M* E! v, P2 z
30 }
8 y( T  K7 _5 a- Z8 P- r1 \4 n$ @3 \; H
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
' [) E, i; j: e  v& s- C5 l& T6 I/ V运行结果:
8 {/ R2 X6 Z1 d$ U5 w4 RPlain: AD DE E2 DB B3 E2 DB B3 ) H+ a) B) L. \7 l8 }* F4 }& l6 o
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 " i3 @: C: G5 S2 r4 w+ }/ o# S
Crypt: 3B 3B 4D 8C 24 3A FD F2 ) {7 Y8 T0 b! M5 S) u
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 23:40 , Processed in 0.020538 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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