找回密码
 注册
搜索
查看: 37677|回复: 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轮):; A/ X6 T: r8 u% C" `5 O, u
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
" X5 j; a1 c$ h2 f/ n- WTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ( c' ]- u0 b4 X: H2 G2 o
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 6 e' x, _) M9 }0 {! U1 D/ c# x
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
- [$ H# L. i5 R/ v% T8 Q, }2 {9 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. + k) x- F) x+ C7 r1 o3 @2 w( @5 y
  2. void encrypt(unsigned long *v, unsigned long *k) {
    1 j" b$ D* V. u
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ : l! L2 r+ o/ U8 |( `5 d- s
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ , I4 ?0 i7 I, f; S$ n1 _. [4 }
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    , O3 s4 i; o. T+ [# f1 L7 V; \* k
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    3 M0 |0 f/ e; ]; I
  7.          sum += delta; . V  ^1 [/ x6 I! X% ]
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    . {+ }5 v: W  P$ |4 T
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    + H) x+ {, U% ?6 T
  10.      }
    ; [, `: ?- _$ V! h+ L  d
  11.      v[0]=y; : o" E. o5 I3 L6 M( |: g
  12.      v[1]=z;
    # `/ C# s: J; d; e
  13. } & }  [7 i* P6 l
  14.   
    $ ^' K( P7 K5 `" ^' q0 I! ]
  15. void decrypt(unsigned long *v, unsigned long *k) { # w! _  f6 V' D5 T
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    5 ~4 R9 e- T  f$ `+ K
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ! N2 U' l* m9 J/ n6 M# n7 \
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    - Z3 \# Y* x5 D  E, ^1 {: l+ \* g
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ " r7 T3 v/ O7 I/ L/ T
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    , T$ g6 s+ K7 r! O0 V
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    - W' W+ G# F6 g  H6 d3 v
  22.          sum -= delta;                                /* end cycle */ 7 c2 D! a1 G* a  o) z1 D3 P3 G1 `
  23.      } $ w# f' o& ?7 V
  24.      v[0]=y; : w9 U7 I' B4 `) h4 ?) g/ _& p. R
  25.      v[1]=z; 5 F6 o0 O9 o' A! y- O
  26. }
    - A0 m; J2 i. N" z
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
( g7 \0 c& s4 [" V! o7 n  ?9 M#define UTIL_H , M7 [1 v/ D8 y. J2 |

& e% \1 g' g8 J/ Q#include <string>
; P6 \9 j+ y2 {#include <cmath>
4 [7 k- L3 w8 ^% o6 k3 x#include <cstdlib>
- d) _: g4 T3 X& b! y) R& q
) T( e! C8 z0 {4 Htypedef unsigned char byte;
; S* e2 [/ E0 s" h! p2 _. Z6 L# Dtypedef unsigned long ulong; . B: p2 t" q# {
4 `9 v7 c# X) L: d7 U
inline double logbase(double base, double x) {
2 j2 R6 v; b/ E- J# J6 T" }    return log(x)/log(base); % g: s/ M% q, X; f: V" k% T4 \' k
}
7 Q, c# @, @7 E% w0 p1 {. h & l, l4 v  b, d  ]. k- z  m
/* 2 z# Q0 s+ @4 L; x- a6 ]2 J2 x
*convert int to hex char.
) i6 z' ]9 C1 A: ~  D; B*example:10 -> 'A',15 -> 'F' ; _4 ^2 Q: L2 q0 ?
*/
9 v0 ^  u4 F0 o2 n; E) dchar intToHexChar(int x);
  ^/ M1 p  u* z" I % x* M( d/ }2 c
/*
9 B7 ?' e$ x% S+ j6 \+ l% m*convert hex char to int.
# p3 r$ V" b+ p1 k' k8 }: J*example:'A' -> 10,'F' -> 15 ! U, a% m4 {4 M, O! p# ^  V0 @/ s- q
*/
* d- y- Y- M: Y3 i0 fint hexCharToInt(char hex);
( J# m+ b, v" [$ ~% `  A# V
, _- ~% p0 K0 v& q- ousing std::string;
6 E$ L1 b  f3 z7 f- w% n/*
) t) z' S2 E  F4 U- }! C; Q*convert a byte array to hex string. , m& ~/ j- ]% i) l% x
*hex string format example:"AF B0 80 7D" & C+ |4 N$ @8 _# l; i* Y
*/
% U: l! \  W, v# M/ Kstring bytesToHexString(const byte *in, size_t size);
- j2 M( h1 C, j7 j, L& n
. b9 o( H; ]# c' p) J/*
3 ?/ c* K) H3 i! w7 V& N$ q# R*convert a hex string to a byte array. , b/ S; ?2 N8 I& a- S
*hex string format example:"AF B0 80 7D"
5 ^% W, N8 |6 |- Y*/ ( [/ o0 g2 J! ]
size_t hexStringToBytes(const string &str, byte *out); : I: z: y/ [# [3 D, U6 w% u0 x- P

$ m) t, ~5 q/ s3 H2 Q#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
# {+ u% R1 f& w# N2 {4 B' K#include <vector> : k8 x" ], i0 y3 w) t# L
+ o; l; O) q7 j; A9 e
using namespace std; 1 s, T, N( B; m) E
; i" [1 }2 p7 G1 `* w$ r7 M3 {2 x
char intToHexChar(int x) {
% O5 L/ h3 y9 O$ K( |* i; P6 ?    static const char HEX[16] = { 3 i1 p$ Y. Y6 G3 p/ c+ w
        '0', '1', '2', '3', ( e: }" B9 z. a7 s
        '4', '5', '6', '7', 7 t/ {: P/ b1 t& R* e
        '8', '9', 'A', 'B', 3 o9 D* n5 Y  W' o
        'C', 'D', 'E', 'F'
. e  S/ H" i3 y+ v    }; 3 i5 f# r+ `& r
    return HEX[x];
+ M7 u+ T/ t  y. t. w}
1 T; n9 A3 P  P1 M6 _1 e: M  b4 o" m
, S; j6 Y! y, \" wint hexCharToInt(char hex) { 6 _# P7 z+ ^0 Z# l5 ]7 N& J; B$ a
    hex = toupper(hex);
9 G3 x" N; W, ~' M& Q# F    if (isdigit(hex)) " I- J0 Y2 y5 e' H( @
        return (hex - '0');
! Y# }% W" e9 J& F" W( M' }    if (isalpha(hex))
/ a2 \3 N" A6 }6 i$ M6 I        return (hex - 'A' + 10); , \, Z( i) v+ I6 J/ C; f% n
    return 0; 9 e- R1 M( G5 V: D; G/ \& d% }: J; B3 J
}   s1 d6 F% t, `) {' R' O, M# c- K8 t

$ g* s* A" x2 ]string bytesToHexString(const byte *in, size_t size) {
$ i: q/ G4 j, H: M8 }9 r% h    string str;
& ]" i& i5 b" g3 S    for (size_t i = 0; i < size; ++i) {
5 B4 [" b' V. R! d        int t = in[i]; # r7 H; k" k- M; u; Y" E5 I3 u
        int a = t / 16;
$ M6 d$ L4 o- O0 G& L        int b = t % 16;
9 ^4 q, l4 q  b        str.append(1, intToHexChar(a)); 5 k8 k! R7 D3 k4 r* c
        str.append(1, intToHexChar(b));
0 b! n- }+ V) I4 M' p. u; K        if (i != size - 1)
1 h$ Y$ t/ k4 l+ P! T* R% P            str.append(1, ' '); , i; [4 B# {/ v9 x
    } 6 }6 M' _5 S; \1 h6 J
    return str; * c7 E+ y, |2 D8 l/ x
} ( E2 S! [/ _5 ]9 R" S* m  U6 B

% J5 v! ^' e# I2 asize_t hexStringToBytes(const string &str, byte *out) {
4 ^' {" N5 U: Z, d
" g% {/ L: [/ H" Y1 I    vector<string> vec; # j+ \- K3 r" U  n, b
    string::size_type currPos = 0, prevPos = 0; 6 c- d0 p+ |* B$ J1 n
    while ((currPos = str.find(' ', prevPos)) != string::npos) { ' U9 ]- |- a# H9 Y9 I4 Z6 k
        string b(str.substr(prevPos, currPos - prevPos));
1 `" t6 j0 m+ V+ P' Y        vec.push_back(b); % |6 s$ f5 H  k) p* @
        prevPos = currPos + 1;
8 e6 ^; x$ ?6 ?$ X# k0 T7 D    } / I& \0 L$ S+ V: K& q
    if (prevPos < str.size()) { ) |1 S& B. i! w) k) O
        string b(str.substr(prevPos));
# f1 v1 f8 X$ t' v0 |        vec.push_back(b);
6 a1 `$ {1 f: V/ c/ y7 [    } " `) E) h# z( X9 g4 R; e4 I  B
    typedef vector<string>::size_type sz_type;
, Z3 i; p* G. j! y. p* y    sz_type size = vec.size();
4 j4 y1 C8 x) T2 Y+ p. y0 {    for (sz_type i = 0; i < size; ++i) {
/ h4 I+ w, L1 t# Q* E5 E& @        int a = hexCharToInt(vec[i][0]); . y' p6 s( ^, [9 ~' N$ C: O
        int b = hexCharToInt(vec[i][1]);
( E( N1 P  b7 R8 @* |% V6 n        out[i] = a * 16 + b; + x1 ^' d+ F8 h& _; b" V% w
    } ( a1 e1 v5 U, E: G
    return size; ! Y3 F' e7 C( i+ h' Z
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H : `' f6 w  \  C; z& x
#define TEA_H 9 n: i  q( M* P: ]" z4 M# f

: C) k* v( b3 }0 L, V2 s4 u; o/* , h: H* Y# [6 r5 \
*for htonl,htonl ) l! F: D6 o& L3 I
*do remember link "ws2_32.lib" 6 ]1 F7 h* r: Y( d$ C' c" b, D
*/
$ A0 J3 w7 g  A2 w- f#include <winsock2.h> 4 u2 {- H$ n, b" @* P+ j
#include "util.h"
5 ~) Y0 u$ b4 t1 N . _/ D4 I0 }& }! i" Z0 U
class TEA {
- k( G6 {) i2 t+ @7 {- j* Ypublic: 1 |4 u4 T; V: R2 u# n$ S6 J6 E* j
    TEA(const byte *key, int round = 32, bool isNetByte = false);
0 Q% n& r9 w4 B( g+ Y9 \9 K/ h    TEA(const TEA &rhs);
$ \4 Y% X4 o/ c5 D, }- f# }. @    TEA& operator=(const TEA &rhs); + D' G+ r/ D+ }
    void encrypt(const byte *in, byte *out);
$ }  g1 Z) t* L    void decrypt(const byte *in, byte *out); . i" E+ V- C+ B
private:
# ^9 g; q5 b3 \    void encrypt(const ulong *in, ulong *out);
! Y9 M7 S( o' ^  h    void decrypt(const ulong *in, ulong *out);
; E$ r$ J# ?% \% }5 W  n) E. P    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
  N6 U7 i! `- }    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
! I, [1 Z2 B1 @7 a* x8 w3 `private: * M6 n7 U3 W; z' x2 p$ ]! w1 i
    int _round; //iteration round to encrypt or decrypt 1 I" z1 N( A# H
    bool _isNetByte; //whether input bytes come from network
. s! q7 B* d* s1 s  J; r1 M+ r* E    byte _key[16]; //encrypt or decrypt key / I5 W3 v( o: P1 v
};
. ?. Z; g$ k6 B2 y & {# b( T6 h: {1 }1 G
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 4 u5 ^* I- @% X. f1 K5 ~. O
2 #include <cstring> //for memcpy,memset
3 V! g0 H8 {$ z* S, W( A/ Y 3  
/ a3 ?3 ?( T9 N5 v! P; Q 4 using namespace std;   i+ G4 n1 K- H: `
5  
  u3 u/ f( s* A, }- @ 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
) R' `# q3 K4 Q- U& } 7 :_round(round) $ A0 b8 l8 E. ?/ c0 C5 Z
8 ,_isNetByte(isNetByte) { ( c0 o5 G( A- s0 A% G9 w4 ?. v4 ]
9     if (key != 0)
/ K' u& i1 A7 R+ T/ M10         memcpy(_key, key, 16);
. {/ {0 c/ R( J8 Y7 _11     else
3 ^- K3 O- l8 i5 l12         memset(_key, 0, 16);
8 A4 w6 K# J; b8 `13 }
. ]2 `0 c9 t/ j3 r1 y14  7 t' h- u$ W2 i) H9 u
15 TEA::TEA(const TEA &rhs)
& z1 Y( z: ]" p( p( E16 :_round(rhs._round) ) M7 b/ R+ H: [' w* p6 x  |
17 ,_isNetByte(rhs._isNetByte) { 1 j: q- `. C, |& M+ M% L% d1 z
18     memcpy(_key, rhs._key, 16);
: H2 F2 @" R5 B2 J3 D! @( T19 } 9 V  A6 D  Q1 Y4 F9 c
20  + b+ G. V0 Q5 b* b9 I* q7 U
21 TEA& TEA::operator=(const TEA &rhs) {
: v# k7 t  O# ^! M2 B7 D22     if (&rhs != this) {
' d6 S6 R3 L) \$ Q23         _round = rhs._round; ! z* l5 a( Y" j0 ^4 Z
24         _isNetByte = rhs._isNetByte; ; V1 F( l5 ]; T  j) S7 v0 b- {6 d
25         memcpy(_key, rhs._key, 16); + F9 F( f- A  J- x0 R& [
26     } $ u. N' A& R* i: `9 @  m
27     return *this; 6 {, M/ m  W) }
28 } ; N, J1 y# O6 r4 |& o
29  + h# }  c. r0 j$ u$ d8 P
30 void TEA::encrypt(const byte *in, byte *out) { % a( M0 K- R* c3 l* l6 s6 S: z% T0 c
31     encrypt((const ulong*)in, (ulong*)out);
- V' x9 }8 P/ l& ?* ]32 }
9 w( S4 t) o+ M' e) m, f: V2 L# {33  
' U9 v7 V+ I, c: G34 void TEA::decrypt(const byte *in, byte *out) { 1 a1 P# B$ p% \3 T
35     decrypt((const ulong*)in, (ulong*)out);
. {" ^3 `5 U% T36 } ( \: O, \6 n+ z8 F5 P. c
37  
' z# @% Y8 b2 h& }8 ~9 D38 void TEA::encrypt(const ulong *in, ulong *out) {
, q' d, D: ~" l39  + M4 N9 Q! j' f- P/ ~
40     ulong *k = (ulong*)_key;
! B3 n& C8 H% G41     register ulong y = ntoh(in[0]);
* }$ }9 Q3 e; W# Z, n42     register ulong z = ntoh(in[1]);
1 e/ @8 f! z8 ], Q/ A43     register ulong a = ntoh(k[0]); 6 c6 {( \$ N' d7 H2 `+ k7 f2 z
44     register ulong b = ntoh(k[1]);
6 r1 p( R4 W) Q45     register ulong c = ntoh(k[2]); ! m- A0 t/ s" T( i
46     register ulong d = ntoh(k[3]); ; o, x+ T! N& q! \8 d
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 5 j/ C: h7 T1 {- z8 [6 C
48     register int round = _round;   a8 ~' E* T4 p/ t
49     register ulong sum = 0;
& X$ G% J9 O! `, E6 f/ a50  
1 g1 @9 M' \/ [" A/ \+ E2 B51     while (round--) {    /* basic cycle start */
5 q4 R9 [' b7 w52         sum += delta;
- l! V. n; I1 _+ T  H53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
7 J% z, C3 _. W54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); % f) `- V# ]) X& m$ S/ v6 W+ G
55     }    /* end cycle */ # o. F3 E  j8 x/ q& ~
56     out[0] = ntoh(y); " b$ Q# v3 P1 Y
57     out[1] = ntoh(z);
( y+ v6 z( r, z* _1 z8 b$ t" i58 } ' t6 u8 [3 j  @6 B5 [
59  
4 A" {: e0 ~$ {* l60 void TEA::decrypt(const ulong *in, ulong *out) {
) r* ]* V6 r) p6 B  Z61  
1 X% b) M1 O: F. D% O62     ulong *k = (ulong*)_key;
- W# _+ [, X. K4 W, ], G63     register ulong y = ntoh(in[0]);
4 n( P+ H* h3 u1 ]7 ~: O64     register ulong z = ntoh(in[1]);
2 |" y; _3 _% i/ Z7 i65     register ulong a = ntoh(k[0]); . ]$ R+ f: G7 k& p6 u
66     register ulong b = ntoh(k[1]);
4 j0 v# d( z1 G3 P6 a' B0 }; Q3 j67     register ulong c = ntoh(k[2]);
5 ?5 W% l1 t6 i) w5 z, C5 b68     register ulong d = ntoh(k[3]); ! ~/ X1 j. o% R0 x0 d
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ " g1 ?( }- m& G& V* L  B* K
70     register int round = _round;
2 [& S( A+ {0 e; \71     register ulong sum = 0;
5 t! M/ W% t8 Y+ J) U72    i. }- D  j) w6 c* H' Z5 {: ~
73     if (round == 32)
& z: f1 k% g, H! [$ r" d74         sum = 0xC6EF3720; /* delta << 5*/ . d; N/ e* f) F$ ^/ C
75     else if (round == 16) ' e8 K( _0 t' q6 w0 f
76         sum = 0xE3779B90; /* delta << 4*/
( t4 P6 X$ ?8 g4 X6 v2 ?  O77     else
8 w! k: d' t5 m8 y( \( Q78         sum = delta << static_cast<int>(logbase(2, round));
% ]" w; N" \+ s- U79  4 P! [3 b+ a1 p& n, _1 [7 d
80     while (round--) {    /* basic cycle start */
) Z) h6 B# M0 M, @. G) D- ~81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); * {0 W# m1 R$ ]* O$ E
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
) U- ^+ b3 H7 U% N$ \83         sum -= delta;
/ |: T" Z4 j! W+ G) x84     }    /* end cycle */
9 d5 H8 [: N+ E. u- w, I85     out[0] = ntoh(y); 2 Z% U3 {0 _" E+ ?4 b/ n2 i
86     out[1] = ntoh(z); . x4 u+ h" i+ |
87 }
$ }! N& P9 ?9 n8 Z0 W" Y1 p, n4 {. ?" `' \% F) W0 k" r( H# V( K
需要说明的是TEA的构造函数: 6 {0 M$ k7 T$ ~1 s
TEA(const byte *key, int round = 32, bool isNetByte = false); 2 T- i. P/ q, D
1.key - 加密或解密用的128-bit(16byte)密钥。
  R3 C& S8 \# q4 Q9 j! F2.round - 加密或解密的轮数,常用的有64,32,16。 ' `: C  z  Y' S, }
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
' j9 b6 }; i; L- X8 P4 D' J
$ R$ Z2 Z: O5 X: y最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ( O, P; j5 ]7 z/ y' U
2 #include "util.h" & d) @2 l& I' _$ `& L3 E
3 #include <iostream> 8 I+ Q- X8 r& y3 S
4  ( M5 w) ^8 A% g1 w) K0 O
5 using namespace std; + A  D8 \' e9 O* z$ l* R8 w8 }: W
6  # v" i% L( ?6 @5 |. E
7 int main() { + b8 J* \9 ?; I% n5 n' e
8  7 M+ ~; k5 K, b# m" n' Y
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
2 h6 q3 z. \: l8 |6 W; \10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
# {  t& {! \8 m: w8 g0 p( Y, w11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; - N: v1 c# O0 @% K3 ?" m- S" F
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; # B# y4 `5 `% \2 W; H# R
13  % E& G1 L: I' C8 Q
14     size_t size_in = hexStringToBytes(plainStr, plain);
( V" [3 C; T  F7 c, ?15     size_t size_key = hexStringToBytes(keyStr, key); 3 q1 T4 i; K2 T+ C, b3 W, n1 S; J
16  
/ @% u: s) B' X$ ]* x% I  F17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
5 z/ i, x( Y- L" d2 `0 b' E18         return -1;
- }1 e6 f9 n' Y3 |) D/ ^, P19  : v2 }2 K3 o3 Q4 H
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;   B! q+ X  T$ p) L
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
0 l/ a* G) M( c2 _  N; Q8 |$ _# K22  
# _# X7 D! W4 R# g  @4 Q23     TEA tea(key, 16, true);
- }9 m5 G  h( Z3 H& e24     tea.encrypt(plain, crypt); ! q1 {+ W" m' Z
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; " }0 O" O/ y- R! l0 `
26  + O( g4 K9 T5 A9 c
27     tea.decrypt(crypt, plain); . l$ L- C7 |5 }2 J
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
. G; K8 P" c( a' u3 S& Y29     return 0; * O8 B7 W- z1 ~$ v1 E
30 }7 ]1 D: j# p; O  ^; v8 F" A/ g
8 Z3 J. s  T% _& m; ?) v7 p
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
+ |  B$ \2 ^- V& X0 r5 J" T运行结果:
  ^2 Y# n  b6 J! n) qPlain: AD DE E2 DB B3 E2 DB B3
  G6 ~3 G/ [7 e6 {- z$ z  kKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
" c- l5 D, d- FCrypt: 3B 3B 4D 8C 24 3A FD F2 # h- F) O8 {+ P: D  Y5 Z6 [
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-14 00:26 , Processed in 0.025282 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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