找回密码
 注册
搜索
查看: 37762|回复: 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轮):# q0 l, Y, H6 ]
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
& X8 h9 P% h% u5 ]1 X% GTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 # A( j$ I0 a* @) f/ I
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 / b7 b: F+ r: M5 m# ]9 H- W
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 : A- Q2 d5 y$ a' ]- ^, r+ u
在 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. # c  K* f9 q. `5 f, s7 u6 h
  2. void encrypt(unsigned long *v, unsigned long *k) { 8 n( O3 k8 F8 S
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 7 [0 L: V+ x' r; ^
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    * _1 G7 k( F, q) J
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 8 [9 Q0 a8 T& L$ w) c5 m1 T
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 2 u$ Z3 G$ o0 V+ \* N
  7.          sum += delta; * X7 C. _! K5 w
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); % N6 f, \* A! R' r
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    0 o4 ?  w& }# Q' a% L- D% q
  10.      }
    * E' D4 z  [1 \  |. p% a+ T
  11.      v[0]=y; ' @! V8 ?9 i  P3 T: W; J
  12.      v[1]=z; ; g5 H  [! b9 u' E4 J
  13. }
    & t% l9 f6 `- `, Y2 u: g
  14.   
    - Y6 K. K# t0 W$ H
  15. void decrypt(unsigned long *v, unsigned long *k) {
    % v4 P: ^4 d+ e- V) E7 A; R4 K
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 4 e% f, q3 j7 W, R
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    # T1 r8 @  j+ w6 k; D3 T# W4 B) V; e
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    . ^6 W1 `* q4 Z* G
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ( \. L$ Q7 g- y9 ?! M6 A# v! I
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # `, {  U* u6 h& R
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ' X% z( W7 h' R4 e( f
  22.          sum -= delta;                                /* end cycle */
    6 R+ j4 o: a1 k' w
  23.      } + U" o3 S  k7 R/ }4 J; _/ [2 L( L
  24.      v[0]=y; / Q" o+ j, b, X- A) g5 _
  25.      v[1]=z;
    8 V/ e$ Q5 o3 V
  26. }
    ; ?. z+ Q8 c) [; p9 O
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
% w0 \" T$ ?: P8 A#define UTIL_H * p5 T) z  C3 f9 x9 P1 P8 i% i
3 S/ k# n& i" H$ |0 G1 d
#include <string>
* w# T+ \' Z0 K) p+ F7 K! P#include <cmath> & R0 \: L5 h% |, R% t
#include <cstdlib> + W+ N' h, U9 L: U  u7 w

; ]' D. U. B4 ~! _8 V5 etypedef unsigned char byte;
+ N6 x9 b! c; [4 G) B1 ztypedef unsigned long ulong; + G/ J! A) B+ t4 @

+ n0 x6 p' l3 [7 b, h' Z$ Sinline double logbase(double base, double x) {
1 Z  D2 r; Q6 W' b7 F  f# G1 h    return log(x)/log(base); * n. n. [) d) w0 n
} ; d4 `- t, f4 ]" G1 |
2 }# m8 Z. ?7 `
/* + F# w8 ]+ P; h- S- N! o7 u8 ?3 L
*convert int to hex char. * h1 ^; k2 b* t# \
*example:10 -> 'A',15 -> 'F' 5 ]& g+ |. r) ^5 L- \  o
*/ - r& z# B, A: e0 k
char intToHexChar(int x);
& k0 C" F" u; \3 w6 ~
- K6 ^. B3 ]" `9 P% c; @/*
  n( t# P% n) G& A9 _*convert hex char to int.
- n+ u- c% T( }. I. w" Q% V6 S8 w( b*example:'A' -> 10,'F' -> 15 $ F0 c! m- b0 h& i1 h: K
*/
: R+ @& K- A9 J8 |int hexCharToInt(char hex); , `4 w6 g  W* a1 _8 s

( f' K* a. @0 u: J2 c  @using std::string; 7 x* r' |( `+ m7 q. E; G
/* & h+ V9 {% o8 x! `/ B# l6 g
*convert a byte array to hex string. 5 M9 T% z7 \" ]6 }. g
*hex string format example:"AF B0 80 7D" , A) O" j1 Z, O5 k$ z" f: D. Q4 d9 c
*/
7 k/ Z7 N3 d( Cstring bytesToHexString(const byte *in, size_t size);
) a7 ?' {  _( |   `. v# T. O+ K9 q( X
/*
- E: l$ o" R+ b( Z*convert a hex string to a byte array. $ S- O7 B0 `) d  _" h
*hex string format example:"AF B0 80 7D" 5 n* ?: f) u+ |) Y, V6 R
*/ ) [& E; M/ Z0 I( y' w" O
size_t hexStringToBytes(const string &str, byte *out);
6 f. w( ~$ u" l/ [( \ ( S1 V- W; y% S8 g! c
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
* B1 Z; i6 z0 f; Y#include <vector>
; D- h7 J1 C' c6 R , Q- R9 H! F/ D1 |* t1 R
using namespace std; % I6 N  ]( l: {+ L
! ~" J9 I$ w( o$ e
char intToHexChar(int x) { / B$ C( m! _0 S) [
    static const char HEX[16] = {
! \& J/ R5 r' R: K% M- v- g& ?        '0', '1', '2', '3',
; r- Z( k5 `1 O6 H5 ~8 c5 q        '4', '5', '6', '7',
( u; F; w/ e- v% i+ F) X        '8', '9', 'A', 'B',
8 r5 f, b. S# ]        'C', 'D', 'E', 'F'
6 z7 _9 {( S. |# P$ K+ M    }; 0 _6 B0 C: T- @1 h+ G& v+ w* d
    return HEX[x]; 2 @" z1 f+ P. I) h
} $ o! X- Z! G  Y! i( l5 u" T
. o% H/ R: k$ K8 p: j+ w
int hexCharToInt(char hex) {
* K+ S; L8 I8 ]) g    hex = toupper(hex); + k( o' ~4 _) Z
    if (isdigit(hex))
- N0 R0 {" a) h* ^        return (hex - '0'); ! L& L+ ~! n' s% U* }+ \" H6 L
    if (isalpha(hex)) - z+ H& J( ?8 H, `
        return (hex - 'A' + 10); 9 s4 t9 V" K3 z. W
    return 0; # L( K3 `" O" Z, Z1 S2 v3 |
}
! E5 M/ i# d/ T. r4 O
7 D  v2 g& b# E2 Hstring bytesToHexString(const byte *in, size_t size) {
5 W) d- A2 [4 @& z    string str; % M9 ?2 ]8 `2 Y7 R$ R
    for (size_t i = 0; i < size; ++i) {
1 H( k0 ~* ^+ m: `' I" m! b1 E        int t = in[i]; $ S- ]$ n6 Z- G& d* Y
        int a = t / 16; 6 ~4 ~. {5 n/ e( Q
        int b = t % 16;
0 m9 I1 G; B, y( |. c        str.append(1, intToHexChar(a));
% u* Z) ?) Z1 e- r9 S; }  ]. C$ L4 v) L        str.append(1, intToHexChar(b)); , T! w" l# _! m
        if (i != size - 1)
, P# ?9 T0 Y4 M" |7 ?$ U! X: S6 P            str.append(1, ' '); ' W( w3 v8 Y0 m, G) s& Q8 m: r
    } & q* V# Z; Z6 Z2 L
    return str; 3 X/ A3 h" c8 N( H3 V
} ( `. c( C: c- P5 Y$ g+ B5 b& ^8 B
& o, V6 o! m+ L" U
size_t hexStringToBytes(const string &str, byte *out) {
, |  h% M: _1 X3 J5 R9 j
5 ]4 ]9 x, P5 K1 m) i6 |8 ~% e    vector<string> vec; 9 j6 H9 v3 o, G; ?$ d- X
    string::size_type currPos = 0, prevPos = 0;
/ b/ M  P1 d% B    while ((currPos = str.find(' ', prevPos)) != string::npos) {
% Z- z$ v$ u, |/ K( ?4 R' q, i        string b(str.substr(prevPos, currPos - prevPos)); % m8 K: B4 Y' p0 V) o1 d# p7 D
        vec.push_back(b); . X7 P# }; ^* j" J" A
        prevPos = currPos + 1;
0 s! p; C9 ~2 |. C( f    } : \* Z: q7 z' c( Q, e( Z3 A
    if (prevPos < str.size()) {
2 ?1 g+ ^+ V# q% m3 @0 e1 w        string b(str.substr(prevPos));
% l& H  E- s* w/ }2 K* H  ]& C! n        vec.push_back(b);
- T! a- z0 u3 W. f* J7 z    }
6 g2 J4 M3 T1 _0 B1 m0 B3 ]1 Y    typedef vector<string>::size_type sz_type;
/ l8 q9 l+ d/ W, M  y! H    sz_type size = vec.size();
" O7 U1 u3 r4 c    for (sz_type i = 0; i < size; ++i) {   C5 g3 l7 ]0 ~$ _
        int a = hexCharToInt(vec[i][0]); 3 l4 U1 R9 {* E; K+ y& g6 z
        int b = hexCharToInt(vec[i][1]);
. @1 F) f9 \, b/ k& s- B  \* \# \        out[i] = a * 16 + b; $ V$ B- R" i7 L) C: m. [4 Y
    }
' `# t" }" g  _! d    return size; 8 l) ^. N) X9 l$ z7 N% j9 y
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
" J) Z& z0 T$ U( \#define TEA_H % u: R$ \5 P( Z/ `& ~! P$ i
3 \! k+ \/ ]' [& u
/* " {: n% ~, T% H% v; k- I- c0 H
*for htonl,htonl
! j0 F0 M- h: D' e  Y*do remember link "ws2_32.lib"
5 ?7 g! N5 j; Z1 u/ m3 i*/
% h1 V' O' g9 }# W% k#include <winsock2.h>
! s8 i+ z* Q$ q' q1 K, ^#include "util.h" . l+ @. Z$ `5 o/ h' d, |
% ~: S0 Q2 }" `) H& p) A
class TEA { ' O7 P8 H8 ~* `
public:
& y+ C4 B+ Q: k/ @$ Z    TEA(const byte *key, int round = 32, bool isNetByte = false); ) s! J3 O& \( l. \
    TEA(const TEA &rhs);
$ E! I! [( k/ q! n/ I6 D    TEA& operator=(const TEA &rhs);
4 J" A$ C, x- ]+ Z$ j0 \# e" E    void encrypt(const byte *in, byte *out); / o5 k- v3 L! L8 z
    void decrypt(const byte *in, byte *out); % S, {% V% M' l1 p! t
private:
) J' ~. N; `2 ]: ?+ ]# }2 z: ]    void encrypt(const ulong *in, ulong *out); + |$ N2 I5 _9 C0 u! x7 p$ z
    void decrypt(const ulong *in, ulong *out); 0 ~/ W' E1 ~3 [- `, ?  d0 f& @
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } ! n6 Z3 y8 S4 K6 c! p+ U9 u
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
2 x0 [: U9 y5 V8 K1 a  _6 G) oprivate:
8 A; g6 _& i7 e' c    int _round; //iteration round to encrypt or decrypt
, Q% {5 z7 W9 b( @9 D# \1 Y) d    bool _isNetByte; //whether input bytes come from network
0 l/ }( k/ v5 Q% |% ?( e    byte _key[16]; //encrypt or decrypt key * Q! Y( M2 U% X
};
6 T9 ~" P9 g3 {5 D3 t 0 G3 Y- T' ?: z) C, W. C2 i
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
3 L) J- t& r1 g- Q" N! o$ w 2 #include <cstring> //for memcpy,memset % a1 a, \+ S3 c- z4 j; s, m
3  8 L! O# y8 ]8 E3 O5 n% U
4 using namespace std; $ D9 l' u8 Z4 d( @$ Q/ u
5  2 h( U- {7 P& a
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
1 r+ _' S) s; ?+ U/ i5 X: |! B 7 :_round(round)
1 o/ n" r$ n4 ^, F% a4 e! s 8 ,_isNetByte(isNetByte) {
# ~% K6 U" W+ u1 h# p7 i- ^! l  C 9     if (key != 0)
6 P3 R! Z* x, X8 H1 d: n: T10         memcpy(_key, key, 16);
7 K% b' B  h2 I! w11     else
6 S& j9 E( s% T& @5 s  d1 }12         memset(_key, 0, 16); + M* _+ v  M3 J& y
13 }
7 Z' I; V  M! G. a" P14  + ?& i; E) I- I/ j, f. ^* v& G3 K
15 TEA::TEA(const TEA &rhs) - M9 c. g4 M8 T' g0 q/ y, \
16 :_round(rhs._round) 3 `* S% q( {4 E4 y2 `: o& W* u
17 ,_isNetByte(rhs._isNetByte) {
# r2 ~3 d. g1 S- z* T" g18     memcpy(_key, rhs._key, 16);
* M8 b. A+ x6 J19 }   h! J5 G$ [  `: b" p* k
20  
; v% J5 S  X  `1 v21 TEA& TEA::operator=(const TEA &rhs) { - X9 P% ~+ Z7 S
22     if (&rhs != this) {
  {0 b" t& `) c, y5 w+ p; C1 s9 [23         _round = rhs._round; 7 w4 q9 B: _; f( ~. e  b* k6 \0 A. I
24         _isNetByte = rhs._isNetByte; & q5 N; C+ i4 |0 t1 R9 e& ]
25         memcpy(_key, rhs._key, 16);
, ]+ e7 p! M, j26     }
; E* L% ]9 w# D! `, ]" v; u27     return *this; 2 ?% s" U  u$ X# C1 S
28 }
+ ^& t8 h( B2 S5 j/ F5 e( M( N29  
" ^) d8 n6 H, z% Y30 void TEA::encrypt(const byte *in, byte *out) {
+ Y: r" w4 R3 l- T; s) w31     encrypt((const ulong*)in, (ulong*)out);
: _  f, e7 U$ T' _; m' _6 |0 A32 }   g7 t* B" T' ~% I3 u! U/ `& r4 R+ ^
33  
' E$ A7 T* e9 o# C! g1 m+ j' _' b34 void TEA::decrypt(const byte *in, byte *out) {
1 Q  m3 C$ k# K& c/ S% b35     decrypt((const ulong*)in, (ulong*)out); 2 p0 L0 z8 S3 y. @) q3 Q, K8 i# |
36 }
, j" _- U* i  m6 ^( o37  
1 a+ h! [1 r; B38 void TEA::encrypt(const ulong *in, ulong *out) {
; b* F' U+ O3 U. ^/ e$ e39  
4 M0 @; F6 z# g) Q/ g1 I) ?40     ulong *k = (ulong*)_key; % c: B# q% P7 X& N4 P' H
41     register ulong y = ntoh(in[0]);
1 z" Y( N8 [5 X" @+ g  V42     register ulong z = ntoh(in[1]); 8 s4 u. c  ~, Q& Q9 E0 U
43     register ulong a = ntoh(k[0]);
# z( F8 ~8 e7 Y: ^3 \3 w% A44     register ulong b = ntoh(k[1]); & L9 M; n, s9 i% U, c- }
45     register ulong c = ntoh(k[2]); 7 ]' S! T1 Q* f1 F6 C' r5 {& B
46     register ulong d = ntoh(k[3]); 1 v- l# i3 l! }9 H, }6 k4 h8 M
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ + y2 D) ?) Z, |# J
48     register int round = _round;
; X- h: p. A( U/ C" g! i49     register ulong sum = 0;
$ J9 [0 |: z  ~6 j* g1 ^50  
* q. K- Z3 z9 I% f9 S9 ?51     while (round--) {    /* basic cycle start */
7 U6 L) I. X8 i  ^' H52         sum += delta; 4 f1 c, a0 g; H8 s$ a  w% }9 B
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 6 H9 N3 n, `3 g! `6 b* Q
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); $ v0 f/ k; E$ J) P: a" M
55     }    /* end cycle */
3 J& y7 }: ?  r: Y2 E: g' c56     out[0] = ntoh(y);
% h+ h; g; f& f1 U: x5 `8 Z57     out[1] = ntoh(z);
: n5 O% d# }8 N# \9 @7 r" t58 } * w. r6 Y8 `2 `
59  2 X( S7 Z2 @0 D* s  q# `9 M! z
60 void TEA::decrypt(const ulong *in, ulong *out) { 7 t3 B& [* d( l5 y* R, a5 ^7 ]4 ^
61  
' M: q6 q/ I; q+ j. q62     ulong *k = (ulong*)_key;
+ }" z  ]7 l# @+ J63     register ulong y = ntoh(in[0]); % Q8 ?& m( }7 D; Y- s' ?& o( C
64     register ulong z = ntoh(in[1]);
* v0 r' U1 V1 [4 g5 J65     register ulong a = ntoh(k[0]); # q; v6 D& l' p- N6 j. W
66     register ulong b = ntoh(k[1]);
+ O+ b6 u8 w+ q6 ?) G7 s2 ?67     register ulong c = ntoh(k[2]);
+ a: j' n( Y3 t. n: ?% Y68     register ulong d = ntoh(k[3]);
1 ]2 l4 P# T$ Y: V69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ % P3 F9 S& c  {0 e+ z( |
70     register int round = _round;
2 M7 q9 ?! P* N) a& ^% I5 R) |+ S71     register ulong sum = 0; + a3 q) `/ {7 g. [- G; U
72  
3 K* n; L! `1 |2 i; u# K73     if (round == 32) 5 A" z+ Z, @: {, {6 x
74         sum = 0xC6EF3720; /* delta << 5*/
1 ~! E: j8 H" T  O75     else if (round == 16) 9 d" o5 K! x0 v, C* N) b
76         sum = 0xE3779B90; /* delta << 4*/ ' Y. ?# J0 I7 {" I
77     else $ y* ~! J0 _/ t$ Z- ~$ Q3 O/ _
78         sum = delta << static_cast<int>(logbase(2, round));
* N  @7 j8 j5 Q79  
! D! Y1 v5 ?4 }8 G8 z80     while (round--) {    /* basic cycle start */ + K4 r4 c5 r2 J8 O
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); # X: ?3 K/ r( K+ D- w
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
6 u! D1 A3 e4 ?) R1 H3 L3 g83         sum -= delta;
/ t# b+ w/ M6 e8 D, w# K84     }    /* end cycle */
" f7 E1 k, c" W4 k5 E85     out[0] = ntoh(y);
% s& H" D0 q: O! i7 N9 c3 S86     out[1] = ntoh(z);
) a+ C2 F: c& X* y( O87 }
# n, c) k- G" w  F5 k; M- u0 x# U
! @' s# z- S* a4 P5 O/ q需要说明的是TEA的构造函数: 5 z7 X- s  @- H" L+ g' ~/ a9 G
TEA(const byte *key, int round = 32, bool isNetByte = false);
  f9 R) Y. U4 l. B6 U3 b1.key - 加密或解密用的128-bit(16byte)密钥。   [" w2 H4 ?& a2 F% S( c
2.round - 加密或解密的轮数,常用的有64,32,16。
! s( k9 [! ?6 O- V( O5 l3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! # `+ M  I8 \5 T; k3 ?' p
; `2 K. N  q1 c" n5 a0 d
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" . h6 m' }% F% R2 k. E; G
2 #include "util.h" ) q+ e! |+ j# ?4 D6 X# E
3 #include <iostream> * b4 a: M' S9 ?' [
4  1 a2 N$ I1 u+ I6 d* e+ U
5 using namespace std;
( u4 q" Q3 H2 ^! J/ p/ Y2 x( F6 V 6  8 X# ]2 `+ L! J$ q2 @4 z& U; G
7 int main() {
1 r' \3 k$ v% s2 E/ J( I6 y0 Z 8  , B' Z  F; n. C. W* W3 U
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
* n! q, h5 M; u: A7 g0 J0 Q, C7 G10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ; q8 C" q' E4 O3 t: l- q
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; / `" I) U# ~( v$ s' G
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
6 w$ L& S" o, @6 d% j* t13  $ e2 y1 _+ _: ~& G& n5 i- |
14     size_t size_in = hexStringToBytes(plainStr, plain);
7 I( y& y% W# x15     size_t size_key = hexStringToBytes(keyStr, key);
% F& p3 |: W/ _+ o, I16  
: c& V8 R5 L) q0 f. A1 _1 _/ J1 b! M17     if (size_in != SIZE_IN || size_key != SIZE_KEY) * ^" ~- B. P" [  w) \
18         return -1;
; a, |2 F9 `0 e19  + c% ]7 E0 }( x' o( u) k
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
& Q' d. n0 c1 c9 U5 M" y21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
& t# V/ D/ ]; d22  8 |4 b( N/ s& v& r* ^# I
23     TEA tea(key, 16, true);   C1 F$ W% n/ d# |" ^
24     tea.encrypt(plain, crypt); 9 z9 z: G; X$ }9 V$ Z- {: a9 \
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
$ Z$ E+ l8 }: y- w7 N26  
8 _5 [% t+ P- `8 Q5 C( ~' E$ Q8 U27     tea.decrypt(crypt, plain);
7 I! P% {0 c, J1 G) l' ~" O3 F7 i28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 2 p, Q) s7 D8 d0 \
29     return 0;
' \9 J# Q" ~1 \3 r) ^4 [* b" \, O  z30 }
" u% a2 s8 O9 ]: I
! D$ G  a# Q, C6 m本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
- X$ i! M  l: K运行结果:
- h# _/ |6 o. C4 dPlain: AD DE E2 DB B3 E2 DB B3 * X) J# k& L. j. e
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
6 Q& Z- _& U! {$ u. w8 C) kCrypt: 3B 3B 4D 8C 24 3A FD F2 : Z9 r) n' Y/ Z# I$ A* V. i
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-21 17:07 , Processed in 0.021992 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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