找回密码
 注册
搜索
查看: 37470|回复: 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轮):
2 J5 y. O* t- t  f) u& x& L4 F微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
5 P) v6 R5 x* d; o; M1 v5 D" DTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
5 }* d( m& ?5 P4 v3 Q0 Y之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 8 G, d$ O/ x, a& ^8 y* ?
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 3 W9 J) y8 w! j
在 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. % t5 p0 P! P( f+ i# x# K) m; J" d" b
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ; o4 }7 q% J2 T4 z. V
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */   w; y$ u5 P3 S# w9 w% O
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    $ S. B2 s0 \  V5 E" ]
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 3 d8 O4 @# g5 c
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    # O2 p8 P# e/ W9 R
  7.          sum += delta;
    9 [6 E4 v% T7 ]% S& g: P
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 3 B) i3 e, d' |& M: O  u$ |+ ]
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ , r4 U3 o/ C/ I, w
  10.      } ) w, H* Q2 z9 _6 l' p
  11.      v[0]=y; 7 V) w, j! A0 t* f
  12.      v[1]=z;
    2 q+ D, w5 B9 w
  13. } & ~3 ^2 k: D9 C' |* q0 q
  14.   
    : `* r% p/ v- ]! ~" `3 y
  15. void decrypt(unsigned long *v, unsigned long *k) { 9 A; J- R! b; y* E& v. d
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ ' l, G, x) b2 b/ G) {' q" y: }
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ % G; q7 Y0 W1 I  f% v) S1 Y- ^
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ! F$ V6 k; L. r+ \- |
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    9 w: v: J0 a9 _: W  d% Q
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    % l8 }; M% D5 ^& F8 D
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ) M' c4 l. h$ E& S$ r+ G
  22.          sum -= delta;                                /* end cycle */
    : v, {  i! |3 G& n2 a( {
  23.      }
    * V! I- ]) R! i: e1 l
  24.      v[0]=y;
    + K; H0 s& L4 ]7 Z
  25.      v[1]=z; 9 e/ D: L7 v% ?  }1 w0 w. V
  26. }
    + g+ d; ?/ R; N, I+ W$ H3 U+ R/ \' t
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H & m& W. a; N" _  Y% `1 X
#define UTIL_H 5 s" Y, z5 Z) v/ }+ y3 {+ ]

3 ?  J- [; K# H8 Y, F7 _#include <string> 5 w4 w* B0 e& c1 U& |8 i
#include <cmath>
8 R1 j: M& }, i% k$ O#include <cstdlib>
  `; r" K0 n+ e+ L, G' s& ?, p % e/ [; }# }, L4 k/ k5 j
typedef unsigned char byte;
6 R* n% |( a' r4 _typedef unsigned long ulong;
' W! |$ _  U" |( D) ]1 [% h ( E/ z2 f6 h- t9 t# L+ C3 H) T
inline double logbase(double base, double x) {
; o- `/ q0 L, m3 R( o2 E# @    return log(x)/log(base);   X4 t2 }$ f+ P, J3 _7 ?. U
} 2 h) S1 S& u4 `7 y+ U% i; C. e/ Z9 O8 ]

; B% W6 I2 ~. C+ a5 r9 h. p( s/* - K$ {" \2 _: K+ Q: _- J6 n0 u! ^% h
*convert int to hex char.
2 {  K: _- `  H( Y*example:10 -> 'A',15 -> 'F' 0 b( z& K3 }, g  ^
*/ 3 C3 l8 E. X& f& e* e4 _" c
char intToHexChar(int x); ( R  k1 V% Y: g, S. f

+ _1 [& u9 F* C8 I. b9 k/*
0 `8 I) k* y6 a$ O4 P9 i*convert hex char to int.
4 v* v8 w1 v# l% P*example:'A' -> 10,'F' -> 15
& f8 N2 h; }" a1 m8 g8 P*/ 6 N; I. ^9 g# x8 r. v: }
int hexCharToInt(char hex);
% R5 T  A& u+ [8 v! w7 P- {
. |/ }  I( f9 c3 F5 v6 lusing std::string; " ^( R7 M3 Z. Z! P* [
/* ) T% N" D( j" v! J; H7 \, v
*convert a byte array to hex string. 0 {! Z. |9 i1 K+ f5 \
*hex string format example:"AF B0 80 7D"
: S% i# k$ L. o* u4 X*/
1 |8 S9 _2 N+ Vstring bytesToHexString(const byte *in, size_t size); 3 D, M9 {0 W$ q+ [

& h, \4 z6 I  S+ n4 G. ^# h/*
/ S) P: M$ B$ e2 ^7 Z+ Z*convert a hex string to a byte array. % X+ c; B& Q' F& L" [% H
*hex string format example:"AF B0 80 7D"
  r; p' H! w0 J7 d*/ 4 s% L7 g9 F1 l  Y! [$ o
size_t hexStringToBytes(const string &str, byte *out);
; u) t8 t# _$ |3 j - O8 u- e/ s  P1 j; e
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
1 q' P9 h1 Z0 _7 y% }" C2 D#include <vector> , f) y; |2 O/ W4 s4 B) Y7 V

- e: V- ?: u+ D( z* gusing namespace std;
. O  i1 Q  @: a5 X; I
4 G  b! Q3 [- a. qchar intToHexChar(int x) {
5 F  d( s& c0 h8 y) M    static const char HEX[16] = {
$ D; o( F8 J& m6 _  j- M1 X        '0', '1', '2', '3',
- S+ D7 F  M$ @        '4', '5', '6', '7', 8 C( j1 e2 g1 T' L* K$ \1 _
        '8', '9', 'A', 'B',
' R6 j- H5 H* R1 @; {        'C', 'D', 'E', 'F'
; V, ^7 p8 Y5 |* V/ O; u    }; - i( t) r1 T/ l, H5 T6 K9 ]: K, Z
    return HEX[x];
( |. \; k9 E+ K: S} 7 e- o- j/ f& ]8 m- k6 @/ H

. W# N) B7 N/ Q; F. Dint hexCharToInt(char hex) { & X1 U" d8 R; J1 q1 j3 t
    hex = toupper(hex);
5 u6 d& @( I$ W  X  U+ {    if (isdigit(hex)) 4 O2 B9 m, z4 ~& q5 p/ w" R5 n
        return (hex - '0'); 0 j: f# S% G- l# u. I: x6 s
    if (isalpha(hex)) & l* ?$ e& B" _* e% ?
        return (hex - 'A' + 10);
- V  b( Q4 Y' q0 g  I+ m1 E    return 0; , g( K+ H$ u" Z0 [- l# f
}
5 \! K. B" B/ x. _/ L0 v2 j 8 z  z7 v. e* }' a1 \" {. U5 J; j
string bytesToHexString(const byte *in, size_t size) {
8 o2 C  Y" @! v( `. P- b    string str; ; D7 R! M5 g) \: h3 m( m
    for (size_t i = 0; i < size; ++i) { - i5 u2 w* T; o# K$ z
        int t = in[i];   b; }  [2 H6 J9 g
        int a = t / 16;
  i5 ?5 y9 }; n( \% o8 V        int b = t % 16;
0 A- r/ }0 w: h8 D5 L5 G        str.append(1, intToHexChar(a));
6 l7 g5 J: e  X  v% O  B        str.append(1, intToHexChar(b));
0 ?" t9 z+ I$ {; a$ }        if (i != size - 1) 0 k$ w( q8 Z- K7 u4 S0 s
            str.append(1, ' ');
% r- D7 K" L+ o) P3 L    }
  S. |7 x% Z: \5 {    return str; ' M  y% Q/ C& E  d, F9 U" s, X
} " {5 J/ j; C* _

+ a/ p% r% |' A+ r2 ^size_t hexStringToBytes(const string &str, byte *out) {
8 P/ i! w7 J2 v8 z; G$ g; U ( J) R" x0 _, X
    vector<string> vec;
( _" J- f& A5 O& V2 n" P    string::size_type currPos = 0, prevPos = 0;
9 @6 g$ C5 p$ h0 G* ^% j7 K  F    while ((currPos = str.find(' ', prevPos)) != string::npos) {
: t( q2 ]: O/ H% ~        string b(str.substr(prevPos, currPos - prevPos));   G+ H* O0 ~' v* X* C& W0 Q
        vec.push_back(b);
7 W! C4 X! m2 T: G! L2 i( j        prevPos = currPos + 1; / k7 X) {9 k, v8 @' X. L
    }
$ E+ x" R5 B, G6 f% d    if (prevPos < str.size()) { 4 B6 F: m4 o  O5 m. T1 R
        string b(str.substr(prevPos));
& p- j7 h: P$ B; g* m0 `        vec.push_back(b);
- N7 Z# C/ p  Z  y4 |  E# y1 X% h    }
% c' M  ?  w" K3 |3 M    typedef vector<string>::size_type sz_type;
6 p* |( N8 U+ e) s) K& {3 w' D    sz_type size = vec.size();
9 b9 g3 f/ O" X( Y5 u6 t; a3 n    for (sz_type i = 0; i < size; ++i) {
% T- H5 j) ~1 S( S        int a = hexCharToInt(vec[i][0]);
. c$ s  v  {+ \        int b = hexCharToInt(vec[i][1]);
. f7 H+ O. P2 }4 B  b* p        out[i] = a * 16 + b; ! k7 a) s, t  m
    } ! p$ [! Q: G" a8 w
    return size; # L' c2 I( Z: y! P
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
& q- q' i7 [' `) v0 S#define TEA_H
+ |! I3 F* j( k + U7 a6 t: S! l# Q! A% {8 c
/*
0 _! y: M' o: a6 }/ R( i5 r*for htonl,htonl . N8 j0 I8 v9 a$ i/ _
*do remember link "ws2_32.lib" ; E. A1 j  A5 [6 n
*/ 8 a: H$ @# U% P- U! A3 b' ^  A
#include <winsock2.h>
/ z$ k0 ^; y4 @2 G- F#include "util.h" 2 E9 n7 l: _0 I% q& P

7 V& ^/ I- D2 r; uclass TEA { ' d: f1 Y  l9 P! u/ s
public: * O- H( z, t3 h0 t' }/ D
    TEA(const byte *key, int round = 32, bool isNetByte = false);
4 k' r( D( P; n  E0 c/ p    TEA(const TEA &rhs); . G) \0 q; R( i' J9 c0 S
    TEA& operator=(const TEA &rhs); + s% g; g% i. P
    void encrypt(const byte *in, byte *out);
6 s  x/ a" S6 Q) Y3 R; [$ i4 V    void decrypt(const byte *in, byte *out);
1 r5 c/ Q! M$ k$ W# M/ I: u0 Bprivate: 7 C) o+ o- f  \: ^) c# y
    void encrypt(const ulong *in, ulong *out); 7 Z2 t  v* A; J+ W
    void decrypt(const ulong *in, ulong *out); ( b0 J, R, h" R0 T$ V
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 0 d% J$ N9 j% C/ }" L) t+ d3 C
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } + J/ n6 }% k" H; U8 Q2 `
private: 4 Q5 v- \) a; E# l& ?
    int _round; //iteration round to encrypt or decrypt ( @0 p1 V% B/ R5 V! T! F
    bool _isNetByte; //whether input bytes come from network 5 q6 _3 _9 Q* C" x* B0 r
    byte _key[16]; //encrypt or decrypt key 8 M+ C3 M  s- a5 l& g  x# r% l$ _
};
* }' u1 v% k9 i % O/ {- j' p& i2 |
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" $ z) _8 }. F( x7 L
2 #include <cstring> //for memcpy,memset : l9 F9 }- n% l1 w$ G/ U
3    u: O0 \4 ]7 w. G( h; f
4 using namespace std;
8 O7 o1 `; b" P5 d; w 5  
8 g% d3 `$ ~3 [) ~: y 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
  |! X4 S! ]7 R  a! [ 7 :_round(round) / H% [2 L- E9 `
8 ,_isNetByte(isNetByte) { , E: |3 n& u4 t/ s& Z5 y/ S
9     if (key != 0) 4 k0 s8 Z* `: Z3 j# ~) v
10         memcpy(_key, key, 16);
4 f; X* s  q4 N( T# Q11     else
. R/ w. L! e: h: w# ~12         memset(_key, 0, 16);
+ M6 b% b! Z0 L# j; f13 }
( e: @* j9 u- B14  
$ O8 x2 W; A9 ]15 TEA::TEA(const TEA &rhs) # o# |# I3 [% u0 v6 b
16 :_round(rhs._round)
% h' D  F* Y' k& d; Z4 Q; G( d# d2 r17 ,_isNetByte(rhs._isNetByte) {
, [1 x+ Y1 n9 p  t18     memcpy(_key, rhs._key, 16); 9 B& W9 x, o, B1 i+ @6 r6 C
19 } 4 t* O! n! q/ |2 y3 x
20  6 H6 J7 p' k$ d. k7 e8 \
21 TEA& TEA::operator=(const TEA &rhs) {
; `6 _' d; q, N$ ?8 L6 J" Y22     if (&rhs != this) {
4 P9 g4 i0 w/ M9 w/ I0 {23         _round = rhs._round;
6 y* z  X$ W) C; P' X+ `( ?' _0 L5 @1 w24         _isNetByte = rhs._isNetByte; . W" D$ v: J9 P# m
25         memcpy(_key, rhs._key, 16); 1 N" |  l6 @  X# G
26     }
1 l, L( ?9 k) c- C27     return *this;
& k* G2 W4 D8 l7 A- O: d7 R28 }   ?* A/ [0 U  S/ W+ |
29  
2 _6 \" {2 @  F30 void TEA::encrypt(const byte *in, byte *out) { 2 q! k- F& T% S8 v
31     encrypt((const ulong*)in, (ulong*)out);
% H6 [$ ?5 {) v" r2 ~, k32 }
& E8 m4 Q+ T# P5 z1 s33  ; c# z1 _& a. e& e0 L' x& c* L
34 void TEA::decrypt(const byte *in, byte *out) {
% [9 b$ `/ I* E+ X( ~5 W3 Y. |35     decrypt((const ulong*)in, (ulong*)out); ; H" D: e4 V  I
36 } ( o3 Q& V- X6 d! ^) P! v' ~
37  
& W& N' O) @& `% j0 _  _9 t! N2 j& b38 void TEA::encrypt(const ulong *in, ulong *out) {
, E" O7 Q# L) q5 @39  
  [: l6 \( T$ E3 K* Y  z4 E40     ulong *k = (ulong*)_key; & ]  z% s: ?* y  z* u
41     register ulong y = ntoh(in[0]);
- F/ m$ i3 z  w0 O2 y42     register ulong z = ntoh(in[1]);
" O1 M- a6 X8 r43     register ulong a = ntoh(k[0]); 6 V3 @. A% |8 s" u, A% L& i
44     register ulong b = ntoh(k[1]); 8 `8 m# o& m' K; y6 o
45     register ulong c = ntoh(k[2]);
' t5 }: B9 P+ u46     register ulong d = ntoh(k[3]); / G& v3 E) z. c% j! u2 z: e
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 1 n4 r" \- w  U: s- y/ K- Z) A
48     register int round = _round; - H7 J* I8 E3 `- M
49     register ulong sum = 0;
4 }! p: r1 {4 Y. [. s, J- R/ a50  
% V. z  w, e4 y# J7 e51     while (round--) {    /* basic cycle start */
# Q. m# ]* W9 _1 H  g52         sum += delta;
5 A/ n5 N3 o2 g$ f" G9 X& w53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 1 [$ s( I0 x9 L3 z7 X
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 8 b+ p! X- K" R( H
55     }    /* end cycle */
* u  h0 S! o% r8 K% O$ b56     out[0] = ntoh(y); 4 k" J/ R9 V; W
57     out[1] = ntoh(z); & x6 q9 T- B. o& F% ^+ X
58 } 5 \1 Z/ ^( p( S" r
59  
3 k5 H, @  }" l- A+ K8 l' }60 void TEA::decrypt(const ulong *in, ulong *out) {
8 b( A1 I9 G5 ^8 u$ ?7 ]$ u61  
2 E8 L# L; Q& b62     ulong *k = (ulong*)_key; + u$ H. `) ^* z& F) H) j
63     register ulong y = ntoh(in[0]); $ `  Y! g5 a  L- k2 g" T
64     register ulong z = ntoh(in[1]); , W' o" Y4 R& @1 }6 n: t
65     register ulong a = ntoh(k[0]); 4 N6 z6 Z3 _' g+ e& d$ K
66     register ulong b = ntoh(k[1]); / M& X- ^/ @- q* I2 |
67     register ulong c = ntoh(k[2]);
1 p# S" l  J  Q2 A68     register ulong d = ntoh(k[3]); / p, F( a+ N# a: i; ^. V$ i" q
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ; E( |+ B  u' e& E/ w. T$ J" `* f2 D
70     register int round = _round; 6 Q9 X+ w6 |+ o* z
71     register ulong sum = 0;
6 m( G( H- U6 H7 c72  
0 ~1 h, }6 J* E! ~- m% |; T; q73     if (round == 32)
4 T! @* d" |) W74         sum = 0xC6EF3720; /* delta << 5*/ / i, @7 g8 g, A7 }6 @
75     else if (round == 16)   B& l% W; f- @* ^3 c  J
76         sum = 0xE3779B90; /* delta << 4*/ 7 H. n5 q  F, d' R% N0 M. H
77     else 1 g: E6 n$ V, V6 I% K+ H) ?
78         sum = delta << static_cast<int>(logbase(2, round));
& u) J6 _% e' X8 J8 b79  : u5 m! g9 q% X$ C8 g5 M
80     while (round--) {    /* basic cycle start */ ( [- h1 v$ B: t( Y5 |
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); # N( }1 y' E4 `1 u+ i' A7 [
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
4 L6 r2 m! U& L3 @& I83         sum -= delta;
* @5 a+ t% o5 @& b  c' l4 M8 _: r4 _84     }    /* end cycle */
! P! S* e) g9 T' I: R0 L7 `% y85     out[0] = ntoh(y);
7 B; l! I9 U( s+ Y! M; D86     out[1] = ntoh(z);
% k! E8 j! m0 f1 S0 @) N87 }$ w4 X* i2 n; X6 m

9 ]: l' ?( \* a! u) q需要说明的是TEA的构造函数: * O; f! ]4 T4 Z6 }) D1 Q
TEA(const byte *key, int round = 32, bool isNetByte = false);
/ d; s% Y: h/ u  V/ B1.key - 加密或解密用的128-bit(16byte)密钥。 5 o; ?3 t8 w6 r! M. y, n* j
2.round - 加密或解密的轮数,常用的有64,32,16。
: Y. q' r2 c- L4 Q! H9 m# u7 v3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ( ?2 [" |- @0 h! X

  \7 w7 w2 o; n8 K. j6 g) u* l最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
1 m" X4 f6 v; y1 h1 }5 T 2 #include "util.h" 3 Q, U7 ]- b: d: l' V7 G! `
3 #include <iostream>
: X  ?; @% m' i$ r, g 4  
7 W- i' Y8 I2 t& M 5 using namespace std;
# X) L( @/ I0 G0 p7 ` 6  
7 W% n# x# }4 k& n 7 int main() {
) U/ F8 K# y$ C5 r) @/ ]( c 8  
. e" C4 u1 d5 q- f) H( v6 h- G4 S 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
5 r- I2 m6 [% k# z, e. c5 P10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 6 `3 N) q: B. y. O7 @7 U; S
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
7 E2 @7 [* g  i1 K0 e/ T9 @  v12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ( u6 E3 i- U/ J: l1 Y
13  
9 u: F! ~- Y! z' z- d- l14     size_t size_in = hexStringToBytes(plainStr, plain); : Y" `- [1 e! D# [$ Y; z  n2 q
15     size_t size_key = hexStringToBytes(keyStr, key);
: K) u9 y% F' y: a# @# [2 z# w16  
; t! p' {% |/ g- k+ ?2 ^5 d17     if (size_in != SIZE_IN || size_key != SIZE_KEY) - o8 k5 ^/ d7 Q3 o
18         return -1;
4 G+ X3 V0 L( e# q; R% J0 c$ ~% t19  / g' b/ f8 w) g* T& S
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 9 P: l. H: T2 a' c
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
! k+ O* a, _# e# Y22  0 ^( w! h5 U6 R& D) J) d
23     TEA tea(key, 16, true); & H) O4 F. W: N
24     tea.encrypt(plain, crypt); & A9 x6 B$ d9 G# q
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 1 q8 \1 B4 R/ R% r: ?
26  
. ~* }3 j" Z7 s27     tea.decrypt(crypt, plain);
! L( S- y& i5 P4 E; A28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
9 Z/ p2 _0 q. t+ h29     return 0; 6 i2 k- q( O. w0 Q
30 }
, U6 v  F2 S+ T  i. y; H. J4 _0 ^4 Z4 @' P  |
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx3 j9 s* _1 o1 n( k5 F& P
运行结果:
+ z9 J4 ]$ h; Q: g5 w- QPlain: AD DE E2 DB B3 E2 DB B3
0 ?: v- f8 y/ a  ^4 WKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
8 J9 B# w+ p$ M9 SCrypt: 3B 3B 4D 8C 24 3A FD F2
" V5 D9 [& B9 QPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 10:11 , Processed in 0.023523 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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