找回密码
 注册
搜索
查看: 36623|回复: 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轮):
* f6 D# N; J+ h, V' D微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 6 a+ E  m8 R% G# @
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
' C  Q' N5 z7 X& L# m4 T! p3 x4 d之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
# ?/ k+ n* w# E  C# r: o$ j在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 / H. V6 Q# Q- A* ?. @
在 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. 6 p1 [2 W) W& Z" w1 P; }
  2. void encrypt(unsigned long *v, unsigned long *k) {
    8 \( P/ F+ {. ^, T
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ # o( T& l& w- V3 {9 b$ x" W- i
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ # h* H8 Q7 T: p/ k4 t8 o& }; u+ M
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    2 U) {0 {0 M2 q" ]  z
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ $ y, X+ `: L) {7 C* V
  7.          sum += delta; $ S8 h( m" S' U" H
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);   K$ ]: ~2 [5 X
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    8 `3 h* ~/ q! \; ^+ G4 i) p
  10.      }
    . v( W8 g  M5 ^( a
  11.      v[0]=y;
    $ x' l. k4 p- P: ?' ]- O
  12.      v[1]=z; % q) _# V/ R! y
  13. }
    " Q! _8 c6 ^4 L6 l2 a& s9 ?
  14.   5 u4 A' x  Z7 s+ E  O
  15. void decrypt(unsigned long *v, unsigned long *k) {
    1 r2 m* |; y+ D! z8 U" B! d% `
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    3 O! S4 C' g# E) v# F1 Y
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ , L2 X; N+ N$ S2 V
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ * f7 ~; }% H; j8 E) Z: v  c) f
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ % s; c  T% d! m  f
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 2 |0 {2 I8 T' v3 F- {2 A
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    + [" @* c  u2 J0 {7 S
  22.          sum -= delta;                                /* end cycle */
    : M' P. U( V5 x, `
  23.      }
    % p/ @9 Q/ `) T7 X( G! ?
  24.      v[0]=y;
    4 L  M2 }9 u7 x. G( b
  25.      v[1]=z;
    : @" `6 B4 @$ |9 F% f$ S2 m
  26. }
    ; a5 j5 z% E" y7 R! A
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
* t, x7 c7 ]( j, |8 b#define UTIL_H ! @4 w* H, g! _: G

/ ^/ V6 _) l1 \5 ]4 }" v#include <string>
+ t% F6 _% p  X& M: \, q- y3 m! H#include <cmath> ( ~' u1 d6 \0 y7 m
#include <cstdlib>
; r$ v$ S2 ]! O: ?7 a9 y ; I3 G9 ~4 d8 @# w. ?% v
typedef unsigned char byte;
% W0 F' D& H2 w3 d- H; ~6 ytypedef unsigned long ulong; + k. U- p8 `* _3 k% F8 J

5 E) P* p6 H* n4 j+ iinline double logbase(double base, double x) { + D7 E/ B& T. v% b
    return log(x)/log(base); 5 u$ ~. W6 Z3 |" e
} # m1 x8 N/ `& W3 y9 V& E
6 ~0 _) b9 N0 X/ }$ N
/*
  h+ k- V( a  |! q: p*convert int to hex char.
) J$ u1 i3 b: D6 T6 C*example:10 -> 'A',15 -> 'F' 0 X6 P& V6 [! b; P
*/ ) u" Q" J  J4 s! m) ~9 A
char intToHexChar(int x);
9 p6 p: }, z: e; U  g 2 H5 K; q8 n0 }4 p
/*
- d! x6 ^9 n' M* }. u*convert hex char to int. ! v% I$ [9 ]! [+ P
*example:'A' -> 10,'F' -> 15
4 e' j% C' H# V8 s, h% S- l3 g*/ ; S( h( y/ A# Y6 r6 I; U0 z
int hexCharToInt(char hex); ! O6 I/ [* @$ o& T2 v8 p

& t* b( k* U6 d* p  Nusing std::string; ( P; x$ M- ~9 B- J) p0 _' f2 @! L
/*
2 k* a  F* K, i0 e+ y9 A9 D) X*convert a byte array to hex string.
$ S* D; J) v( \) T% C4 t& S1 U*hex string format example:"AF B0 80 7D"
  _3 u" x1 L- P( d9 n*/
. T$ p$ c9 G  u, {+ k# \" `string bytesToHexString(const byte *in, size_t size); , R- J7 ~7 t0 R$ `" o1 V* O

. X6 s/ `* g# U, @3 n/*   A) c  U0 Q6 Z( X: r& b* u
*convert a hex string to a byte array. 1 \  v4 W1 P# F/ V# N$ r/ @$ ?) G: J
*hex string format example:"AF B0 80 7D" 1 M0 Z# h$ a7 m6 Y+ u$ C6 E
*/
$ |& ?9 u* n/ b; o: }) h7 esize_t hexStringToBytes(const string &str, byte *out);
( R2 N* }/ w$ O8 Y" V
( `" Q$ ^# z0 E" {#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" + ~7 \& P2 c# F
#include <vector> ! s0 }$ Y3 H; f: _
. q. f9 Q9 A* E- y. S
using namespace std; ) o  I$ a' s* m$ p" D* y: L4 i: d

: q3 }5 ~$ N6 [" R* Cchar intToHexChar(int x) {
7 R" B/ L; U! s  H' H# _+ e    static const char HEX[16] = {
' I/ i, y7 Q# F: E( {        '0', '1', '2', '3',
6 r7 j+ Y5 M8 ], R        '4', '5', '6', '7',
* y% r- c# H4 V& Y, ]2 @: A        '8', '9', 'A', 'B',
: o" F4 i9 N0 s3 `, U: A. }6 b        'C', 'D', 'E', 'F'
( Y, s. c+ V- Q8 g    }; 2 n3 I0 N! Q+ }. r
    return HEX[x]; ) a4 t, t# Z8 n4 a
} - Q$ _* V$ ~, g; B1 X
- |. a6 P" v% @* T5 i5 U5 P( _) J
int hexCharToInt(char hex) { # F5 P, I+ C+ o1 \+ t) m$ p
    hex = toupper(hex); 0 {" C$ s8 i* M7 d: g7 j# d/ g$ n
    if (isdigit(hex))
5 Z" {/ G: G7 Q/ @5 B& f) }3 |        return (hex - '0');
1 q* K4 }+ \9 h* X! S" A    if (isalpha(hex))
# R' _. V" L0 ?( m; z# c        return (hex - 'A' + 10);
7 R; q7 ?4 h& `9 @; w    return 0; 9 p! T. ]6 T: l7 x4 x5 I" V  {
}
* P& K! `; M. }4 h% G, C % y% W7 J# \% b! B: R- D: K8 ^
string bytesToHexString(const byte *in, size_t size) {
/ x. U) `6 L6 [    string str;
; B5 P' F. B. n" \& m    for (size_t i = 0; i < size; ++i) {   @$ u* B" E, K& X4 j
        int t = in[i]; * h0 j- J1 B$ x, h0 Z6 V
        int a = t / 16;
" }3 I0 r( f! |1 T9 ~6 L        int b = t % 16;
' \7 O% l! U7 `: ]4 O' ]$ d. n. M" M/ f        str.append(1, intToHexChar(a));
0 t5 ~1 Y+ b- {; ^) s2 ~* Z; a        str.append(1, intToHexChar(b)); 8 L- @3 U) }6 }2 z+ z
        if (i != size - 1)
$ F* D- v1 o* p2 |: n            str.append(1, ' '); / {1 x/ T" \/ |& z  C0 E! H2 P
    } + \$ n& ?8 v! D: o& i0 w
    return str; ! n. m3 ~! k* W* g. A: J! Y* o6 r
}
7 t& T  Q$ A4 D2 I5 g & d1 E" h8 r- L
size_t hexStringToBytes(const string &str, byte *out) { / x& n/ y6 D$ C  U) L; W
5 f5 E3 n6 W8 h& k* D/ c6 e
    vector<string> vec;
4 R; d1 f. [$ o    string::size_type currPos = 0, prevPos = 0;
7 z7 @1 X. C! e8 t    while ((currPos = str.find(' ', prevPos)) != string::npos) { " f$ V# p3 ^' ^% v8 f
        string b(str.substr(prevPos, currPos - prevPos)); ; \% S* x& T; ]; p
        vec.push_back(b);
% N1 }, u: e# @3 T: D  o2 ~        prevPos = currPos + 1;   L+ O( |; M2 m4 ^9 u
    }
$ _. i6 Z8 k' E, b( q, i    if (prevPos < str.size()) { , W0 F' M% A" [0 U7 t: P, j2 M
        string b(str.substr(prevPos));
0 g! X  P$ v( g& L+ E1 f        vec.push_back(b);
* @0 h, |" K$ G    } % V' V+ {% e% o& ]1 B
    typedef vector<string>::size_type sz_type; , E2 ^0 ~6 k/ Y9 b( g
    sz_type size = vec.size(); 6 ^2 w- p8 F( W( c
    for (sz_type i = 0; i < size; ++i) { ( P; |" w; s+ Q  F
        int a = hexCharToInt(vec[i][0]); ; q2 ~3 B2 S; n( w% H
        int b = hexCharToInt(vec[i][1]);
+ b" d/ |3 v' R. O        out[i] = a * 16 + b;
& ~- V% p  `5 {2 g) w' ?    } 4 I  P9 b) N5 r3 n! ~+ c
    return size; : P3 q* G) D# E2 Z0 N% M
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 2 r9 U  u2 {0 X# k2 h6 k
#define TEA_H
9 S9 G' v& e0 s* z/ D0 p
0 g+ ]* e9 Y/ O( ~/ N+ H; Z& V/* ( c+ H$ x' u. S) x* L& l
*for htonl,htonl
( u# I4 p5 R. d/ K*do remember link "ws2_32.lib"
! v! X9 y; P7 O8 H, J*/
6 Y: ~7 [$ }0 d+ c#include <winsock2.h>
  s2 ]# y' C4 q# `) E+ f#include "util.h" ) T3 j+ Q0 k# u
4 M8 F5 _' e9 P; d6 [, s' M0 \
class TEA { 5 ?% Z' z( [4 g8 z6 `2 H
public: 1 r. V4 p# a; f/ q! r% V
    TEA(const byte *key, int round = 32, bool isNetByte = false); , v+ C; x0 [6 w/ i
    TEA(const TEA &rhs);
8 z3 q: {! g5 V. N, i/ D/ }    TEA& operator=(const TEA &rhs);
% `5 U5 K) ^6 m3 p    void encrypt(const byte *in, byte *out);
. d% x( K5 D  `9 w    void decrypt(const byte *in, byte *out);
0 E9 g9 l/ c& d0 B+ I9 l' r$ nprivate:
! @% W" M* _) \    void encrypt(const ulong *in, ulong *out); ; r1 t/ w0 x3 n7 a/ P. o* x
    void decrypt(const ulong *in, ulong *out);
' h/ U0 @( ^  @$ C+ H    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
% c+ P) Z3 m  A6 {# Y    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 5 Q; U( v& T; Q; u6 k% {2 O
private: - S) e$ n0 ]) o" a. r: E
    int _round; //iteration round to encrypt or decrypt
$ b/ r1 `1 m, W* I- X    bool _isNetByte; //whether input bytes come from network 6 ?& x* F; Q, }5 `- v! y
    byte _key[16]; //encrypt or decrypt key
2 ~* Y3 U. ]* G" b# Z) k: o}; ' A- m+ ?/ t0 r# K
+ u; c6 O+ w1 O! Z
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" $ U8 c; f4 V9 S! Q
2 #include <cstring> //for memcpy,memset
% @  }& y7 I" G" s  N, c 3  
* a5 l2 e+ h  o' h) N# p1 {& P. Q% D 4 using namespace std;
) ~" U( P/ H' x' x, w/ q 5  $ O# }& \0 @% V* t6 t
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
% ~( A! r7 @" I% G 7 :_round(round) - w9 r7 k' a6 x; e% v! b
8 ,_isNetByte(isNetByte) {
" m8 d/ Q, R( K8 Z 9     if (key != 0)
# m9 V- ~. O6 W* B2 w9 |' g10         memcpy(_key, key, 16);   d: q3 D6 _9 t6 X' J' Q: \  V- g
11     else # s" K4 q4 p0 z, d7 d- M) |2 [
12         memset(_key, 0, 16);
1 q+ x5 k) N& Y) U; A0 @13 } 3 C2 f# L+ I; w( s6 W1 q
14  4 x% [! h3 u- y0 z9 v- o
15 TEA::TEA(const TEA &rhs)
7 Y- A0 g& A; T, g16 :_round(rhs._round)
8 u" W, c% S- b17 ,_isNetByte(rhs._isNetByte) {
5 u7 n7 c5 a/ I  ~' b18     memcpy(_key, rhs._key, 16);
# E; a9 ?5 u: }2 f  a0 H& n19 } 2 [4 l! H* v1 n1 G( }, a
20  ( w7 A7 w; G2 L5 ~# i; C
21 TEA& TEA::operator=(const TEA &rhs) {
3 x1 j7 S* S/ |( i22     if (&rhs != this) { 8 y0 k3 |6 G6 B6 S- ^; W8 |! m
23         _round = rhs._round; # H( I0 Y5 |9 D; f6 Y+ X; I* g- @7 R
24         _isNetByte = rhs._isNetByte;
. P: v6 S& d* d# O" |25         memcpy(_key, rhs._key, 16); ( w7 ~7 j! F- e
26     }
7 O/ o- [3 @* s$ w" S27     return *this; - ^; j! z1 R( }& t- }
28 }
# q2 \0 n) J4 O) t5 L1 n2 `29  , G, P7 K3 L9 K; E3 b: C7 ~+ l2 s
30 void TEA::encrypt(const byte *in, byte *out) {   e1 `' A6 o1 `/ N2 S
31     encrypt((const ulong*)in, (ulong*)out);
* I. P  O! j% j+ R32 } ) o; x) @3 s, B% r2 u- R+ x
33  
& q- @3 }% A* A8 |  L34 void TEA::decrypt(const byte *in, byte *out) {
8 s2 c6 g7 R% }! L8 @35     decrypt((const ulong*)in, (ulong*)out);
/ g' i7 V+ D( N6 p6 Y36 }
1 W, r% @/ r, S( @) V37  
% x/ Z9 |" j7 D, }  m38 void TEA::encrypt(const ulong *in, ulong *out) {   e( g3 F0 L2 l( l0 A
39  . t. i0 Z: T7 j# Q/ D+ k" M, h2 }
40     ulong *k = (ulong*)_key; 7 s$ J8 d# `, p4 j! k
41     register ulong y = ntoh(in[0]);
; L1 H, T, V8 @: X) g" v5 [$ q42     register ulong z = ntoh(in[1]);
# b/ a. ^0 d) `" \43     register ulong a = ntoh(k[0]); : g/ L  ?/ ^- e' U% y9 B7 z
44     register ulong b = ntoh(k[1]); " ?2 a; y$ |$ x! x
45     register ulong c = ntoh(k[2]);
* W: T4 P! G2 Y0 e# ?$ G46     register ulong d = ntoh(k[3]); " b1 }: I: b& O, m+ A4 M& }3 @# |
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
$ j0 n: u; P! x" v48     register int round = _round; 2 ^, K/ s7 _, V/ R/ b
49     register ulong sum = 0;
+ k! q1 |1 A- g  L$ L6 H. x# n50  2 c2 ?4 t* s% ~4 \
51     while (round--) {    /* basic cycle start */   y! c9 {9 O% e  w+ |1 X( v
52         sum += delta;
2 s7 B  K  C+ g  O53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); $ Q) e7 Q& o0 [
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
5 k; a! B& }; J  ^% @" Q55     }    /* end cycle */
2 X7 ]- R" z( ?* B7 E56     out[0] = ntoh(y); 9 N4 Y) h' y0 \7 o0 M/ R
57     out[1] = ntoh(z);
1 J9 X2 _* P% i2 V  G4 T58 }
; p- ~5 y7 r& v) j3 v* P59  
) W6 h5 ?) o- x4 c60 void TEA::decrypt(const ulong *in, ulong *out) {
. P$ b, D  A$ a; b4 }61  
) Q( e$ |% k( i; g1 |62     ulong *k = (ulong*)_key;
" t3 k" H7 x: a2 W! I63     register ulong y = ntoh(in[0]); , R' l7 D5 x7 S; }
64     register ulong z = ntoh(in[1]); 6 h9 l! b- }# x. R0 b; d
65     register ulong a = ntoh(k[0]); - ~2 d4 P" o0 e8 I
66     register ulong b = ntoh(k[1]); 0 m8 H1 _5 ?0 F* t5 \5 E8 H) [
67     register ulong c = ntoh(k[2]); ( C% y# y  ]# {5 I) E+ i+ E! P8 i
68     register ulong d = ntoh(k[3]);
# e' X5 f/ B1 ~8 D69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 8 B5 ]; R/ U* u: A( ?& s; G2 ~8 k
70     register int round = _round;
( S5 b/ W0 O5 z- L# ~/ H. N71     register ulong sum = 0; - o+ y$ N% h4 L7 }( t# ^1 n
72  " u3 b: m6 N% t. ?( _1 j6 f9 c
73     if (round == 32) 4 B! o+ v$ n$ ?% K0 g& H
74         sum = 0xC6EF3720; /* delta << 5*/ ' \, z( a6 k) g! ^
75     else if (round == 16)
8 r+ l! S$ T/ [6 [6 G+ g- @76         sum = 0xE3779B90; /* delta << 4*/
1 Q4 u' G0 M' I/ W/ K1 |2 e77     else
3 h* b2 {  p8 G78         sum = delta << static_cast<int>(logbase(2, round)); * _, v$ A: f6 J& e
79  / g( H" [5 ~/ _" s9 w
80     while (round--) {    /* basic cycle start */
; o: V( L5 j% S+ u. p81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); & }9 I7 T% i+ g4 m' `5 q: I8 ?
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
3 m* e1 D+ m, p& M) r83         sum -= delta;
! d0 T8 c! w/ b3 P7 k) b84     }    /* end cycle */ 0 ^7 ?+ I3 W6 r  R$ s' |
85     out[0] = ntoh(y);
! R% O* S5 S# p. {, |" |+ B3 ~86     out[1] = ntoh(z);
) M1 Y# Y6 G3 [% `2 [/ ]87 }# O; _6 U: J. B' z
& t* W7 e) C0 d2 N8 t6 ~5 ]
需要说明的是TEA的构造函数:
6 Z9 C5 m6 a: c8 Z2 J9 R; N. r1 rTEA(const byte *key, int round = 32, bool isNetByte = false); 9 v' C+ N' z5 m0 f0 W& _6 l
1.key - 加密或解密用的128-bit(16byte)密钥。 0 Q5 J" c6 `- Q6 d; a$ M
2.round - 加密或解密的轮数,常用的有64,32,16。
. P3 E# K. q, h, z8 e# [8 C9 {3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ! {# h' s$ r' l( }+ F
; i# ~# f/ x9 m* G3 }& o0 J
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" / Y4 z4 ^2 {/ m4 r. o& l; _0 ^* m
2 #include "util.h"
! t9 ~* P" J0 X0 C9 f  Z+ e 3 #include <iostream> - `  ?: R3 f% \0 C& @0 d; x/ t
4  
8 p, \( S& ?4 p 5 using namespace std;
( t7 N2 Q2 r) x; @& T 6  
- B2 F3 v; u1 H 7 int main() { ; o' u' c4 b! o& Y$ T. [
8  
1 B2 O9 K1 ~# f8 Q3 E. U 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); $ |7 M! m2 Q) d9 v7 Q
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
4 i  r/ T! H5 R; s* [11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; : a) c. }7 o# S4 O. ^5 k
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
* C  W$ i7 a* T! |) ~( w% M13  
8 c; H* j7 }' l2 c, h  X14     size_t size_in = hexStringToBytes(plainStr, plain);
! h& j, @3 l, u2 A9 x, E15     size_t size_key = hexStringToBytes(keyStr, key);
) F: g  \& u- P% }16  3 S0 }6 ~5 H( h9 H5 l
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
$ C! U+ u7 l( [6 y18         return -1; 8 O. e) P% E9 I; Z! n
19  0 H( O+ H7 O# }- Q
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
( @1 @/ L6 G0 X& H+ c9 g  b4 I. J+ J21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ' v0 x5 z/ q# S0 U# y! A& {
22  , ]' ^3 ~6 ?4 x8 }
23     TEA tea(key, 16, true);
5 c& ?5 Y/ ^2 |7 E24     tea.encrypt(plain, crypt);
+ P; o* s, y/ C& Y5 C8 x25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 7 w  X" }+ b, C& X. G
26  
; d$ Q. @/ b2 A1 }5 }4 R27     tea.decrypt(crypt, plain); 7 a! X: A. ]! V6 d
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
2 m: w  \) }' l29     return 0; 0 X. k* Y( f" A6 A/ Y* y5 f
30 }
/ _4 H+ I7 k! |# t, j* x: j
! s% e5 W3 e4 O本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
6 J$ Q9 o! c+ }8 v运行结果:
$ L! z: e7 p* H+ z, ]( QPlain: AD DE E2 DB B3 E2 DB B3 ) c, v; ]  |- S1 h/ s) S0 n" b
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 , r: c' g  s  a+ k
Crypt: 3B 3B 4D 8C 24 3A FD F2 - g  |" A1 m( Z  ]4 c7 Z+ r# a
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 10:53 , Processed in 0.017741 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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