找回密码
 注册
搜索
查看: 37406|回复: 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轮):& n6 D* S' a2 j$ b4 ^2 e0 p
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
) J! A" B2 w" q! g2 F# Z/ FTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
- s$ }: F4 B7 s0 [$ p( T之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
$ c! {; s9 ]) @! }% x在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
: Q2 Y8 q8 ^, N; k6 R; 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. / c0 V1 D( O# L0 A5 D* T# F
  2. void encrypt(unsigned long *v, unsigned long *k) { : }. ^& g5 u* X$ {
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ + g; W1 P% E  s+ n
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ % u2 {3 ~9 U: _  ?5 c
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    % U8 Z7 h1 x7 x1 F2 Q1 R
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    * S" A  ]) r" S$ Y
  7.          sum += delta;
    4 T- Z7 t1 V3 p
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    4 W/ X! U( x8 d# E: @! ?
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ( e! I0 _6 k# T8 k: v9 f! @
  10.      }
    5 y8 ]" Q! K+ n
  11.      v[0]=y;
    ! c2 I4 e$ t8 o$ A; c
  12.      v[1]=z;
    : D6 n  S$ r2 p# m/ H% G
  13. }
    7 ]- H" x) z; |6 C. y
  14.   
    % t8 ~' [7 K# W3 s6 g! X7 [
  15. void decrypt(unsigned long *v, unsigned long *k) { # ]: k4 f2 l' `
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ % w& j; Y1 R7 a
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ) |3 y# w/ u9 u% s, V
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ % X/ |' `: V  ^! X0 N1 n
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    $ h! G8 G4 v) M% ^) @4 p# u
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); & x1 ]" L# |" H, O6 ^" {
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 7 _8 X1 j9 J6 Y' a
  22.          sum -= delta;                                /* end cycle */ , ^7 z" s% w& |! c# N3 q
  23.      }
    5 j6 o# d3 c) s5 i
  24.      v[0]=y;
    8 ]2 ^1 i# R. s: @* m. u9 u2 N6 E
  25.      v[1]=z;
    1 u( E7 X1 w) ]- v- K$ X
  26. }
    ( D8 x* _% ^, t/ ?) F: t1 e3 o/ J/ N
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
) ]& K1 t9 G4 `7 B0 i0 H$ X1 N#define UTIL_H ; X2 ~5 D" a  w% E) v
6 N; y/ i3 P6 ]5 A
#include <string> 5 h% J$ r) R6 U
#include <cmath>
0 l9 k0 ?0 A. j5 K6 _( M. X( }#include <cstdlib>
& [& G2 F8 {# o& P: ?3 ^# ^% y. o/ L 1 h# E7 T% x! Q) z  Z, ~& q
typedef unsigned char byte; , k5 \! E, E; x- _. v: M; j
typedef unsigned long ulong; 2 l3 G& }6 n( \( h/ K3 [+ X, V
0 I" J' k/ F% i$ e' r: r
inline double logbase(double base, double x) { ( l% Z! {) N6 F" T  z2 F( ?. {6 s
    return log(x)/log(base);
* N5 p" O/ Y) Q; u& |} $ X% ~& I6 E: u: e

! y% d2 i7 r5 c4 Q/* 4 q- Z( V! G1 G  R+ H$ J$ y
*convert int to hex char.
: J( b+ a5 ^# u; H: i) S9 W- k. [+ D0 E, ?*example:10 -> 'A',15 -> 'F'
. D$ w' q: o# \0 d*/ - }! Z3 h& c; f) W! o+ X& s
char intToHexChar(int x); " I' M/ Z2 x  _9 r' R( f# Y( B

/ O" R9 Y* h) V& l. a6 r/*
5 I7 `  L9 V7 a5 R' ?9 t*convert hex char to int.
/ @3 Q, H9 [7 W9 [$ H9 c*example:'A' -> 10,'F' -> 15
) T. N, E% R# Y& C' p*/
& R7 X3 \( N5 y- z. _* w  Bint hexCharToInt(char hex); # R5 r4 Q0 n$ h9 i
  e' n9 L' \% u3 Q2 L/ I- k8 |% _. X, ?
using std::string;
8 m: x! C9 J* S. B2 i/*
1 \* G' R6 f0 e' h5 A*convert a byte array to hex string. ( ?6 J8 {4 i9 X3 I2 ~. L
*hex string format example:"AF B0 80 7D" : V) i# _; \; w, J4 h1 e" F9 v
*/
; f0 c+ N- p' Kstring bytesToHexString(const byte *in, size_t size); ; b( G2 J% t. X; Q9 j/ n1 I

" W" d+ q9 @( {6 X/*
! s! T" {% l1 Q; M; I: t*convert a hex string to a byte array.
8 r3 E0 H- f/ W3 n( y, n*hex string format example:"AF B0 80 7D"
! [& N1 F' b( t3 n*/
( i5 S, q/ g# x2 }6 m- X5 Vsize_t hexStringToBytes(const string &str, byte *out); 4 I/ G% ~! h) u$ M% m* j, \$ U* v

+ l) a6 N( h# ]5 y' c. Y#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
( V, ^! c) N+ c1 Y# \" _#include <vector> ; {6 [% B1 _9 f; m3 N6 U) N

3 t" N* L3 |" j6 fusing namespace std; $ [* Z9 X) V- n! B1 K! E, P

$ ]' \5 ^3 G* h" A9 f9 c+ Qchar intToHexChar(int x) {
4 Y' u# C1 l" j7 z( }% y    static const char HEX[16] = {
) V. p( V9 k; }9 k        '0', '1', '2', '3', 8 I( |$ G2 N, e5 Y+ e5 L
        '4', '5', '6', '7',
3 ]: S% \" t8 e- |) v+ v( \        '8', '9', 'A', 'B',
8 [# i( y/ u: K3 b1 w6 w# P        'C', 'D', 'E', 'F'
* ?9 U. G) `" S    };
0 O1 L8 b+ g( K% }8 b( B0 {/ \- n; V    return HEX[x]; 6 y( @, Y1 ?8 h0 n' A1 E. M
}
$ M0 V6 c" g4 o; ? / W+ c$ e2 |- H8 o0 z8 O
int hexCharToInt(char hex) { 9 L5 d' m; q" @' }4 r6 [
    hex = toupper(hex);
3 \: ?* p7 O+ m, z    if (isdigit(hex))
- o( l: S& h7 w" Q, Z        return (hex - '0');
1 z, [* u, c- ]* n. v3 {    if (isalpha(hex))
5 M3 A! x1 I1 B4 X/ I; q2 E        return (hex - 'A' + 10);
8 l$ S0 \6 p0 \: T) s0 |5 w    return 0; 1 n: j; ]2 o. H0 S1 G
} 1 A: B& L  G* @: T; ~

+ Q4 f$ E: J, Q% X- o- Lstring bytesToHexString(const byte *in, size_t size) { % S' A: [: o& e' n# C* K) K1 G
    string str; ; R8 z2 P9 `! @6 ~
    for (size_t i = 0; i < size; ++i) {
& e' B$ t8 N# B1 o        int t = in[i]; " L: T0 e1 k8 k/ A! F- t
        int a = t / 16;
% n# p, y) e, V1 H' i; |& r        int b = t % 16;
6 K) v5 t" r( O+ d        str.append(1, intToHexChar(a)); $ S' c7 |5 M4 F# V& D
        str.append(1, intToHexChar(b)); , A7 i" D4 y% R5 j! _) Q
        if (i != size - 1) # r% V7 }$ o( f+ Z5 R" l, z
            str.append(1, ' ');
# C4 c- Z2 \; @+ `' N% y' w7 H    } 1 _' ?: V/ l) |! N& w
    return str; 6 @5 l9 {& q3 V+ n, {8 G" l
} ; @5 s/ j, S: S% V1 L- Q! W- @4 X

9 |5 A$ Z$ B3 tsize_t hexStringToBytes(const string &str, byte *out) { 3 ?4 R) r% x- k& B1 F, w
) u+ \7 L6 L) H8 {
    vector<string> vec; : t% T6 ]( l4 K
    string::size_type currPos = 0, prevPos = 0;
! L- W& j7 h4 M: y( `, |    while ((currPos = str.find(' ', prevPos)) != string::npos) { + k& h. o0 W/ ]
        string b(str.substr(prevPos, currPos - prevPos));
3 t- U& D/ `- T* J$ C; g: Z        vec.push_back(b); 6 v. a$ t- F4 d9 G6 U0 I! X1 \
        prevPos = currPos + 1;
" b6 ^4 ?& T: C/ A6 `2 @    } 1 f. @- T5 D4 I* w
    if (prevPos < str.size()) {
. `2 A( f4 P3 p/ _% E4 K2 d- b9 H        string b(str.substr(prevPos)); 1 }! R0 y+ y1 @7 p/ A7 `  K
        vec.push_back(b);
9 L$ q5 Q# \7 n+ K    }
; t7 \7 m' r8 q7 O& ]: ~    typedef vector<string>::size_type sz_type; 3 S( }0 v1 m) j$ o% |
    sz_type size = vec.size();
' v: ~: K& |( }% y, ^    for (sz_type i = 0; i < size; ++i) { 5 ~1 X2 U8 ]8 U, U8 `! j! t  \1 A
        int a = hexCharToInt(vec[i][0]); ; b% f! r4 u; i% ?
        int b = hexCharToInt(vec[i][1]); 0 c' a5 W" H0 ~/ Q: Z
        out[i] = a * 16 + b; 0 d* [' ]4 K- X
    } 9 L* K; p" @: s
    return size;
3 x$ y5 n6 E0 j3 V- R}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
! c2 S6 {" p7 |' n6 @" M* S#define TEA_H 2 K3 S* \3 m! ?; p
* ]) D( n2 Y* v
/* : t5 v0 |2 b. p3 K8 v, e
*for htonl,htonl
, O8 l- ]7 f) u/ h0 |- b*do remember link "ws2_32.lib" 6 _: i3 n0 j& d
*/ , K0 c$ f7 J+ x0 }, k
#include <winsock2.h> + c% Q$ T+ F4 N2 g5 q
#include "util.h"
0 b: m1 ?- C9 Z
% B/ ~  z. K+ Tclass TEA { . \1 M; }& e+ M4 ~' a
public:
! Q8 ?! Q7 G' g7 C4 m1 h    TEA(const byte *key, int round = 32, bool isNetByte = false);
  |- b! b" G7 G; G  b) s9 {    TEA(const TEA &rhs); , G5 ^. [; r$ j1 P
    TEA& operator=(const TEA &rhs);
& P4 v! _, ]7 q/ {* S    void encrypt(const byte *in, byte *out);
2 ?. S7 m" v! [& ^' S- l9 F) ^    void decrypt(const byte *in, byte *out); ' F2 Z7 i6 D4 d3 U
private:
  C# J$ c6 j+ w& x& N* _3 \8 g    void encrypt(const ulong *in, ulong *out); 0 q( @3 V- W7 q6 T
    void decrypt(const ulong *in, ulong *out); + W/ {# M+ C* G) S
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
8 R5 N& A& {; \  X: D0 z    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } $ G% Q7 M0 E, P( t5 v+ _% P
private: ) k* W1 z$ [/ \
    int _round; //iteration round to encrypt or decrypt
& i. L2 L: D! o, P. ~5 u    bool _isNetByte; //whether input bytes come from network
4 X/ [& K+ l$ h5 J' R6 N0 n    byte _key[16]; //encrypt or decrypt key 1 S5 m& K* j* C
};
$ p+ S: C) m' b; G: D1 B ! I: f0 s& w" W
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 0 w1 r5 T9 ~( V" T$ k
2 #include <cstring> //for memcpy,memset # a" ^! n1 d- E" D# l- p! |4 c
3  
8 W; Y! v/ {4 t: p 4 using namespace std;
% @. v, _& o* g4 X; ]" G- t7 i 5  7 |; F- P9 C/ R% p, u8 d) [
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) $ y3 i# G8 W% D1 X: d
7 :_round(round)
" s* w% S6 [/ Y; z 8 ,_isNetByte(isNetByte) {
( A8 V. c% k- Z" ] 9     if (key != 0)
* @( k5 y; |) m& P10         memcpy(_key, key, 16);
2 d# v( Q6 z5 _* l11     else 1 _$ l* I) j+ z
12         memset(_key, 0, 16);
  O1 L# y- T) r" F! v5 d13 } + e% ]" e/ t! K4 |- M! a
14  
6 D* @; C. c. a2 \' j; D' |4 f15 TEA::TEA(const TEA &rhs)
) u  d! u1 \' {" W: R16 :_round(rhs._round) : E: v3 D# u$ Y$ r
17 ,_isNetByte(rhs._isNetByte) { ( j+ E+ O* S! E# M* D1 A
18     memcpy(_key, rhs._key, 16); " ^  E7 Y9 P* \* N8 q
19 }
) y1 m# @- H2 X; J/ h9 C; R+ v  t20  5 F8 ~# W- D8 S" n( _
21 TEA& TEA::operator=(const TEA &rhs) {
. U- M0 j' Y) E9 r5 G9 \- v) x. u22     if (&rhs != this) { & |0 Q& K$ c8 c, r- X  k
23         _round = rhs._round;
: `  W  }+ A; O% w8 G; O24         _isNetByte = rhs._isNetByte;
% P$ S0 p' n3 w8 t/ ?2 {! w25         memcpy(_key, rhs._key, 16); 1 J4 }, `2 A* k9 A9 g2 L& h! M
26     }
9 n8 Y5 R& S" b6 }) D27     return *this;
, v6 `) D9 J6 B" I" w% X28 }
3 @2 z+ B- B7 O. `6 Q29  
) W! M% Z. B3 e3 d$ z2 v, R/ {  C: P30 void TEA::encrypt(const byte *in, byte *out) { " K& V7 R! A/ p3 B- n
31     encrypt((const ulong*)in, (ulong*)out);
. m( S5 r7 p% A+ Y1 b( E' j$ a32 }
) k; E2 ^* n& d' v33  3 t/ y3 |! h4 d# z+ _
34 void TEA::decrypt(const byte *in, byte *out) {
+ a6 e, I* E  M& P  M) k- U35     decrypt((const ulong*)in, (ulong*)out);
. K$ e" q3 G6 K5 L9 i) a6 y36 }
3 I! ]6 T3 N" [37  
1 W( ], l" ~2 b) x" e8 q! [38 void TEA::encrypt(const ulong *in, ulong *out) { ! `3 C" N1 U1 `! ?( T; |1 b
39  
$ k2 V- }* e' {! }9 w40     ulong *k = (ulong*)_key;   ^, H! Z0 e: N8 ~
41     register ulong y = ntoh(in[0]);
! |2 O$ R3 S2 R0 S) B% c% s* v9 ~$ ]42     register ulong z = ntoh(in[1]);
! W- ?, G3 u, b4 ]% m43     register ulong a = ntoh(k[0]);
, }- V. d' G. ]& B4 m+ N* G44     register ulong b = ntoh(k[1]);
& f7 k$ n" `. Z! ]% ?! z! S  p1 o5 Z45     register ulong c = ntoh(k[2]);
) |; W, Q. z" w1 M, A46     register ulong d = ntoh(k[3]);
# Y. T7 V9 X4 f- L47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ) i2 m" t( ?1 v( _: E7 {' f- A. |. W
48     register int round = _round;
5 r. c/ R# G7 \) E! F49     register ulong sum = 0;
  e( S. f9 ^/ D' s4 y50  
* ?0 X% h3 O. J2 @) T51     while (round--) {    /* basic cycle start */
4 j& g* ~5 h) ]/ {52         sum += delta;
% w: s# Z( P8 o3 ?+ @53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); % ~0 q0 o6 i5 u
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); : y( e7 h# v. M! o* W
55     }    /* end cycle */ 6 _) ?1 r2 Y: |, x" z5 v4 c: n
56     out[0] = ntoh(y); : D5 K8 F2 B% R' Y+ h; M
57     out[1] = ntoh(z); 5 I( y2 V$ W( x! t  q
58 }
# F4 {4 _( w% x; @$ E1 g* ^9 l59  
2 k% i3 O; N4 F2 {, }7 {  _, \" b60 void TEA::decrypt(const ulong *in, ulong *out) {
- m# O# B7 Z4 Q  B. o61  0 i0 x: g& p( o  S# u% b
62     ulong *k = (ulong*)_key;
3 I/ i: [1 r, L& X" l: E! P' N63     register ulong y = ntoh(in[0]);
2 n$ o# U9 L4 s1 y3 I0 ]64     register ulong z = ntoh(in[1]);
8 m4 `# W8 x0 o% h' e+ ]65     register ulong a = ntoh(k[0]); 1 Y  }. E4 u- u: t2 W8 y0 F
66     register ulong b = ntoh(k[1]); , E  @+ p1 N6 [9 r  h  m/ Q
67     register ulong c = ntoh(k[2]); , M3 \% x0 x* G% {. i% F
68     register ulong d = ntoh(k[3]);
6 k- y- w& j$ b& H3 y3 N! O$ z- u' e69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . Y, u* r, c9 p- H+ F( X# y4 h
70     register int round = _round;
6 i8 q2 V- e; d  i8 J! T71     register ulong sum = 0; 5 {9 |6 Q9 \/ Q! Z% Z' _
72  
2 Z+ E. ~& E) [. s7 H73     if (round == 32) $ B5 r2 G+ t- W; ?5 v9 {
74         sum = 0xC6EF3720; /* delta << 5*/
  x8 u5 o, i$ O; y9 ]5 s75     else if (round == 16) * O* O7 ]9 T- [( s
76         sum = 0xE3779B90; /* delta << 4*/
- k) ]: E* j1 E; D- }77     else
# k- S- @% S* T- B78         sum = delta << static_cast<int>(logbase(2, round)); $ t3 }, e/ s- e$ `2 a
79  ! X: f, k3 d* B
80     while (round--) {    /* basic cycle start */ : v) K+ _% `" C4 o
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
0 E' x' @; P  f2 O7 i82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
* R4 s8 M# |% |6 [- t/ P/ a83         sum -= delta; : N4 J0 V9 n; ^$ k5 s: L+ R
84     }    /* end cycle */
9 f7 v( E, T* E5 M5 s8 Q9 @6 q8 i9 M% a85     out[0] = ntoh(y); 0 P7 v, e/ \) v
86     out[1] = ntoh(z); + t) b6 h; s' X* r
87 }2 Q) ~* @, T7 O% L; `  k3 [

5 Q) u: n# C3 ]7 L需要说明的是TEA的构造函数:
, _( Q) F. `8 A; c, C4 Q8 vTEA(const byte *key, int round = 32, bool isNetByte = false);
4 |9 z( S9 H9 M" V1.key - 加密或解密用的128-bit(16byte)密钥。
3 Y& o( y) ?) R1 l  D- \( I  x2.round - 加密或解密的轮数,常用的有64,32,16。 0 H; l$ X. t: p- u! k* i
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! + X2 X  d; V& Q7 a" ^1 H2 p
2 o) [4 I* ^1 O5 B' `: ?$ {
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
5 A& V5 W+ p! c  H' N 2 #include "util.h" / a; {5 `) b$ H0 s+ J% l. c9 K0 ?6 g
3 #include <iostream>
- N$ M8 y* F6 x* z 4    B# P$ B1 y4 _% y# {7 L1 N
5 using namespace std; : v2 Q$ v0 s/ G4 f7 s7 U; a7 C
6  ( p6 C" U" F# A- u3 k
7 int main() { $ [/ ~1 D1 ]* w
8  5 d6 e0 D% j' ^% Q+ \3 g' M- B
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
0 z/ }! K/ a' @& _) v/ @; h& J9 B10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
8 q7 O5 q4 @5 P7 x( B' T& R& F11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ! N6 d% H# P7 ]% @6 Q! j! n0 J
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
  O& S( [% x2 g* m13  
% T! v* c; f0 k& \: h14     size_t size_in = hexStringToBytes(plainStr, plain);
; i- G2 n& Z( V' `( Y4 F, C15     size_t size_key = hexStringToBytes(keyStr, key);
9 H" V+ ?$ C' x2 R- y: K  X! F16  & J5 v8 f7 Z) p
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
4 ^4 ]4 j! l% g5 Q; z3 b# l18         return -1;
/ s" m; W$ a( D9 P5 k3 s8 T2 A19  
+ A' |- T1 \* c/ I$ N3 U20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
$ o$ Q+ ~) ^7 j6 \6 ^- e& l0 O, |21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; % J) u3 \1 X3 K8 s: P
22  
! U. M1 o6 U0 Z0 `- {4 c  [' {23     TEA tea(key, 16, true);
. ?% u9 j+ ?2 s# V2 {3 q6 G24     tea.encrypt(plain, crypt); ! E  S# @; C  D
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; + x9 v* `) c, t, p  v1 K2 w) d0 Y. g
26  
& Z8 i0 {) G9 ?  e27     tea.decrypt(crypt, plain);
5 d7 w+ r8 U3 I- p28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ( R; Y4 e* z9 a
29     return 0;   ^6 N- s3 o6 q* `$ k; L/ P9 _
30 }
. V0 e+ [  c4 B) ^  Z/ \6 q. y5 n/ i# T  L; d4 a' k; o
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx: w3 w9 ?% c5 |; ?" i
运行结果:
) V. o  B8 ?* Q3 Q; T7 T3 Q; XPlain: AD DE E2 DB B3 E2 DB B3 3 H! b& g1 x' V, s: A7 Y& o
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 " s8 i: [4 q: I! d! R
Crypt: 3B 3B 4D 8C 24 3A FD F2
# ~+ R* i# G* \* C  V, d8 TPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 15:45 , Processed in 0.019948 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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