找回密码
 注册
搜索
查看: 37834|回复: 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轮):
( Y* }7 P" j6 U微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 5 v' q7 \. h8 r6 j8 ]; Z
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 & Q  T- {2 Z# F1 \8 g9 K
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 - t1 h- |/ K6 u& C0 Y+ z
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 . C4 t# b6 g% f/ P. j9 ^
在 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. 8 E0 v/ T; x8 p& a4 b
  2. void encrypt(unsigned long *v, unsigned long *k) {
    : |  I$ D  |5 k. h: i' e# m  [9 P
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    6 w3 {8 _& s1 J8 W0 L
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    5 l5 a) T$ s. ~8 U' \2 Q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    / F9 w7 e9 M( |( c7 ?( G5 \7 {
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ! i$ b' k/ A6 i* g( @
  7.          sum += delta;
    5 |+ L: I, Q" s# z6 e
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); " P0 K4 }6 g4 p; u7 L  e8 {
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    : m1 i1 D( {  B& }7 g0 ^7 B# z
  10.      }
    8 ~, E* \2 V% d" }0 g
  11.      v[0]=y; ' k7 P6 h% K' f; O
  12.      v[1]=z;
    , x1 H# T/ ~/ u! d
  13. }
    * _* }, k4 `3 m9 e3 K' C
  14.   
    # m4 M4 `  ~* Q& P0 g4 l. A
  15. void decrypt(unsigned long *v, unsigned long *k) {
    3 R( U" K: {2 X7 @9 ]( v
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    * u2 [5 G! ]. a% x1 Y- R/ Q) p$ X
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */   c  M+ i# H1 M
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ' _  x: I$ j8 J+ n, _" ?
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 0 _7 A. @  J' H7 b; Q9 F
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    # F! c2 R) x1 O+ D$ _
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    4 J8 o0 f$ I, y1 I
  22.          sum -= delta;                                /* end cycle */ : t. V( a5 m& Q
  23.      }
    " S' E5 X) M. t# q* b) e9 a
  24.      v[0]=y; " Y2 b; D- ]. d# z
  25.      v[1]=z;
    % m6 D9 W: D- Y
  26. }
    6 E4 R3 F( C, m" X# t' j8 W! [
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H * f/ K  G1 `* [% Q' r. D: j
#define UTIL_H - _: S4 T6 |3 M3 o9 X" M

' g- |8 b" c8 j+ O! q9 B9 M5 k$ C#include <string> 4 U8 l7 o6 `6 ?: v- O  Y' M' o8 f5 G
#include <cmath>
& @7 u. H2 `. Z: b  d3 V& {#include <cstdlib>
6 f& j/ d, S, c7 o! j+ | + e1 H3 A7 h$ X3 b7 p) t- T+ [# M
typedef unsigned char byte;
5 O% j$ M% A+ G$ L+ atypedef unsigned long ulong;
( N9 v/ u; p8 w  J7 ? ( q+ X) ]. J$ v+ E! j; O
inline double logbase(double base, double x) { * X/ [: _7 q7 ^1 Z8 W
    return log(x)/log(base);   o1 ?. h8 w# @
}
4 q0 ^4 \4 n$ k & o" d7 q( R6 f) l$ l0 I/ w; G
/* 0 w% _2 C" ^0 y' k& e& ]# [; v
*convert int to hex char. ; H/ ~( K2 j! l$ ~& z. \" m
*example:10 -> 'A',15 -> 'F' * e0 u; b) v% ^: H( b3 I! R
*/
0 a* f) K% [  S! `char intToHexChar(int x);
4 {: u1 E  B& j; O1 T, F
! x) c; Q# Z) }( M: ~' q/*
: l  n# R0 S% q% U*convert hex char to int.
$ ~' W7 Z+ V& T# w/ a, h( y*example:'A' -> 10,'F' -> 15 2 N& H  o4 e( H7 E  k
*/
) b* u' ]7 o1 W- A( dint hexCharToInt(char hex); 7 M' O# v) J/ H  n1 o+ @

! n# E3 q* T6 A+ I& U$ n' H5 Ausing std::string; ; R1 q$ W7 p, s# P* f3 l2 s! \) ^( q- `
/*
& S; T  Z% M' F* w: Q9 n*convert a byte array to hex string.
# s3 K! r9 T' k- @$ l. T* @3 p*hex string format example:"AF B0 80 7D"
) T6 f. R# R- J) u5 r: P9 Y*/
; ?! S* u) z7 V: G1 kstring bytesToHexString(const byte *in, size_t size); 6 |* T, `7 M2 j

% A$ u) V3 }9 U/*
: l8 l7 b2 D' y*convert a hex string to a byte array.
2 k6 h2 p0 t$ A5 J9 T0 H! s6 @1 h*hex string format example:"AF B0 80 7D" , W; i- l$ x. W: D* A
*/ ) u6 }, Q% \4 v& x; Q" c  v3 E
size_t hexStringToBytes(const string &str, byte *out);
. [7 S; _0 |$ _! m, @7 [3 A5 j) ^, q ) z2 J% b5 ~, j# d( u
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
) C9 h- p# E- Y, e$ Y# @#include <vector>
; V, w, X( {% o- D% G) j ' Y: I+ I. B7 K& z
using namespace std; 8 B6 O* F5 j+ _. d, c
8 U' V/ l/ Q2 y* l
char intToHexChar(int x) { + @9 o- y7 ~% j5 c, }. c/ x9 x* z
    static const char HEX[16] = {
. |# m# f4 V# z8 w        '0', '1', '2', '3',
0 h4 p$ j4 q; I- j0 j; `        '4', '5', '6', '7',
* Z4 V! T/ O& I6 Z        '8', '9', 'A', 'B',
) F# N# w. G( {/ e6 W( R# j8 b8 e        'C', 'D', 'E', 'F'
) v7 }2 p2 L0 r6 _' z    };
* R$ X& T7 r2 N    return HEX[x]; 2 |$ u" _: Z. C/ y
}
2 p: I( z0 G- g' z2 K- @0 { ) m  k* X: n: x  y
int hexCharToInt(char hex) { # @0 z( v8 {- o
    hex = toupper(hex);
6 ?, p+ {+ X% n    if (isdigit(hex))
$ }( G' J, y, {! g" S( _        return (hex - '0'); . m; Z0 X% b4 F7 E3 f
    if (isalpha(hex))
( |* s+ }9 r$ z, u9 ~3 B" J( ]        return (hex - 'A' + 10); / b' c0 n" k7 A/ |+ N
    return 0;
  y# y: d$ D# M! {  J' x, [}
3 E# B; J- @4 a5 V$ x( P8 k) d . {$ H1 t( j4 H* A. {
string bytesToHexString(const byte *in, size_t size) { $ G" `1 T) z7 {  Q. c
    string str;
" E+ r) v9 o( R    for (size_t i = 0; i < size; ++i) { 4 t9 X, e; j6 b
        int t = in[i]; : b. o; d% Y# L& B  D8 v, k
        int a = t / 16; ; o3 X! |( ]4 _
        int b = t % 16; $ G# X$ f  j! S
        str.append(1, intToHexChar(a));
" i% R2 s& l; X! c        str.append(1, intToHexChar(b));
2 @1 V0 v7 s! Y7 m7 x' R/ S) U        if (i != size - 1) , A* R+ f1 R; ^1 e# q" I- O0 j
            str.append(1, ' ');
6 a5 r, @6 _4 y5 j( [) u: z; V    } / d' \& ?( M* H5 ^2 B8 w
    return str; 6 Q% ?8 E+ q  b( y4 i8 ]% e
} 6 H- Y* b" `  v* r: ~
7 l4 F2 ?1 A/ K, T: l
size_t hexStringToBytes(const string &str, byte *out) { 5 O  H# p. {" u

0 ^9 [8 ]0 Y& w9 v    vector<string> vec; ( _3 m4 |6 }3 w& |1 Y- V% G
    string::size_type currPos = 0, prevPos = 0;
  b9 R9 N# B8 P) i1 i8 j    while ((currPos = str.find(' ', prevPos)) != string::npos) { 3 w: V+ x; d( }
        string b(str.substr(prevPos, currPos - prevPos));
- u8 b1 G+ v* W" E1 b9 |) @        vec.push_back(b);
+ n7 v3 s- T* M+ C- @, k        prevPos = currPos + 1; ) L# I1 S+ k7 l- C' I6 w' t+ T
    }
! D) F4 b4 l3 T3 ]- _- F! _% M    if (prevPos < str.size()) { ' k6 C; z% g; Q( v0 p+ \
        string b(str.substr(prevPos)); 3 d$ t0 u9 [4 q$ I7 Y8 {
        vec.push_back(b);
. A, i  ?' C9 Y9 h    }
, L! q* j& `) x3 {    typedef vector<string>::size_type sz_type; : l0 L7 Y  v# o# q# W* |
    sz_type size = vec.size();
3 m. N  X; M* r5 P% D. T8 D    for (sz_type i = 0; i < size; ++i) {
) R) z2 a! {) n, @8 z        int a = hexCharToInt(vec[i][0]);
+ Z+ k  b5 Y' k3 b$ j: @; n        int b = hexCharToInt(vec[i][1]);
% }% D4 K8 k; ^% _( E- V3 Y0 R        out[i] = a * 16 + b;   d) `! M( O+ C
    }
4 ]& T6 G: h/ w9 j    return size;
( k6 G* r+ T, [. [1 d1 h}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H . \. c. ~3 G2 V' S: P
#define TEA_H
# u' {5 p; Q2 c! f- f% k  s2 V6 H$ t% k 6 z, u3 Q1 M8 P/ M3 x1 H" T( I
/*
' x9 m* o# [; C' U/ e6 J) D*for htonl,htonl
# n/ C+ Q8 O8 W*do remember link "ws2_32.lib"
! p# z9 A+ q2 g- p% d! `*/
9 D1 Y  U, m! ?, b  ?#include <winsock2.h> 3 z$ [) [/ e1 M/ M/ Q
#include "util.h"
- @" W& u1 w) \9 t- ?  K. y. N : L/ |# {& L1 N' i+ p
class TEA { - P2 B/ T9 O* w6 Q# N
public:
- Y( K" D6 a% B& J) y: V( A6 R" _) |    TEA(const byte *key, int round = 32, bool isNetByte = false);
  Y/ f9 b0 c. d6 p  U    TEA(const TEA &rhs);
% b# d6 m/ r( z5 z5 o    TEA& operator=(const TEA &rhs);
1 b  ?4 E, d% d- M, Z4 f$ c! f    void encrypt(const byte *in, byte *out); 7 E  c0 q, W2 J- K% j1 D) q  k
    void decrypt(const byte *in, byte *out); + E; [5 _. Q4 R
private:
7 \9 d7 D% O4 H8 E0 G. `    void encrypt(const ulong *in, ulong *out); 6 Y& `/ y5 v& G  A( `- s$ ~" F
    void decrypt(const ulong *in, ulong *out); 5 i) {" _7 C- W! C" A
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } & X* z+ \  v2 c- A* M4 E, K
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
# A1 @" x; L$ ~' J( n  G9 Pprivate:
0 o9 V2 |+ [3 Y4 I    int _round; //iteration round to encrypt or decrypt 3 Y' u4 ?, k2 P, R' _  j! M& I
    bool _isNetByte; //whether input bytes come from network
  {: l, z; J2 a( q2 o) S    byte _key[16]; //encrypt or decrypt key 5 d" C# O+ N6 x5 W- m" @* K
};
) g! b+ k' X" O$ N% u, f
, e! J% d' M$ I7 h+ Q+ G* j#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
5 t0 I- r1 \4 L# D( H  v 2 #include <cstring> //for memcpy,memset ) k- L2 x! Q7 p& Q# c- I: W5 Z& c% @
3  / u4 L4 I9 k6 p/ _; {
4 using namespace std; 1 O* N4 B7 n+ X8 j  {4 t+ B8 d
5  
+ N# }) ?3 o! v2 @) a 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 3 x9 M0 S1 G. W$ K4 E& L$ N" T
7 :_round(round)
( n* }, p: R3 u; B. C- l' }  ?0 O 8 ,_isNetByte(isNetByte) { . t3 R# g0 j/ u; o3 F3 _7 L' b
9     if (key != 0) 6 H1 t# B8 Q" H' R9 U# G3 E
10         memcpy(_key, key, 16);
  w4 g2 F; e$ |( c' l7 x11     else
" p, ^3 |" G& X/ m+ r, I12         memset(_key, 0, 16); * k, {4 e: }; l. d& h9 e- l
13 } & k, m& `" d( P. v" \9 g
14  8 B0 q  y+ H4 K4 N8 a6 `
15 TEA::TEA(const TEA &rhs)
% u. d! j  k+ ?3 t% e8 _! f16 :_round(rhs._round) 3 e8 [9 Q( b8 ?
17 ,_isNetByte(rhs._isNetByte) { 1 [! _. V" _* g0 d
18     memcpy(_key, rhs._key, 16); & K5 ~0 S1 Y6 R4 R% ^  [1 K
19 }
+ G9 O! J, \2 B. y# i4 x20  
6 A0 ]- ]9 W( K, l  B7 y% p21 TEA& TEA::operator=(const TEA &rhs) {
2 w, H9 M& L8 i" }22     if (&rhs != this) {   M* m* i6 w( R/ v, K3 S; C0 n" |3 A/ w
23         _round = rhs._round;
! ~' K9 q* y7 _7 j4 J24         _isNetByte = rhs._isNetByte;
4 Z$ q( @) Z! b2 C) L/ g- G25         memcpy(_key, rhs._key, 16); ( D- q1 u# a4 R3 P. H9 E
26     }   y. b' n& j6 a3 L5 j
27     return *this;
6 u: {2 k6 y  X28 } 3 I( c$ R* n5 K
29  7 ?0 }) ?- `& y" Q
30 void TEA::encrypt(const byte *in, byte *out) {
- c( b% G' q& c4 Q( R  h8 e! C31     encrypt((const ulong*)in, (ulong*)out);
; Q* `$ X- ~; r' q: p* E32 }
+ {( |  O6 e$ ~/ y33  
/ Z7 O# v! D$ A( O' o, z) h34 void TEA::decrypt(const byte *in, byte *out) {
1 t" D6 |4 q9 ?' P# C2 v3 J35     decrypt((const ulong*)in, (ulong*)out); - b* e% T; ?" L# l
36 }
- X8 _* ]3 ~2 m) k37  % R+ t* w( L! ?( E" k- X
38 void TEA::encrypt(const ulong *in, ulong *out) { * G2 _4 z# l2 z5 v5 E9 g& ]1 {& O
39  
3 z5 I, Y4 B1 |40     ulong *k = (ulong*)_key; + L- ^2 t$ T' R, \/ f
41     register ulong y = ntoh(in[0]); * D' j% q. j7 U7 l  F8 \
42     register ulong z = ntoh(in[1]);
' t9 n5 l+ f  I8 {. @3 b/ h" F& ~43     register ulong a = ntoh(k[0]); " Z) E5 ~7 g( B& O* T7 W
44     register ulong b = ntoh(k[1]); , e  W% S$ v+ }
45     register ulong c = ntoh(k[2]);
2 S: Y- r! l( L; }' o' o46     register ulong d = ntoh(k[3]);
) |" I! ^* a5 ?% |2 k4 ]" i$ b47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 8 U' v: L: N4 J( r* [" E1 `
48     register int round = _round;
- H& F( G6 V3 a49     register ulong sum = 0; % E) c- h& k( F
50  
6 M* {' j3 f* ~/ W& P) I51     while (round--) {    /* basic cycle start */ 1 h- J* d/ V8 {9 m
52         sum += delta; % Z; t, y( W; ~
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 7 t* h5 _  _# Y3 u2 k
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
5 M+ Q5 m2 [6 M: g# k55     }    /* end cycle */ / ?$ i6 H8 H5 I: X
56     out[0] = ntoh(y);
# _. v) w4 A3 T, J57     out[1] = ntoh(z);
- Y) J: p) A6 }! c! L0 g& L! L58 } . C- t2 I2 ?$ ?+ o& p( E: W- ~
59  
6 ^7 X5 H/ i, l. N" D60 void TEA::decrypt(const ulong *in, ulong *out) {
* q: D/ s, ?0 Y# F- f: B61  ( H, |) A6 Z* F
62     ulong *k = (ulong*)_key; + T& @) _8 H8 I$ o
63     register ulong y = ntoh(in[0]); % [0 |- J7 e: B/ O1 z
64     register ulong z = ntoh(in[1]);
- d. }& d0 `1 c  e6 S8 H65     register ulong a = ntoh(k[0]);
- I& a% E" c; c- H) o) U, {1 p66     register ulong b = ntoh(k[1]);
6 w3 x  E' o. n7 y" U6 q4 X+ K0 O% Z- n3 R67     register ulong c = ntoh(k[2]);
# a' O& s3 |! D68     register ulong d = ntoh(k[3]); - @' C- ?! L- G- f6 e) l  I
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 7 r8 k5 w* M. y+ z9 E) J
70     register int round = _round;
, f1 M$ e  Y3 R) r+ J; f71     register ulong sum = 0; / I6 f: G! u- z1 [. R8 v1 O/ v6 D
72  5 t, c& e6 j7 M! U7 I& F) \% s
73     if (round == 32)
4 g6 q: Y) q% M! W: r! R74         sum = 0xC6EF3720; /* delta << 5*/ ! M# v1 A( U7 E$ n; P/ w$ d
75     else if (round == 16)
' o' J5 l0 X1 K4 V7 |! j/ f76         sum = 0xE3779B90; /* delta << 4*/ $ O) z# h6 n' ]1 i
77     else , `$ r1 [2 [4 M( {; a2 F& r2 x
78         sum = delta << static_cast<int>(logbase(2, round)); ' V0 t; Q" B" P5 Y3 H, `4 y, [
79  
+ {( O# S4 V! j; M9 }% O% }80     while (round--) {    /* basic cycle start */
* ^: r5 d$ Z: w! i# b81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! h. U! y7 G1 q0 ^1 N! p, N82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
. |4 k; e+ @& a83         sum -= delta; 6 l+ v  X3 Q5 k3 n5 Z3 i4 Q
84     }    /* end cycle */ : P- d# Q; l, ~- {
85     out[0] = ntoh(y);   I; E" N4 Z$ D8 m* o- P8 d! p- N
86     out[1] = ntoh(z); % |1 @% i; O  d* x
87 }
7 P6 b6 s2 l* W3 w3 i) ?) W! N5 ~) H# h7 r6 l9 L  P% S3 K3 p
需要说明的是TEA的构造函数:
2 e4 O4 Z7 [$ M( h' BTEA(const byte *key, int round = 32, bool isNetByte = false);
$ u( t& ^& L- ^. H  w1.key - 加密或解密用的128-bit(16byte)密钥。
; f2 Q6 X/ t7 ~% S2 R2.round - 加密或解密的轮数,常用的有64,32,16。 % `  n1 k5 a9 u' k: J% }/ f
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ) s! _& N6 o* V/ Q. g' }; k
' q0 H9 s0 j' h+ M. ~0 R) b" L8 B
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" & B4 m; C6 C% a4 |
2 #include "util.h"
$ g) @. q* t. `% Q  ] 3 #include <iostream> ; |  w! A; |6 T3 l; Q) @
4  9 H0 R% E, a2 a6 @7 T
5 using namespace std; " X+ Q3 x( A4 @& W) R
6  " V( E0 g# |" j2 U% f* V' c
7 int main() { 4 ?1 z! B5 L) t. e( q4 e5 [4 D9 Y
8  ' n- V, a) \# f: b
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); & a6 q/ V4 ~6 a$ Y; _
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 9 `) I' c3 a  t/ h
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ' D* E* _6 o! ]: H2 E& o
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
9 h& S! }% T! A2 `* o2 Y( n* F$ k13  9 D6 F& Z5 X# u
14     size_t size_in = hexStringToBytes(plainStr, plain);
3 `; G# Q, }8 M  a, w7 {# G3 O5 v15     size_t size_key = hexStringToBytes(keyStr, key);
) {2 K# J, |( e& l8 c9 s& F16  4 [% a5 d1 x. C! f+ F  M# B
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
! s4 D2 S; V, k18         return -1;
, t) |  Q( L- c! }& E% I+ H19  
2 J" {1 a( k/ O. c7 Z20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; " I6 \. F) r0 q
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
! m' E! a$ I0 Y! S22  1 \/ Q& [) J% x3 q% ~, i
23     TEA tea(key, 16, true);
+ h/ ?9 Q! b0 d8 T' D; O24     tea.encrypt(plain, crypt);
; ?2 S4 L1 ^1 D0 a) \, X25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ; ~, K/ a4 T8 K7 n, r' M& Y  i1 l
26  
) D% |2 U: n8 d( N/ d2 X27     tea.decrypt(crypt, plain);
8 U- Z$ n7 X( w0 g% K3 L28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
% _# t9 g7 Q) V! O1 U6 @29     return 0; 2 D. J  R, P7 x& }" Y
30 }
; r. |& ~% H8 @2 W1 O4 ]) p6 @# {( V, P: m, f
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx5 U/ g5 D+ ~/ d6 q7 c
运行结果:
$ {8 H8 w! o' c! n  M. NPlain: AD DE E2 DB B3 E2 DB B3
8 o0 U( K) K& i& z7 O0 hKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 , @0 W$ U$ N% y, E/ @# a: I
Crypt: 3B 3B 4D 8C 24 3A FD F2
" W. S+ Q; D* }  k) W( wPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-30 18:17 , Processed in 0.020556 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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