找回密码
 注册
搜索
查看: 36284|回复: 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轮):
) |8 \# e3 B% f: ^: i. t微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
2 g- Y* c0 M1 k; D2 R: B8 rTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
3 v3 K" ?2 `  k2 u, I! A之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 # K5 I8 X( t; g$ v, u( ^
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ) X$ W* j5 k1 R7 x9 J( A& S
在 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. ( ^3 D9 ]6 E$ B3 p
  2. void encrypt(unsigned long *v, unsigned long *k) {
    $ T, y: [& R: |, ?0 j
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ! e4 j6 ]* E7 i7 f, \" T
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    * P& v. T7 t4 M5 I
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 8 {- y# G3 F+ L& c
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    7 ~8 C+ ~' C  ]1 X4 ]% n1 \
  7.          sum += delta;
    2 C2 R' v! Y. b+ }9 Z
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    7 n2 U+ @# b* C/ L( j7 Y
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ - L+ D5 e4 _2 ^# f. {0 W4 b7 @
  10.      }   \/ ~/ f7 @, ~
  11.      v[0]=y;
    ; ~8 ?3 e9 r! W" e, P
  12.      v[1]=z;
    * n/ b8 l1 F/ N, u) k( u$ b
  13. }
    - ]! j2 b: Y" f# R1 J( w9 Q
  14.   8 [" U0 }6 h6 \7 m) n3 }8 A# G
  15. void decrypt(unsigned long *v, unsigned long *k) {
    7 U% W9 z: v* K4 j$ p1 N# E
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) Z0 r$ g# A, @% T! K6 U* C
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    6 H& X; ]6 P5 F0 \9 P/ M/ x
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    4 t% H5 [$ b) H/ d1 `$ h5 q
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ . v& z$ |7 ]# b( e8 x4 t9 l
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ( O9 }; W, E7 k
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & ^8 j! C# c* e0 D/ V3 |5 d# _
  22.          sum -= delta;                                /* end cycle */
    6 @" }. H/ t0 T# d
  23.      }
    # X0 E6 ]& Y: z  ]" R3 x1 e$ `+ A
  24.      v[0]=y;
    ; H! `: }3 [, `/ }  n" v
  25.      v[1]=z; 2 p6 J  ~! M% s4 j$ v; P
  26. }
    , x. `1 z2 B( a* V6 Z  I
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
/ z3 D# B' }7 w9 Z! F( H; U. Y#define UTIL_H
( m" M* b- o1 e$ b+ f" i' }9 b- W- J) \& A9 v
#include <string>
: M$ Z1 x. `* [" _; s6 g#include <cmath> ) G; I$ K; A$ K
#include <cstdlib> ; @9 I6 x! s# c3 k5 @

. f7 y5 Y* X: ?  z! M; k6 ktypedef unsigned char byte; 9 {6 ]9 J; |( q$ k: [+ u2 T4 l
typedef unsigned long ulong; . D( n* G7 S" _- o8 M0 ?

% Z$ t5 S# t9 qinline double logbase(double base, double x) {
! L; y7 P' i" H" Y0 D* P    return log(x)/log(base); , l$ q, y9 \/ z% q
} 7 b! C/ e" S5 N9 }! M
# l( L0 [3 _) A" X' c. a
/* $ F& ]% p2 O: a' `& t9 K
*convert int to hex char. : N/ y. `' j2 Y
*example:10 -> 'A',15 -> 'F' " S5 r! u/ N3 d9 g7 F5 L
*/
) ]! q& Z. x5 f1 V* C. O5 X6 \. n( kchar intToHexChar(int x);
. v1 f8 ^: }! f  y( r* g/ V( w
& M( ]" w# ~6 h/* 5 T* G5 t- x  M( G2 ^
*convert hex char to int. 7 F: ?2 o! v8 q& m9 P$ M
*example:'A' -> 10,'F' -> 15
3 `. y3 N# k0 J. p# S*/ 0 f: E2 [- @: i5 U+ q
int hexCharToInt(char hex);
$ \( N3 R7 ]2 I& d- B$ u
" i+ o* ~; J4 M5 _( jusing std::string; % O+ G( u6 J' F
/* # N4 Y; E5 C1 Y7 W8 M! l2 Z, R
*convert a byte array to hex string.
. ?' L* E- H# o*hex string format example:"AF B0 80 7D"
* q' M" U6 g( P% Z* m" v, H*/ & G4 d( k5 |# A, L- D
string bytesToHexString(const byte *in, size_t size); % a9 N- `' \# h! B4 U* i. m# X

) j2 m- l" x  B/ E9 z5 E) h; f/*
3 Q3 P2 J! X! _  m% `( V*convert a hex string to a byte array. - w( m5 {- S, ]8 `* ^; a1 [' p
*hex string format example:"AF B0 80 7D"
+ J2 T& _/ ?& b: t: ~8 T0 @*/
8 ?+ _* [* v. e1 G% ~size_t hexStringToBytes(const string &str, byte *out);
( b" N8 s) @! d0 M
3 i3 |$ O, M& r! i5 u) f#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" - p6 F, c5 _, m9 Y+ ^
#include <vector> % M4 P# y9 |; a8 }8 r

5 Z2 o% u% x% Y+ i  O8 Susing namespace std;
8 N7 c8 n( T8 m& H3 `* D+ _
  z# k) r: ^  ~1 Ochar intToHexChar(int x) { ; y4 d7 j& V9 ~, y( y! }
    static const char HEX[16] = { % M1 ^" B( q2 p6 Q- g2 _/ @
        '0', '1', '2', '3',
, M" F0 a8 V3 b$ L& B7 Q        '4', '5', '6', '7',
- B$ P6 `) D: s, Z$ i2 X        '8', '9', 'A', 'B',
5 `2 a7 e7 G8 d; t$ N) |0 C        'C', 'D', 'E', 'F'
! y+ f9 J. _* Z3 l    };
& ?* _9 \- O0 {& B# B$ w+ I    return HEX[x]; / m8 ~$ |8 U$ Z$ U# o
} & i6 y! {+ F+ b3 `7 {9 D8 C$ t

8 `# w3 d% Z' s5 w, T5 Gint hexCharToInt(char hex) {
9 b1 p) x) s/ G) u1 k1 {) ^8 V    hex = toupper(hex);
* l* @# p2 @1 _. A+ y. e: @    if (isdigit(hex)) * R! Z* i4 u( B8 ^. o
        return (hex - '0'); 1 F$ X$ y& \  u
    if (isalpha(hex))
( D7 h. o& t, z3 h$ I        return (hex - 'A' + 10); . S7 K  y# I% ]* X, t. b
    return 0; 2 ]2 t2 N0 G& _* D  S/ Y3 K
}
8 U; D& x! k0 E/ k' E* P& N9 W * e6 c2 X( }" g# R
string bytesToHexString(const byte *in, size_t size) {
8 ?; ^8 \: C8 g  U* @/ z    string str; 0 y- F$ @' l* r/ a; Y( n; W8 x2 ]
    for (size_t i = 0; i < size; ++i) {
+ w% t  B  H8 M/ X3 `, b        int t = in[i];
# A) N5 L% r# b# Q! L/ u, A7 @        int a = t / 16; 6 Q- _& c3 n! x0 {7 g
        int b = t % 16;
9 B, i8 T/ g# b" {/ c- h& t        str.append(1, intToHexChar(a)); $ |, D3 d% @: ]$ c  o- V* W
        str.append(1, intToHexChar(b)); : B$ P$ A4 C% ~$ `
        if (i != size - 1) " V3 t7 s3 S' b* G+ o
            str.append(1, ' '); ! Y1 J. o9 K9 X
    } ! a) _; n; E9 A9 Q6 u9 i/ H& u
    return str; ) L& `0 m) W: Y5 Q  G
}
+ J& A# L( a! }/ z, |. P
" i) v$ w- d- Z. B& t4 Z* Hsize_t hexStringToBytes(const string &str, byte *out) {
4 ~$ G! y# O, B5 | " j/ l! y% z' @# l0 @
    vector<string> vec;
3 c( g  g2 W9 n2 Z5 [* [    string::size_type currPos = 0, prevPos = 0; 5 J& B; B9 N+ t# U, b( a# R! D
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
( _0 [+ ?, i$ Y2 S: y        string b(str.substr(prevPos, currPos - prevPos));
6 R3 q* a3 u, B$ Y2 y6 C, F4 L        vec.push_back(b);
* u4 c* m6 d( g        prevPos = currPos + 1; 4 ?3 ^# q! y" f, K7 s
    } # u, l  n* F# |; q
    if (prevPos < str.size()) { : _/ T5 z$ Y" {# D% c# p( d
        string b(str.substr(prevPos));
1 t" {( c* Y) E) x7 C, v, I        vec.push_back(b); * r, L' Q* [  v; P4 g
    }
2 C( ?1 k+ {. `) ~! j    typedef vector<string>::size_type sz_type; / s4 A% n; [# d7 b1 B3 q
    sz_type size = vec.size();
5 A' D4 T  W% \3 h1 X7 k2 M0 W    for (sz_type i = 0; i < size; ++i) {
3 X1 D4 @" r) f0 E7 I" K6 \; I        int a = hexCharToInt(vec[i][0]); # v% N: r6 R) e# D7 x5 D1 a4 A
        int b = hexCharToInt(vec[i][1]); # X& F' S5 s# y8 q
        out[i] = a * 16 + b;
5 r* e. g# G3 j8 T+ \* ~    }
  P- @3 L+ s. Z8 c    return size;
; \! h/ T, `: c6 M5 x/ K* ?}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
4 k& Q# p% u" {1 h( v/ {: d#define TEA_H 8 d, d1 `" a( h$ |0 I" K
4 C. q5 Q" e- R4 p* H& w& V
/*
7 \* F# B) J* o*for htonl,htonl - H- ~1 L/ m5 o
*do remember link "ws2_32.lib"
) t2 \/ ^/ h/ m  D" V*/ # M2 T6 W7 G: w- W
#include <winsock2.h>
" M7 q( ^; F" w0 i- d6 v, Y#include "util.h" ' G& h5 ^3 E) o  {- f) t. A1 q
4 P* J% E; e& ?1 H" q2 w
class TEA {
2 v0 b! n/ z% s; d- J5 ~  Dpublic: : {/ z/ N# |- P$ s, x/ j! }
    TEA(const byte *key, int round = 32, bool isNetByte = false); , a/ }1 M/ Q) T7 R
    TEA(const TEA &rhs);
$ P4 n& i5 [' T" t    TEA& operator=(const TEA &rhs);
" Q9 ~5 U0 \0 @* Z$ g9 Q    void encrypt(const byte *in, byte *out); 7 L+ o/ G5 k0 ]7 b
    void decrypt(const byte *in, byte *out); 8 d7 H; d# S) ^, {6 H0 |
private: , ?) p/ L9 c/ `
    void encrypt(const ulong *in, ulong *out);
, \8 `5 O& k3 ^    void decrypt(const ulong *in, ulong *out); 9 n; q  s- `! a3 M1 W' {# ~# t* y
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
  m9 ]' R9 T9 }0 i8 g    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ( k+ t* r3 N; B+ c' u
private:
/ N+ Y  g8 q. R1 N5 A7 \3 B8 F# x3 i    int _round; //iteration round to encrypt or decrypt
: r# c% q! a  H- y8 z+ ~: U    bool _isNetByte; //whether input bytes come from network
4 M( O: k. L, p% U( P    byte _key[16]; //encrypt or decrypt key
: S4 B/ K4 E* r5 ?: F}; 0 W# \# L% c- \

- }: S1 s  H5 `8 q#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
, U; R& E! S; N' a7 U 2 #include <cstring> //for memcpy,memset
# o4 Q$ t' g/ T! m0 i' x9 I 3  + N0 X! o) i- i6 F" b( ?
4 using namespace std; * X4 L$ B* c' G" T
5  
1 B; y2 e6 c$ p) _3 a 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 0 q! ~  S5 q- h- Z" l
7 :_round(round)
3 k# `' a3 k$ O7 ]; ^: N& D9 g 8 ,_isNetByte(isNetByte) { 9 E6 [( M8 Q* [% Y
9     if (key != 0) 4 c6 e  N$ I0 f% K" R( R7 ^+ U$ P
10         memcpy(_key, key, 16); 0 f! w! a4 w0 o; X. F) |1 ]
11     else
' t7 x, d1 P: d4 f12         memset(_key, 0, 16);
! J. K! o- P" {0 }( o$ p4 y13 } - u. M& e: U7 M) J4 N0 m; G+ ?$ m
14  
0 t( G" s5 n' u15 TEA::TEA(const TEA &rhs)
9 f! j2 K& v4 B& A  a/ y+ J16 :_round(rhs._round) 5 i  _% N% v+ B* T
17 ,_isNetByte(rhs._isNetByte) {
4 |! E, P/ g9 W$ `" w0 A$ |18     memcpy(_key, rhs._key, 16);
% ~- a4 D1 B) d3 X% q# g- R5 M/ L19 } 5 [. L4 @+ g# }4 _/ |" _
20  " B3 V, I, c2 W! w) H! G
21 TEA& TEA::operator=(const TEA &rhs) {
+ `0 ?- j* l# U22     if (&rhs != this) { + c# ^, C* N2 E: f7 Y% ]
23         _round = rhs._round; ! W; v4 j8 U9 }( k/ E
24         _isNetByte = rhs._isNetByte; 5 A4 }) q. ?- z- V0 u% Q
25         memcpy(_key, rhs._key, 16); ) U3 I( d7 s6 W
26     }
$ D2 i) Z9 k/ q( O; j. l# |' h27     return *this; % ^0 L) ]% {. T. N3 W; A  t2 j" C% L
28 }
- ]+ e! o2 b4 z$ v29  ! B& n: R2 [6 m! O1 D: i% [
30 void TEA::encrypt(const byte *in, byte *out) { - |" m4 {* e- {! M
31     encrypt((const ulong*)in, (ulong*)out);
" h4 l" W: R. g5 |6 R$ G32 }
4 O  b+ @7 ~$ A  w33  
& l1 v: w+ ]# |% k34 void TEA::decrypt(const byte *in, byte *out) { . ?# I9 L) y8 ~% J  `+ S
35     decrypt((const ulong*)in, (ulong*)out);
' K& M/ M" f$ x+ u- O36 } ! S) U, U+ \5 }! R' u( h
37  2 @9 T9 c2 V8 G
38 void TEA::encrypt(const ulong *in, ulong *out) { 8 S9 E5 h+ C! o0 Q- b
39  
9 B% i$ r- i$ _8 g6 u; S+ G1 Z7 q3 P40     ulong *k = (ulong*)_key; & e& P! c7 f8 `5 `
41     register ulong y = ntoh(in[0]); & N+ f' |1 |) p6 L5 a
42     register ulong z = ntoh(in[1]);
0 n9 m" Z& y& M7 K43     register ulong a = ntoh(k[0]); / o* Y) C/ F7 g' J3 `9 c4 a4 M5 Z
44     register ulong b = ntoh(k[1]);
7 P6 E$ L* y3 ]$ W& [* [+ Z45     register ulong c = ntoh(k[2]);
) l# W- d4 k, ?6 b2 G46     register ulong d = ntoh(k[3]); 6 b6 n) m- [* O$ g5 W* q
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
1 W: F7 {& I* ]# u48     register int round = _round;
$ p3 p2 ]! A7 n- ]( I( E7 l  `7 Z49     register ulong sum = 0; 3 E" F2 n" m2 `1 T/ d4 i
50    P  q/ W8 O' X, x0 j4 m9 S" ^
51     while (round--) {    /* basic cycle start */ ' [, Z, v: M5 e2 x! q% ]; V: z3 N
52         sum += delta; ( z9 W- r# R( N* ?
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); + ~5 J: v. X  x; o, Z
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 3 N* l/ W' ^4 N  d6 F) p
55     }    /* end cycle */
' D4 w5 V' F% f: h1 R( E( j56     out[0] = ntoh(y); 5 P/ d0 h- X$ I- O' b
57     out[1] = ntoh(z);
( {4 O0 Z" h$ |- B58 }
) C5 f3 t9 C, l1 o4 G59  + F% `) C) e: C- ]/ c
60 void TEA::decrypt(const ulong *in, ulong *out) { , y# ~( ~+ a7 k: @: I
61  3 q, e; ?/ u' g0 R7 |& J7 [/ L8 {" ~8 c
62     ulong *k = (ulong*)_key;
9 u* I( p& ?" }& u  W; S63     register ulong y = ntoh(in[0]); * V+ I- u; ]* c. D& x6 z
64     register ulong z = ntoh(in[1]);
9 z. G* i( C4 x1 d65     register ulong a = ntoh(k[0]);
1 r2 ]! k, ]5 ~66     register ulong b = ntoh(k[1]); * Z0 j& t! C" d: P
67     register ulong c = ntoh(k[2]);
$ x3 G* i8 @5 J3 w2 [  E' M$ ~68     register ulong d = ntoh(k[3]);
" z1 u9 N2 g8 c  q% L( W) Z+ `! R69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . ?) a" t# H6 ~1 E
70     register int round = _round;
9 v, T0 H! `" q/ `; B2 p7 y2 z71     register ulong sum = 0;
1 ~. o) H+ v+ ?2 m) h72  1 c% u* ~0 R! c5 D* w
73     if (round == 32) 8 A* E# z/ }% ~3 `
74         sum = 0xC6EF3720; /* delta << 5*/ + S( P* f: j( i  H
75     else if (round == 16) & N) r! G8 G/ O; }
76         sum = 0xE3779B90; /* delta << 4*/ : @' i  s& r+ |  t) M5 u# {
77     else * N' f6 ~0 J5 C1 w- M  [
78         sum = delta << static_cast<int>(logbase(2, round)); ! Z  T$ W* w5 a1 N% c
79  + e8 U- Q3 W: O! T6 g
80     while (round--) {    /* basic cycle start */ / g; P* W; Y9 e5 n% Y% C" D
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
( W# ~! A$ i, v  k: X4 Y& M0 C82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); + F, l& @& x& G5 |( |
83         sum -= delta;
' m. X8 V! V4 ]2 H, j& {) R& t3 {5 C84     }    /* end cycle */
& I3 h2 @7 p- e. O7 ?8 B85     out[0] = ntoh(y);
; b2 B* U2 b' ~8 [2 C* j86     out[1] = ntoh(z); 9 R$ y4 H  e+ C3 r# a
87 }8 A: D3 c% K0 U: q7 a; |! W/ w- T
( |+ ~# D% p* J
需要说明的是TEA的构造函数:
5 r4 n9 E$ U3 m2 m3 H; jTEA(const byte *key, int round = 32, bool isNetByte = false); 1 c; H. i) ?$ Q3 i9 C: }. v$ A
1.key - 加密或解密用的128-bit(16byte)密钥。 5 K6 d) q. f9 s5 [
2.round - 加密或解密的轮数,常用的有64,32,16。
" M& }3 Y4 U" E7 U" L  M9 C3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
2 P* Q! @4 _2 I7 n% h; {4 Y. `+ T; m; ]4 A) r2 l
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ; [6 t5 `( y4 y; O6 @0 Y# M, U
2 #include "util.h" / }$ Y" [. X( ?! \. s, p
3 #include <iostream>
, e3 r4 [( N6 J/ { 4  2 i4 v+ B* w0 n9 s5 u3 I2 v
5 using namespace std;
% o" [$ \* @6 \' O2 r 6  - n  j" Z8 U) O" M  o; W  M, T
7 int main() { # V  |1 H+ F+ Z) p/ S, w
8  
- J( v7 d5 b# Q- [9 P8 U 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
: E9 @) T9 j- ?1 p0 ~10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 7 J; J4 r  j" I5 ~5 E, C% d4 S% S
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; # \, i- U( ^& _. H. T, t
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
8 \, k' P- \+ f4 V5 _% \  Y* \13  
; ?! v2 L2 ]; s; d14     size_t size_in = hexStringToBytes(plainStr, plain);
) t( ^" S& o2 u! I# X$ z3 z. N15     size_t size_key = hexStringToBytes(keyStr, key); # C) W% [+ f8 x
16  8 n6 D# b; u3 K  q7 D
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 8 @( m& S1 P# r( X9 f0 f4 v+ s
18         return -1; + o, k7 D0 E& [- u" B
19  
0 N; h! i6 W! X. H3 c. F* s  R20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; % ~( A& a5 m3 ?7 g7 m$ i
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ; t( s& ?5 O) ]& ~
22  
6 Q8 {7 L: c0 f$ I4 Y23     TEA tea(key, 16, true);
/ Y% C( }* r0 |1 t6 L/ S- t24     tea.encrypt(plain, crypt);
$ ^! e; G$ b7 R: n) Q8 U  A25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
; G# k" m6 E) K# U( r) @6 A2 X4 C  K26  6 Q% z  l# T  W/ f2 k
27     tea.decrypt(crypt, plain); 9 T5 A) S- M2 r# r& ~$ x
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 6 u$ ]' ?, s# `8 D  c2 q
29     return 0; ) Y2 |% \6 Z% v' H4 I
30 }
/ H& T3 z, v5 C5 i" }
2 O$ M9 B) B' N  M本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx8 y# y3 @+ x3 d" Z, R" w# X- i
运行结果: . Y4 S( U- R( ~0 Z, K' @' F
Plain: AD DE E2 DB B3 E2 DB B3   B9 Q4 I; V- L+ q1 z) U% m
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
: @( y& K$ Z  K9 W/ G0 |' ^; _Crypt: 3B 3B 4D 8C 24 3A FD F2
( p6 r& Y$ A9 N' W1 J' \Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 23:37 , Processed in 0.016198 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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