找回密码
 注册
搜索
查看: 37318|回复: 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轮):5 G: w5 U9 K+ Q4 T) `5 Q
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
6 M. k8 H4 _5 g8 {% ITEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ; n8 q4 I* ~5 a: A9 K' o! |
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
1 c+ H. |1 E+ N" M. q在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
+ X/ ~5 S4 B( J  v- e/ g* 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. * E* ]3 U: q8 A4 Z7 ?7 t
  2. void encrypt(unsigned long *v, unsigned long *k) { ' m9 {3 {/ d" t' }8 }8 Y# a+ \
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ : D  l0 ]3 Y" E- O, ]+ M# E  g  v; z
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ - A% Q4 j+ Q& I3 u
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ / K) I6 v, M  E- a' ^$ h1 Z
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ . n6 U+ {" I% p5 T5 [' Q
  7.          sum += delta;
      J, R1 q+ {. G$ {2 k
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    % s* z- k0 W& C
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 3 D4 z4 E8 i4 |! p- T
  10.      } 5 ?# J1 b/ U" f/ G
  11.      v[0]=y;
    6 _# e, p5 T$ c- L- B  ?
  12.      v[1]=z; 0 @5 I( j7 h* ~# i' Q2 g/ k1 X4 S
  13. } 9 R/ q. y3 f1 e" X
  14.   
    ) L+ }/ l% {- p1 _6 C5 J& z
  15. void decrypt(unsigned long *v, unsigned long *k) { 9 O. A# l0 B' {5 w
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) j1 S- f. O9 v+ ]
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    6 l6 g* B" K( U6 N, f( Q! v
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ : h7 J; {6 z! W2 V( \* E
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    % M9 {$ I$ z: s8 e+ Z0 ~
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 2 P* z! L" j/ B7 n
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    * `$ `$ r& _+ G8 M) J7 r8 d/ G  m
  22.          sum -= delta;                                /* end cycle */
    # p9 W- C8 s) X6 w1 K9 f: |
  23.      } 2 p0 c0 Z( P- J) x
  24.      v[0]=y;
    # `1 z* k8 T4 A
  25.      v[1]=z;
    # i6 z! d1 h; T
  26. }
      Z  |9 ]9 m  z% y
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 1 V# N) W& n3 k7 H0 ?
#define UTIL_H
; E6 {) f  q9 G; @# D6 K5 ^: F
8 }" u' T0 B/ U# L  }& ~#include <string>
2 C5 C6 `: O( a% O- d: g#include <cmath>
7 h' F/ ~( i5 a* V#include <cstdlib>
# s& i% Q& U; u" N ; g& f( l2 H7 X! g
typedef unsigned char byte;
8 }' E; |  ^# W, w6 E" otypedef unsigned long ulong; 2 n5 a) E9 T! ]5 y

7 ]5 u; e/ R) S! O# m$ C+ Q3 q$ hinline double logbase(double base, double x) {
: B; V0 M0 {% _    return log(x)/log(base);
* Z  B5 v; F9 T; d; U% _' q} , r, w( x. b2 l% @  a/ X% f

1 p9 |( x7 w6 G" D/* ! _+ e2 q: J4 M/ k& ?0 F0 G5 v" e
*convert int to hex char.
; r# u% j6 s) J( n' q3 N! c5 I5 ?*example:10 -> 'A',15 -> 'F' # n/ R. D! P) H' o3 m
*/ % h4 Q7 s; G( S1 \8 F3 M
char intToHexChar(int x);
" b- R/ e5 S: n  L) O8 O( }: @' v
5 l/ j1 t" J1 i4 I' J3 _' l: k/* 2 v- w* ]! B  z1 o% b0 u
*convert hex char to int. . e! o$ g# S; O% b$ }" e! a
*example:'A' -> 10,'F' -> 15
/ s' |1 w6 B) Y: ~*/ ! H: N& e# K) \# l9 i
int hexCharToInt(char hex); % O( K: u, D2 \  w

- v+ E' A% I0 Z8 w2 k# H1 Fusing std::string; & ?" q8 k# Q) F8 J  e
/*
) n" Z* A: Z7 c& G% u& ?7 K*convert a byte array to hex string. : X' e2 V/ E, Z5 O  ]
*hex string format example:"AF B0 80 7D" 9 D& _' G6 Q" i; [
*/
2 h1 x) u. L( J" I- Wstring bytesToHexString(const byte *in, size_t size);
7 z4 {" j( Q* x* W* c5 T
, M# y% P: G; b! A$ L/*
' l6 P4 U, v, }$ q3 W*convert a hex string to a byte array.
! O$ G9 G% f1 r: W5 t2 n*hex string format example:"AF B0 80 7D" : K$ B9 B& e- I( L  N
*/ , {* b8 ~: Y2 o0 ~
size_t hexStringToBytes(const string &str, byte *out); $ y- H$ U$ ]. z5 K% j$ ]: }$ @" {

& ]6 r! t, U: S8 r  o- N#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" & H9 j2 C: {: r  v0 S% h
#include <vector>
3 w& W$ {- k( y3 m& m7 k; f$ v - D9 B# a5 T" l5 p% ]; M, d4 K
using namespace std; 8 X3 T/ h- ]2 k9 Q% u+ I: _- o% J! T5 o1 F

" M$ K" Y* [( S" {0 o( zchar intToHexChar(int x) {
: O5 N8 s1 h9 v% U% a    static const char HEX[16] = {
% q6 [8 _2 Y) i: f        '0', '1', '2', '3', : w  ?$ a/ P+ l9 Z" U0 `& {
        '4', '5', '6', '7', 1 V% B" y  ^* ?2 }5 i9 |  k7 ?& S! o
        '8', '9', 'A', 'B',
1 w! h/ A- a9 D, }& e        'C', 'D', 'E', 'F'
4 V+ R% E. x* J    }; 7 ?( y  j1 y  C& A$ p: t
    return HEX[x];
% n' W5 I3 M; h' {}
5 b% E/ {7 {- i7 d- r% o8 U
. E9 C% ?5 Z! U( K. w7 Dint hexCharToInt(char hex) { ( l! U4 F; [6 A
    hex = toupper(hex);
& L% X$ ?; g1 K6 P: ?! T1 C$ F    if (isdigit(hex))
  @( A3 {, j4 `1 ~. E( t0 w/ o5 E        return (hex - '0');
2 n0 g0 q5 o9 G& M# W, E2 A5 _6 G4 ]    if (isalpha(hex))
# i) e$ T6 k; V- \( D, G& m        return (hex - 'A' + 10);
  P( |& V3 G* Z' E9 d0 S# z9 c    return 0; , q& G$ x! L" h0 A# T2 x+ A3 N( B
}
( q" @2 i+ U1 L; b6 N6 M$ A
0 @, m& [! B0 A- pstring bytesToHexString(const byte *in, size_t size) {
& Y4 r! {- g6 o. e0 a6 O; O: b( \    string str; + ]. q' g6 ~9 S, w0 V- X
    for (size_t i = 0; i < size; ++i) {
0 c, H; e1 W- T9 \        int t = in[i]; 5 L: h* s0 ^% F& G, h! [& U
        int a = t / 16; ) H; i; a* x" I6 J, \0 b) l3 J
        int b = t % 16; # t9 g: Q  y: g
        str.append(1, intToHexChar(a)); # o: @! z$ ?' d1 J; d/ k4 Y3 x. g, g$ p' |
        str.append(1, intToHexChar(b));
# p& O$ ^8 e  s2 d* A) K7 R        if (i != size - 1)
0 J" W! V/ B! ?; S- V' g, w            str.append(1, ' '); 9 L# s# j* y; P) W; W. k
    }
, v: [+ i: e2 i+ J1 S; c8 L2 W' l8 X# l    return str; / B! u" i' A, F
}
  I0 p8 D" [0 A$ e8 P1 ^
( P: t3 E' Z8 L- D4 q/ bsize_t hexStringToBytes(const string &str, byte *out) {
* T. E2 B: k5 S6 V1 g
. B% w' e  s3 T; S- A8 w    vector<string> vec; 6 Z! e/ C% N# M# ?
    string::size_type currPos = 0, prevPos = 0;
$ O( j; u7 J- _8 n$ R    while ((currPos = str.find(' ', prevPos)) != string::npos) {
9 {) {( ~; j5 s6 u' Z2 o/ a, O        string b(str.substr(prevPos, currPos - prevPos)); % U1 t( S3 B" e! _
        vec.push_back(b); ' }. ~6 ?5 F/ P9 b! v
        prevPos = currPos + 1;
/ o) h5 r* k1 r/ A: k$ H7 c& Q    }
6 Y( v* v7 o  ^; X+ h, V    if (prevPos < str.size()) {
* B3 G( s) Q. i3 T        string b(str.substr(prevPos)); 2 ?1 B. }/ x  d) x% O
        vec.push_back(b);
/ q# J0 k% I1 c( u: c( r! d& ^* B    } 3 V! P$ j. k8 l/ i8 F' S* b
    typedef vector<string>::size_type sz_type; 3 l5 l3 w: ^7 \* W9 m/ _2 ]. I
    sz_type size = vec.size();
0 N/ E0 V* x) I% f$ C    for (sz_type i = 0; i < size; ++i) { & X5 ^( S$ J9 k) a/ `6 D- J
        int a = hexCharToInt(vec[i][0]);
/ X  y& H" c+ p6 ]9 E) ~        int b = hexCharToInt(vec[i][1]);
5 Y- K* C! k1 E3 ^        out[i] = a * 16 + b; ( `5 }7 _. ~1 `! z; H# `* L
    }
' Q3 j8 ]$ M( f- T9 i, O/ W% J9 J    return size;
% d" U8 ?  R$ B7 _, p- S! g0 ~}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
+ l' o: f  i2 {2 V#define TEA_H 4 @9 ?3 d2 [+ K8 W: y  ~% O2 l; K

! E0 M* `5 w  D1 k! T/*
5 @6 E3 |: a  ~. _*for htonl,htonl ; i4 {5 J, K1 ?5 e/ S7 e
*do remember link "ws2_32.lib"
! h1 p! r3 O4 R9 H*/ ) @' s% s& L; V3 n" g, I8 ^
#include <winsock2.h>
: g& I7 H1 @5 r9 u8 y#include "util.h"
/ ~6 i8 B: R/ s9 T * Q) Q" h0 E2 n4 k, B6 L% R* x3 ]" I% `
class TEA { 9 |, d  @, V+ J. B9 H4 |
public:
5 z  E: H# S0 P& F: B- P+ s8 C7 N    TEA(const byte *key, int round = 32, bool isNetByte = false); ( V! D; E- V9 Q  i
    TEA(const TEA &rhs); . s& }5 X1 q% Z" J' D9 I8 V/ M6 Q
    TEA& operator=(const TEA &rhs); , Z& p6 @9 N8 h
    void encrypt(const byte *in, byte *out); ) J, Z( z& p- o1 A
    void decrypt(const byte *in, byte *out); ) A+ q: ~$ `: j; a) i& {
private: / d% l0 i/ @. }+ n4 q& N8 @
    void encrypt(const ulong *in, ulong *out); $ ?  ]( i) x8 S
    void decrypt(const ulong *in, ulong *out);
- ^7 S0 y" U: A% ?+ w8 [0 F+ B    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } & a" m8 p3 w7 o5 Z& E! u6 ?# y
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } - G) S- l; f& k( b7 O5 g$ \: {
private: " A% L( N( F# O
    int _round; //iteration round to encrypt or decrypt " N3 Y: H- N" Q) W
    bool _isNetByte; //whether input bytes come from network 4 ~, o5 A/ g1 O" F4 t* E1 h0 ^
    byte _key[16]; //encrypt or decrypt key
$ z  o$ J$ L; B- V}; % L' d$ }) Y' y. _; }

/ p% w* v9 p4 l4 \& J2 v$ _; z#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 2 D; W7 z/ W( w5 l
2 #include <cstring> //for memcpy,memset
4 f7 d. E( f* H+ w6 N5 l 3  1 W$ `6 |9 `& w
4 using namespace std; . I; T0 d* N1 b
5  ! w+ B! a8 [) [4 H. H, _0 G0 Y# q
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
" q4 x/ Y. X4 Z1 Y* p 7 :_round(round)
0 s2 {4 b1 f* C6 ?1 T% y 8 ,_isNetByte(isNetByte) {
% T0 r+ a0 T3 F& t# A7 ?1 L. Z. p 9     if (key != 0)
* t: S6 W3 Z, n( |  m10         memcpy(_key, key, 16);
& s# E" l6 p' A0 @2 V! `  O; n$ w; }11     else / d( j0 G( a' P$ _
12         memset(_key, 0, 16);
% x7 n6 c$ E, ^/ A/ ^8 f13 } ( \& i$ A) M) H( v4 K
14  
! h; D3 [8 h4 W  D8 a2 H% W8 p9 a15 TEA::TEA(const TEA &rhs) " ^' R/ \6 z! Q% B1 [  n( g4 T/ H4 d4 \
16 :_round(rhs._round) $ Z/ j- O2 X3 i0 |  F5 S5 n
17 ,_isNetByte(rhs._isNetByte) {
' ]. M0 v/ ~" S9 N" Y18     memcpy(_key, rhs._key, 16); : _3 Z/ _0 q' U1 j% v" n  ?
19 } / p2 H5 l$ n" ?- R. c7 y8 s, x
20  , ^) i/ W# G4 J9 c/ @5 \
21 TEA& TEA::operator=(const TEA &rhs) { & M. k  S# ~) s/ G$ \& ?
22     if (&rhs != this) { ' r* ]' t6 N* c$ X. h
23         _round = rhs._round;
  v- I1 ]" i  a$ d6 N* h24         _isNetByte = rhs._isNetByte;
; e9 E; h( \2 z5 L1 a6 `% l3 p8 K25         memcpy(_key, rhs._key, 16); , r: [: t8 \: B6 o! w# o' `3 g
26     } $ {4 y4 y/ d$ {3 y% F8 L
27     return *this; ! Y6 b4 G- Q" D5 I- m1 Z8 I
28 }
0 u, i: s% h+ i1 D5 y; Y2 w1 s0 i29  
* c. ?4 m! T3 {% V2 c- Z30 void TEA::encrypt(const byte *in, byte *out) { 0 \. P7 O: z8 @/ g2 Y" C, f
31     encrypt((const ulong*)in, (ulong*)out); 1 d* L8 p; q7 P8 y6 k
32 } $ O; w- J3 r6 Q9 r/ n$ T
33  
. M/ @' Y0 o. p1 @0 v34 void TEA::decrypt(const byte *in, byte *out) {
( L9 M" X+ u. g6 l7 r+ z35     decrypt((const ulong*)in, (ulong*)out);
1 A6 R+ w' Q; O6 M2 I* p36 }
( E3 G& k0 \6 A& s37  
$ B! B! U4 s* }38 void TEA::encrypt(const ulong *in, ulong *out) {
! J  ~6 d0 l: B" ^39  4 f, f! ~1 w3 W6 r# V
40     ulong *k = (ulong*)_key; 8 g: t5 U3 |. F
41     register ulong y = ntoh(in[0]); * I8 G3 p  F& V) f6 m* b9 [
42     register ulong z = ntoh(in[1]); - B$ B: f5 o5 r6 @8 q9 }
43     register ulong a = ntoh(k[0]); / g  `8 Z- C: G5 z# G* r$ H
44     register ulong b = ntoh(k[1]);
1 g$ ~$ `# _& ?3 y- O45     register ulong c = ntoh(k[2]);
3 ]/ k# r6 v/ D0 R46     register ulong d = ntoh(k[3]);
" J- f+ q' F0 X  l, H6 O47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ + f# u4 f1 Q/ {" r3 u, X, L
48     register int round = _round;
5 V6 D+ c" l) X49     register ulong sum = 0;
' h& L9 O* ?+ |7 f% R50  
% A8 L8 d5 A8 Y  I/ o( u51     while (round--) {    /* basic cycle start */ ( T7 ]( f4 @% s2 f
52         sum += delta;
% s' a/ j5 e; }" \) I' {53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); . \' c% F) d2 p/ k& _
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ) K4 R$ s2 P- M' c
55     }    /* end cycle */
& e0 g( J8 i# n& H, L) T56     out[0] = ntoh(y); 7 [' s1 v+ f- O/ `
57     out[1] = ntoh(z); . ~& n! }& ]" l  d
58 } 5 Y7 x: h8 n* K$ m9 P
59  # ^. G/ Z2 A9 k
60 void TEA::decrypt(const ulong *in, ulong *out) {
# L) K* M& c5 q, ^) D. H; C61  
; f, |8 v9 ^% q# }3 r) N4 H+ K62     ulong *k = (ulong*)_key; " ~3 e4 `1 d- Y9 Y4 z: P
63     register ulong y = ntoh(in[0]);
- `& e( c1 j$ ?3 [: k/ [  n7 q64     register ulong z = ntoh(in[1]);
1 b& R- W8 K  h" D: c% H0 A65     register ulong a = ntoh(k[0]); / Z, q1 t+ N/ D- B9 }
66     register ulong b = ntoh(k[1]);
& F3 S6 R) C8 c! j. [67     register ulong c = ntoh(k[2]); + j) J" t& y4 N$ A' j- X
68     register ulong d = ntoh(k[3]);
( c/ y2 O9 W5 A7 f69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & V4 W  o' r6 f
70     register int round = _round;
. i4 F0 R4 z2 b$ ]% X) \! @71     register ulong sum = 0;
0 Z4 S, C6 }1 d7 U. p+ J8 ~72  5 T( b5 w5 T3 J2 {
73     if (round == 32)
9 z2 m7 o$ l: i9 e6 A74         sum = 0xC6EF3720; /* delta << 5*/
+ ^5 Y! w# k: R( ^4 m( W9 L% P/ {75     else if (round == 16) 5 p4 C, h3 Q& o0 m, r, R
76         sum = 0xE3779B90; /* delta << 4*/ : _5 w' K: L4 z1 ?% ~
77     else
- ^3 u- v( |# H0 i( r4 O, S" H* B78         sum = delta << static_cast<int>(logbase(2, round)); % {- D( A% B) y- A( C: `# U
79  
7 L" ^$ m! M0 T* g  @- \5 q6 J80     while (round--) {    /* basic cycle start */ * X( G7 P- [& H3 B- o
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);   j' Y! e. U" E( T* j. K6 V
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); # ~5 o, q1 o1 e5 H. j
83         sum -= delta;   Q* R6 Z4 d4 g, m) t; X' k6 }
84     }    /* end cycle */
7 r& i: A1 C  a1 Z* F85     out[0] = ntoh(y); ( S! @4 `% ]2 L  Q  {
86     out[1] = ntoh(z);
3 ?% n% M- E3 t, O  C. p87 }: d5 p/ q$ Q2 ^$ p; t9 z

* L& d. Y8 o: D" a* E- P3 I需要说明的是TEA的构造函数: # ~$ _% f/ y! K
TEA(const byte *key, int round = 32, bool isNetByte = false); 0 Q! i4 `( O1 |& z- G
1.key - 加密或解密用的128-bit(16byte)密钥。
1 Y3 W; M7 y+ i+ W, \5 L" l" z! P1 ^+ J2.round - 加密或解密的轮数,常用的有64,32,16。
6 l9 I# n: `9 z3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
5 o$ M) `+ _) ?
+ M) q+ @* j( R) A: i! |2 l最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 6 Y7 O' {3 M* j  j6 o% J2 A
2 #include "util.h"
* a& v% `: d" r3 I 3 #include <iostream>
/ b: ]# F6 Z* B( C 4  
1 x) Q. U0 r7 q; F2 ~  ]! } 5 using namespace std;
3 N9 D( I( m7 q% u& U4 l3 l& A& M 6  ( b3 ]3 Z- `! _5 i' q& _' M  [
7 int main() {
0 L: o0 v: a7 B- F 8  " C' V/ p' p# T! @* N4 ]+ n
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 8 C, ~( m6 H  |8 z# s$ P9 c$ O9 t
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 4 N. r* u6 c* _8 P' k
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
" c( U( I: h! x+ ~1 a5 O) v3 n7 I12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
0 r4 v% u! j7 `- E" g13  
! e: [& m5 v$ V7 z" j9 w14     size_t size_in = hexStringToBytes(plainStr, plain); 9 B7 |5 p0 N: o' B6 E
15     size_t size_key = hexStringToBytes(keyStr, key);
+ d+ [# Z, V9 N* L% J3 ~16  * c# T- e5 h" h; A8 y0 e/ p
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) * {( H; Y" y% M6 |1 h" w* V
18         return -1;
1 U" F: N3 T; Q. f3 X7 m2 g, `19  ! F. |" c+ J2 W3 e
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
* o* z2 `1 M. P- H" e5 c0 |9 d0 p21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 4 C9 o, k9 H6 R3 [  v: S! o
22  / x8 v. N* i  K7 m
23     TEA tea(key, 16, true); + g6 D) f- w) A4 s
24     tea.encrypt(plain, crypt); % }1 n/ L- |+ M% ^& I% I* R+ k
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; # X: Z: u9 a  G4 W& o! _+ t9 g
26  6 F" E% o2 H- `& o) |: T
27     tea.decrypt(crypt, plain);
1 F  k  j; ~; b2 ?' ^28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ; }2 @+ f* [8 z: w
29     return 0;
* `9 a4 h$ E$ B  d5 ~3 H  e" [! F! u30 }
3 j- k, v( ]" E  _, J
: f% i' p( P( A4 Z  a7 H本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
) c3 g* R  e$ _( n6 ~/ k# v5 H7 X/ e运行结果:
9 q) d4 p9 N9 K2 z' z3 T* ?Plain: AD DE E2 DB B3 E2 DB B3 ' t- ]2 d- U) ?& F
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
( ^  Q( f4 A5 P  [' e6 jCrypt: 3B 3B 4D 8C 24 3A FD F2
$ x/ g, J5 M4 e$ Z2 }# Y; NPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 08:12 , Processed in 0.018631 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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