找回密码
 注册
搜索
查看: 37670|回复: 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轮):. w6 {. K, V& K: A+ z( s8 p  ^
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 9 v! b1 P: ]2 r2 a' |# Y
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
! T6 T& V% u1 C8 R* k- Y, p之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
; f) u$ e* C) c, R在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - p# H/ {& J' V5 |9 `) Y1 Z
在 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. - u( R4 I# T0 p9 ?
  2. void encrypt(unsigned long *v, unsigned long *k) { " v5 u, v+ W2 l1 c" k' {
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 6 \* `" h/ A& i1 W- y' V; h9 T
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ # ^" i6 w4 U$ R' a% b: ]
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ , c! m; W* C) _* t5 V% k" t
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    $ E- o7 F5 ~1 B  Y. E
  7.          sum += delta;
    4 c* q, e/ c" r! N8 K9 o+ e3 E
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ' W( K" ^! X- k# H3 Y: f; y' \
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    % i# {3 b; f) {' }
  10.      }
    6 \( g7 O* V, o7 h* B
  11.      v[0]=y;
    ( m4 b7 M; U' E- ?4 X
  12.      v[1]=z;
    ( x3 [: V4 g, \- `( `, {
  13. } 7 Y' W- d* A7 b( m  Y$ h0 U
  14.   ' t7 I* }; a6 b7 f8 j
  15. void decrypt(unsigned long *v, unsigned long *k) {
    2 r: G$ t  i' L( c9 t
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) @6 B  N1 C0 \- u7 k" @
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 4 Z7 ~2 K/ i6 X+ Y: c$ T' [1 i0 C. K5 V7 h* Y
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ % d; l# E& n- y( m8 J; C4 A
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
      N# W) k$ w' U6 ~0 J! l$ W8 ?
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    / y1 h5 N5 e2 x
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    , r4 U3 _+ s; v4 D& a
  22.          sum -= delta;                                /* end cycle */
    2 a- ?- ]' Z+ [: S  W
  23.      }
    ; P7 P; f1 e0 A2 ~$ u
  24.      v[0]=y; % C. P0 Y& L  B( z7 x/ \
  25.      v[1]=z;
    ! S" B* R$ S3 y& q
  26. }* ?7 j0 c+ F+ N
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H + r! H, s2 N& j' k+ l- U! i/ ]
#define UTIL_H
" e- |, `. g9 L/ O& B( n
0 a* c, B9 u6 o( [; u#include <string> 8 V( T' }# s4 z& G
#include <cmath> ; D6 N! |" b' G( F* X
#include <cstdlib> . l: ~6 e) L/ m; K
+ o  i9 `4 \2 S7 W
typedef unsigned char byte; - x: j  ]; A5 P+ C
typedef unsigned long ulong;
" C* Y3 U4 e0 p5 R" e9 p2 q' e ; J6 _/ L* X- Q7 f* p
inline double logbase(double base, double x) { : \7 v; E& i% n: \/ J) F
    return log(x)/log(base);
& v2 \' X. b0 |9 f* u5 l} & {; O8 a4 R, p( m7 I7 ?

( |- b% f" L7 l, y1 ~$ M/*
! B9 U+ G' [5 L3 P$ J, R*convert int to hex char. # H. Q% l5 r$ I, n2 X4 u
*example:10 -> 'A',15 -> 'F'
& p& k! ~- y& G0 b4 ]*/ # l, q- m. i" C, j9 D
char intToHexChar(int x); 9 `" p+ @8 f! b. I% W
! E# Z& U7 g5 ^) V$ q
/* , `. J3 c9 y2 ]3 a
*convert hex char to int.
8 @% D  H# j6 @: u) H+ _1 c*example:'A' -> 10,'F' -> 15
$ V' {' P! Q6 E6 X  |5 K) Y*/ 3 T3 U. B9 A( y  {
int hexCharToInt(char hex);
1 u- K. r+ \' K" u! j + o7 i2 d: _' q, e$ M. i$ T2 t
using std::string;
6 Z; V1 g" d; C4 i6 F/*
2 j4 \6 r% o2 [( P$ h*convert a byte array to hex string.
' |2 u& b( W1 A: |) n% @0 Z' y5 P*hex string format example:"AF B0 80 7D" / G7 \) B$ I8 e2 S2 `" o: y
*/ : J# P1 f; n: f  s
string bytesToHexString(const byte *in, size_t size); ) j* i( x. H) K1 N; o! O' k) V5 E
, E* S8 n3 ?5 M; G9 D. ~
/*
) g4 S  F; j0 Q. S*convert a hex string to a byte array.   y' k: P! [7 B* {* ]
*hex string format example:"AF B0 80 7D" 5 Q2 P0 Q" j0 M- \6 m
*/
5 V) @  _  e7 ?4 I' M4 msize_t hexStringToBytes(const string &str, byte *out); % I/ J8 C' w- l- f3 f
1 V1 J* D' z0 x$ G8 N3 C6 L1 x
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" $ p' D5 `1 t, S) O0 F8 i7 L
#include <vector>
( K2 w  U$ |1 a0 r9 z' h$ z4 t
1 _5 I7 J" }5 ?# \) A9 l8 j; @; O, @using namespace std;   n8 V0 d( P6 I/ p' f

4 X! K" ~6 ~6 H* M/ Jchar intToHexChar(int x) {
6 G1 J& N" z4 L9 \# G% @; Q$ i    static const char HEX[16] = {
/ I2 {6 L( Y& R3 |        '0', '1', '2', '3',
7 W/ I0 ^2 B% g        '4', '5', '6', '7',
: `9 }+ O  w1 t* O1 m        '8', '9', 'A', 'B',
% L. y7 G- w; c; T$ E/ j        'C', 'D', 'E', 'F'
2 _; A' g8 {2 R% `    };   b8 n0 o! y$ `) S7 l
    return HEX[x]; 5 K; ?+ u& V6 v" Q! s% ~; C) @
} 5 f: T0 T  y1 T' N0 s

& c0 S5 J9 l- }! a( H  rint hexCharToInt(char hex) {
6 U, O$ k+ I3 v    hex = toupper(hex); : k1 H% d" ?% J0 |
    if (isdigit(hex))
' u) B6 ]0 Y7 c        return (hex - '0');
2 E$ }  d5 R- }    if (isalpha(hex))
; a' [1 W3 d, F5 \' @        return (hex - 'A' + 10);
/ v' @9 I. [' X+ t5 O    return 0;
. j! D# m- b" s! t# R3 u: ]1 g} 4 z/ u8 S# w) |' Z, s

1 i8 C2 E( G' J3 l/ E- w& R) Istring bytesToHexString(const byte *in, size_t size) {
5 d$ X8 C+ ^$ \  I* @+ Q3 R    string str;
# w. }& e5 i$ k: P/ e& ~    for (size_t i = 0; i < size; ++i) {
4 x/ ?5 Y; D$ o& j( X! E5 r        int t = in[i];
( R5 @9 O/ _6 M% h0 R: z        int a = t / 16; % m' F3 a( N. h1 \1 B8 p1 ~
        int b = t % 16;
5 b3 o! r/ ?/ }  k/ D        str.append(1, intToHexChar(a)); 4 K* j: A6 {% J+ ^+ ^: }9 `
        str.append(1, intToHexChar(b));
& S7 f& ]3 `3 R, G2 {        if (i != size - 1) 0 D8 }  E, y# V# [
            str.append(1, ' ');
  Z! }# R9 {4 C) D% K5 O    }
/ |% t( w# T3 ]9 C2 ?) ?/ _0 s7 M    return str; 2 x7 U/ v: u5 G) ?6 I* Y' \5 S
}
- W# ]+ x8 i- |( A3 S
1 g8 Y7 l( {+ jsize_t hexStringToBytes(const string &str, byte *out) { 1 a4 G, k9 L; S5 g& f: o: s

4 C" e1 g7 [2 \5 T* B0 b# o& i    vector<string> vec; + v1 [9 P, [! |, Z5 `) c, l6 M
    string::size_type currPos = 0, prevPos = 0; * e6 \8 Z) }- K. v
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
0 I3 [* d9 @# _- V5 L  N        string b(str.substr(prevPos, currPos - prevPos));
" ?  b) y0 H- ]2 X% W4 ~" ?1 H        vec.push_back(b);
7 t' C" W+ H, F) }- s( U8 k- g; t        prevPos = currPos + 1;   o3 i, l1 `5 `1 O
    }
1 w) M$ x! t2 P9 e/ V    if (prevPos < str.size()) {
: p( S0 O/ Q6 Q) D7 x        string b(str.substr(prevPos));
; Y% b5 b" {4 M        vec.push_back(b); 3 a/ x8 U& Z& H8 _( t0 ~
    }
8 }+ E" e% O  Z  L6 B    typedef vector<string>::size_type sz_type;
' f; s& J' G9 ~3 V' g2 {4 k  u    sz_type size = vec.size(); : _' P# F! C. J% t, j
    for (sz_type i = 0; i < size; ++i) {
$ }. [+ Y9 i& W8 x+ o* ?/ z        int a = hexCharToInt(vec[i][0]); % A9 T$ {& `$ X1 z8 j& e2 X/ k
        int b = hexCharToInt(vec[i][1]); 6 W" f3 C$ y* r( ~
        out[i] = a * 16 + b;
% k) L0 d( S3 {7 Y    }
8 h) l# C; v5 u1 M    return size; , I5 \0 }; y7 p! D
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 2 z, w0 z+ ^# z8 \$ o/ X& [2 Z
#define TEA_H
! {4 `! f# F: j. U % h6 `! c, \4 y8 V1 k
/* ! ~9 ~# B$ j( F! Z1 o5 `3 t
*for htonl,htonl ; G% j$ c4 e8 l8 e
*do remember link "ws2_32.lib"
2 t; H2 C0 n$ Y' V0 ~/ z*/
" l  P) m+ u: ]/ y. ~( g2 d, `#include <winsock2.h>
! f: ^; X8 t% _0 h1 n#include "util.h"   M5 d. @3 F' f
* x1 u& L0 Y& ^" a6 Q
class TEA {
5 n2 _8 _7 p" v$ u! v( d7 npublic:
7 u0 k, Y  X; F; ^" N4 j9 W    TEA(const byte *key, int round = 32, bool isNetByte = false); ' x9 L5 o3 i" J' p1 b3 v' w( T
    TEA(const TEA &rhs); ; d& j$ j4 S4 v8 b6 L2 D
    TEA& operator=(const TEA &rhs); ( l% H9 }. Q8 j* \
    void encrypt(const byte *in, byte *out); % F9 d1 L/ q# b
    void decrypt(const byte *in, byte *out); 6 F+ v8 }( U7 s; z2 N
private: ( K$ T' c1 j. w+ q, @% X
    void encrypt(const ulong *in, ulong *out); , |$ j% d% J) h! A
    void decrypt(const ulong *in, ulong *out); # h: `7 ^4 r. C& t: a8 n0 a
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
" F4 J) L7 u8 n9 F$ S7 I    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
& z  n' ~; D' ^0 q2 Pprivate:
8 _3 A2 k6 T& y& s; T8 o4 d0 k    int _round; //iteration round to encrypt or decrypt
7 t' Q! A8 [! w    bool _isNetByte; //whether input bytes come from network
$ y6 b2 L5 ?2 o5 r* S    byte _key[16]; //encrypt or decrypt key
! Z! W( F8 P7 @2 ?$ Y};
* p( Q- x) z4 Y. S/ M1 ]3 c# Q
, e$ U7 A9 u! ^% `#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
, C/ |: z3 [6 v+ V( v5 d 2 #include <cstring> //for memcpy,memset
( [; k7 Y. g% s9 G  O 3  + S8 V/ q8 ~6 A! `3 U9 Y
4 using namespace std; ) Q( X$ m" H  a
5  
( ~1 R; e; y' n8 ^" b" J* p 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 8 t: s. J, ~+ m) m0 \* J/ `6 _( O" @
7 :_round(round) 1 K8 {: b$ ~5 ~& v0 J0 O5 H- K
8 ,_isNetByte(isNetByte) { - B+ @" B# F+ a5 U4 M
9     if (key != 0) ( B- [+ _5 ~4 u$ f
10         memcpy(_key, key, 16);
: J/ ~6 ^! @+ Q3 S11     else ; R+ H) Y' B5 E9 h8 v8 b" V
12         memset(_key, 0, 16); 0 T# [4 A( B7 m* n$ v
13 } ) U$ S7 ?  q, W# A0 Q9 ~
14  
5 w6 }; i# \% z  s: h+ l3 G3 w15 TEA::TEA(const TEA &rhs) ) W  s! |0 {' L! K  x! L
16 :_round(rhs._round) 3 l: v; h9 Y0 Y. H
17 ,_isNetByte(rhs._isNetByte) {
: Q5 y/ `+ ~# B' G, Q  x' E' U18     memcpy(_key, rhs._key, 16); / S" v" b: c+ v. J$ I
19 }
# M6 k  W, H5 H: U20  # r* d+ @4 U6 b! H* e+ ^# Y- s
21 TEA& TEA::operator=(const TEA &rhs) {
' N% R0 y# s. a  q1 g* C3 e' J22     if (&rhs != this) { ( x) C& ^* Z9 [- I
23         _round = rhs._round; 8 ]( ?$ H* o7 J: n0 @" R
24         _isNetByte = rhs._isNetByte; - h1 t: K& k8 ?4 ?& Z% D, V
25         memcpy(_key, rhs._key, 16);
% L4 a" m$ H8 ~26     }
; m) U- W5 S& R27     return *this; $ U" e+ i* G- a
28 } $ U6 h# |1 Z0 h6 g! d
29  $ V3 {/ R. L- L4 [* z3 g9 w
30 void TEA::encrypt(const byte *in, byte *out) {
) B3 r7 U- a8 f! h, M31     encrypt((const ulong*)in, (ulong*)out); 3 x/ t5 v5 s0 @
32 }
/ _, G/ R+ D" g# x. {+ q33  
+ s) @- z# x) k# e  G" @1 l1 h34 void TEA::decrypt(const byte *in, byte *out) { . p) B/ d. t* F/ Z" i, ]8 V
35     decrypt((const ulong*)in, (ulong*)out); ' J6 K8 l, R& c/ _7 v# Y
36 } + C$ d1 l% B7 R# P! H
37  
% R* u# l0 A% s+ J) S38 void TEA::encrypt(const ulong *in, ulong *out) { + ^% ]+ H5 {; U# H
39  6 }2 N" p4 c, w
40     ulong *k = (ulong*)_key; 5 g8 C! U9 r5 f* w5 [+ W
41     register ulong y = ntoh(in[0]);
8 x4 O# t4 }. Q5 i  B42     register ulong z = ntoh(in[1]);
7 K0 r) L0 f/ m! c& V43     register ulong a = ntoh(k[0]);
: m/ h: a5 s+ n  u+ }. ?, \& v44     register ulong b = ntoh(k[1]);
$ w" b' N& _0 P9 m0 j3 v. w45     register ulong c = ntoh(k[2]);
- F8 X! N, X6 `% h46     register ulong d = ntoh(k[3]); 9 C% z1 z9 X! J4 K1 O5 P. y5 [) W; o
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ( [3 w% B* j7 i( h
48     register int round = _round;
0 O2 R* ~, M; l0 f5 `/ o% ^49     register ulong sum = 0; 8 ]3 y8 m/ g3 t) C) K; G
50  
5 J6 `7 m$ U! n! e; ~2 ]51     while (round--) {    /* basic cycle start */
: r+ b3 J% W4 [& j52         sum += delta; ; C' P8 V4 P( b2 T5 l* T
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 2 T  d! E3 Q! j) N' a8 z9 G  J
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
4 C8 M6 o6 u4 U' ~2 [& c; f55     }    /* end cycle */ 5 h% I/ a8 @3 }: Q2 G
56     out[0] = ntoh(y);
5 Q. F- [; K# A1 f5 I. Q57     out[1] = ntoh(z);
7 o, U4 P6 m, C# D/ D( p58 }
* q) ~) ~! X4 f6 A( H& D59  " M* ?5 z; g/ y3 J' Y- D$ a7 Z& N
60 void TEA::decrypt(const ulong *in, ulong *out) { 6 p' t1 q3 e5 h/ v  T# f
61  
; P6 u3 H. e. F" A62     ulong *k = (ulong*)_key;
5 n3 h; j1 R7 x/ v5 R% N2 x/ \% ~63     register ulong y = ntoh(in[0]);
) q  A, U( O# \64     register ulong z = ntoh(in[1]);
6 ^  C* R9 I& u) V65     register ulong a = ntoh(k[0]);
) x% m# l7 m1 S% \9 I2 o+ t66     register ulong b = ntoh(k[1]); ) q) f, c5 m8 p3 p
67     register ulong c = ntoh(k[2]); 9 G5 H1 D, w- A; ~
68     register ulong d = ntoh(k[3]); , \5 o4 l! o' S
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
1 c  S) R2 M6 W) D3 T( i  h70     register int round = _round; % t% S9 y- Z. I+ n; {  G5 X
71     register ulong sum = 0; , D! I* R" K( n1 S
72  * r2 ~/ h; B/ ?1 d/ u% K
73     if (round == 32) 6 Q& v. E$ X% C" P0 s2 Q4 u5 A6 Z6 ]
74         sum = 0xC6EF3720; /* delta << 5*/
" z9 ?% r& s( Z5 U8 P& x! j75     else if (round == 16)
7 B6 g$ T8 B6 s7 }& M  u( `: T76         sum = 0xE3779B90; /* delta << 4*/
7 h4 x: Y  D9 [" n; g) z4 n. o77     else
, J: m% z' m: _78         sum = delta << static_cast<int>(logbase(2, round));
5 m& t  @6 X  M0 G' Y79  7 s+ P7 Z4 ?7 h  F5 m' h, u
80     while (round--) {    /* basic cycle start */ ' y1 _; X! Z5 M
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ' ?% [1 U7 K8 a" x1 j) c" A
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
4 s8 C0 T0 P; W; @7 E% g83         sum -= delta; ) a- S% x: M' Y5 Z$ r
84     }    /* end cycle */ . _: z3 C! N- S5 d, a+ Y9 o
85     out[0] = ntoh(y); * s  t. c- \5 z4 T) P  k" J
86     out[1] = ntoh(z);
0 w+ {% _. }. M87 }) q1 E4 E3 v( U9 {- S, e9 g3 G9 z
7 P, i/ b% f3 a; g( e& d5 y6 u& |
需要说明的是TEA的构造函数:
; `3 n+ O, H8 M, STEA(const byte *key, int round = 32, bool isNetByte = false);
8 d& j: C2 r2 [0 T1.key - 加密或解密用的128-bit(16byte)密钥。
- k$ M; u. V4 w2.round - 加密或解密的轮数,常用的有64,32,16。 . a4 J/ B9 A/ P7 M. H. }
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ) R6 b2 s; c5 V2 D& @" n) X' i* q

; L0 W7 c, ^! Z( D8 @# y( Z$ H最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 9 I% v. }. F! B0 a$ ?: _
2 #include "util.h"
5 m; i- a& R/ ?; @ 3 #include <iostream>
) J0 A. L0 q3 Y/ n0 K' r& z1 e 4  
0 W" D% \& z; m, F 5 using namespace std;
) Z' r5 ^8 g4 k" L, H 6  & t! |! X$ e5 w4 L+ q
7 int main() { / _$ e+ t' ~  `5 C6 W1 n
8  
9 ]. F" o; ^" J 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 9 W6 b  c+ m7 k  z
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
+ Q/ X" p: ?% g- M- e11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; + d9 A* h! q1 b% r
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
8 i2 q+ x5 _- j% d) R13  
4 Y& G0 a  z0 _* c" @- n. t14     size_t size_in = hexStringToBytes(plainStr, plain);
0 c" S5 P/ r7 p" x  Q' S2 v15     size_t size_key = hexStringToBytes(keyStr, key); 1 @" U8 O) g' P: R; t; G
16  / D* b5 t3 D2 h% _; r( L7 z
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 0 Q- J, Q$ G1 Y  L* [; p
18         return -1; 1 M( [% A8 N9 v
19  + w' {* u; ~3 L$ c
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
& l( v3 L& w1 }, \) Q# l, J21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
4 f3 A  q! o: d22  
; D- e8 d( E) D! @# M) U$ v; h  A2 ?& _23     TEA tea(key, 16, true); 7 ]5 ~# [* G' L- |1 T
24     tea.encrypt(plain, crypt); ; f! t" m& q# [  @6 n
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ; G4 ^1 s: C1 k+ [! d
26  ! x+ [& p7 u8 i6 N
27     tea.decrypt(crypt, plain); % Y  N& z: \5 m3 b* E( D' m
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; # h/ a% T0 o1 g8 W/ O
29     return 0; 6 @; }3 s) L3 B( U, [, M( N
30 }) v' N- w7 P3 ^  I7 s
  c6 w! w3 t2 c2 \2 p  t( f* c9 i& R
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx" b9 r- ?* I, W4 d
运行结果: * I2 d5 F( L" d& m3 m& e3 d6 f
Plain: AD DE E2 DB B3 E2 DB B3
3 c$ V) [  P) MKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 . E6 |' I& w5 d6 H
Crypt: 3B 3B 4D 8C 24 3A FD F2 5 z$ A: u5 T: Y# \5 N
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-13 01:09 , Processed in 0.026284 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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