找回密码
 注册
搜索
查看: 37744|回复: 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轮):. i) S/ @# b+ X4 X3 [3 R
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 7 h5 {! L0 Y: [5 Z
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ; T9 V; g5 {% h$ |0 P2 Y) ^+ l
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 . b. N& O- v1 Z/ j
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 4 Y2 V3 S9 L0 h" ?  K
在 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. : |2 j9 i& @. u$ r+ o* B  v
  2. void encrypt(unsigned long *v, unsigned long *k) { " I4 y' X( i: R1 D+ ~1 ~( j! }5 D! b& r3 I
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ , A- {) @  F% b! K0 W- h  @
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ! o/ c  M# |: ?
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ ' ?3 v, n% G/ f/ x
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 9 A3 B+ K+ L% r. ]! Y8 W7 ?$ o# g
  7.          sum += delta;
    2 ]7 S, K- B- I4 |$ Z  B. v9 j" O
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); + c+ W0 e% l- Q4 y$ H
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    & d: w# }" f" }1 E( \
  10.      } ) q" R% K$ ^, D. V5 b
  11.      v[0]=y; 1 }' \7 O8 o: A9 L( A
  12.      v[1]=z; " s3 m# m! d" W1 `- W; _9 K/ A
  13. } , V9 M3 {* I  a: L; t8 g. c- R' c% s* x
  14.   7 f' ?' N1 p/ ^9 E( s
  15. void decrypt(unsigned long *v, unsigned long *k) { 7 V( ^, s" `7 n. W
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ $ ~: K% e! d) L
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    4 O! t0 ~; `9 M! M) {6 F2 a
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ & z  H1 S8 k9 \/ a3 [, {" C/ e
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ - R; L8 Y% F- ~3 w: a$ g. H, n( \: ~
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 2 e7 f4 n: k4 I6 E
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    & l6 a- l0 u0 o! m: v8 s
  22.          sum -= delta;                                /* end cycle */ , m2 _0 a: O5 s# q0 X5 |" S  t
  23.      }
    # j6 _6 ?& w6 j# r. Q$ k4 K& G8 u6 E
  24.      v[0]=y;
    + G4 j/ [( J9 i( W2 w
  25.      v[1]=z; # o, F$ r; G  j0 R% o
  26. }( _" M) B8 ?) |( C5 X& i' m
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
6 |9 g3 i: j  d; r#define UTIL_H
% H7 a; K* j& ^4 P4 W6 }& j3 b& E" Z4 E# \; c* x9 h) o2 C
#include <string> ' X, S: S/ m3 J
#include <cmath> 1 F1 c3 g& o# g0 D- i
#include <cstdlib>
3 a7 g2 K9 \# b6 p1 O) {2 C
& k! T/ B+ V" r9 Ctypedef unsigned char byte; + _% Q) i" Z- g' x8 i9 e' R
typedef unsigned long ulong;
- `3 y8 t, t* v
3 b9 Z9 [/ F! \: v) I- f9 q0 jinline double logbase(double base, double x) {
: ?) E4 ~" g7 W4 B6 X1 x- l    return log(x)/log(base); & P/ P! W* n1 r* d; K* G) F
} ' W1 C+ T  a, E, G% R8 ?
" w- ]' g2 B* q2 J
/*
# p! f# r, t; |0 u' e) ]*convert int to hex char. : T( e2 O  v, r, ?. W9 |' h1 ?
*example:10 -> 'A',15 -> 'F'
3 H+ U  m- e8 N, G7 n0 N3 }' ^4 a1 m*/
  L$ _) m) W; `& Zchar intToHexChar(int x);
# ^/ r$ x1 r5 r* X7 D
& A  U' y5 P6 N/ m  Y. J  K/*
( p+ T" v2 l3 L4 K/ ~*convert hex char to int.
3 o! N2 Q# z2 B5 \+ u*example:'A' -> 10,'F' -> 15
0 n9 i: p  c- E; g*/
  [3 T& a* n% S  ?6 Kint hexCharToInt(char hex);
9 J5 ^2 {6 l' D+ X, ?" {6 r' q2 v
9 w0 p: j% y/ |" u- Wusing std::string; " w0 ]/ g7 [, Y' C* B2 X
/*
: q" S! z9 x8 f5 f* K*convert a byte array to hex string. 5 q5 @) q5 \1 Q* b& ^3 z( o2 s
*hex string format example:"AF B0 80 7D" . H( a* g  A- b: B4 W
*/ ; }( y- r% t& G+ Y  b" c
string bytesToHexString(const byte *in, size_t size); ! K* r: h7 I3 P1 R! {/ a# J8 T' I

; s0 b  n. y2 [& e3 J$ L" \/* # p1 n6 z& M# c) Y8 l( W- z4 E
*convert a hex string to a byte array.
: V% d  }! a# t+ m% s*hex string format example:"AF B0 80 7D" 8 @/ Z) J) c. x" L
*/ & @/ m  {8 d9 G3 T# T7 y
size_t hexStringToBytes(const string &str, byte *out);
. O$ S' x" y3 L5 U6 o . e% d( I5 w  a) N' K" \- U
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
+ b' J6 L& ~% R8 M& K! C  b#include <vector> % ~( O5 ?3 f5 F6 W
) O2 G+ W% w3 d# C
using namespace std;
' _4 n7 B- s& S+ _7 k7 A
( x+ |) }3 S7 b% Q6 g$ M1 E% o% Hchar intToHexChar(int x) {
: h7 q7 v% s( \* s* ?" r- f    static const char HEX[16] = {
4 J  O/ R+ G7 w9 X* w2 S2 g8 C        '0', '1', '2', '3', 8 R0 w1 l2 \1 [( q
        '4', '5', '6', '7', * L. n$ m# U2 \+ P* ~: @& I
        '8', '9', 'A', 'B', 6 q0 D# p2 _* Z5 Y8 Z/ I" p
        'C', 'D', 'E', 'F' ( j8 H0 p; o8 s& u) y- y
    }; - v+ S' ?' V7 e0 Z
    return HEX[x]; 5 o' _3 p  Q4 @$ G8 }) n
}
; m: ?/ {6 X) F0 U& O. ~
4 F& b9 M8 ~9 b0 V8 _$ Fint hexCharToInt(char hex) { $ E' F( }" V% O1 V5 v7 q$ ^- q
    hex = toupper(hex);
2 _4 r3 E% }) Y0 h7 V7 f    if (isdigit(hex))
+ c: d/ J, S: b' B9 B, N/ ~: [        return (hex - '0'); ! {; v+ q" X8 i0 o
    if (isalpha(hex))
% D( X$ L" H+ [: N" A        return (hex - 'A' + 10); & X1 v0 b, l4 j: L
    return 0; - M# p" n+ j' A2 g3 D7 \
} / [& }3 h  c3 y+ c' w) y' e

8 T# B( Y  F& _string bytesToHexString(const byte *in, size_t size) {
/ I% N; R' x+ Y    string str;
9 h1 W8 B" j4 I" u( {- P) ?/ r) e# ~    for (size_t i = 0; i < size; ++i) {
4 ]: X0 M" d  M( t" ]: U) X- s- c  t        int t = in[i];
7 ?! N1 \  D& l) D3 I0 j! o0 l: b        int a = t / 16; 4 m6 C$ j  z6 }5 ?% ?
        int b = t % 16;
, M/ i& F" ^, M- H( K        str.append(1, intToHexChar(a)); . h& @& l' S! J+ T& L6 {! R: I! Z7 P4 l
        str.append(1, intToHexChar(b)); ; ~# N8 L2 B0 l
        if (i != size - 1) 9 O2 P! C- W; M; m9 E" n
            str.append(1, ' ');
' P1 Q3 m2 z" d# f& R7 F, [7 t    }
: Y5 t$ X0 F: B- T# S* h    return str; 8 g# S" p% d' `- i6 u
} ; I+ x; K4 [# }; p; y& ?, e
* p6 r1 m$ `3 }& s2 C( F4 {" C
size_t hexStringToBytes(const string &str, byte *out) { + d& ^, E- E6 P0 {' l7 g
, f! X, w# c/ [6 K1 ]3 ^3 n
    vector<string> vec;
7 m2 f8 F" m4 g$ M. E  I  I    string::size_type currPos = 0, prevPos = 0; 4 L: N+ L" o4 r/ g
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 7 D- y6 \1 L/ m8 N" K( U/ q
        string b(str.substr(prevPos, currPos - prevPos));
6 o1 K% i: \0 [8 J# \- t8 T        vec.push_back(b); 5 f: {, f% m5 r% S4 I
        prevPos = currPos + 1;
# V4 d  ~% J2 ~0 G    }
$ {7 J, \0 o3 @' }# I, R    if (prevPos < str.size()) {
+ w+ a5 Q- q2 W+ Z! N7 k8 N        string b(str.substr(prevPos)); 8 b' u* H  k! ^, q
        vec.push_back(b); 2 e* D2 B" b4 _+ X( U
    }
* W) G4 T2 }  d% f) X7 Y0 a1 @    typedef vector<string>::size_type sz_type;
# X6 z0 h8 C. z1 J; `5 f    sz_type size = vec.size();
, l4 {& s* b: @" V5 H$ @    for (sz_type i = 0; i < size; ++i) { & W0 ~1 D  X" n5 t; }, |1 M
        int a = hexCharToInt(vec[i][0]);
- q" q. z% b. I: ]' M; z- Q        int b = hexCharToInt(vec[i][1]);
) Y+ {8 Y8 _8 S: I        out[i] = a * 16 + b;
& N9 x. T9 k8 f5 G1 i, z    } / M& |, o3 b1 T+ e( Z, V- M
    return size; ; L7 ]# i" v; i
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H : o4 N% }6 k' D% U: p! K
#define TEA_H : c7 [6 s: g  S

3 o* W( }8 W' d/ ^4 i1 i" o; p/* % {: Z0 o3 y& x% T
*for htonl,htonl   Q1 _, V$ i' Z$ |- T
*do remember link "ws2_32.lib"
6 q* q8 u4 @; z0 d- U7 v, P. q/ X; V*/
( j* {: T; p9 Y#include <winsock2.h>
$ r2 P+ b. E3 }. \& M( k4 X#include "util.h" 8 [/ W- X! W) `" y4 S

0 {) W# T' z0 E8 m& yclass TEA { " |. x1 j$ q4 w, C: [6 b) m/ n
public:
9 \# V+ _. ?5 L0 j& A* ]4 u$ S    TEA(const byte *key, int round = 32, bool isNetByte = false);
  M6 \6 A' S1 V( p    TEA(const TEA &rhs); " q) ~) T8 i2 t, H
    TEA& operator=(const TEA &rhs);
8 \  h( `8 Y# v7 Q$ h    void encrypt(const byte *in, byte *out); 3 L4 s4 H4 K  T% `2 j6 O
    void decrypt(const byte *in, byte *out); ' _. S/ r9 k, y( n" U5 D' ?
private: / C) G6 p' C7 ?0 V+ A! `; V' t
    void encrypt(const ulong *in, ulong *out); / O6 g0 B/ K. a# q5 @# M+ t
    void decrypt(const ulong *in, ulong *out);
% K$ ]) d3 a; @' ]' W$ q    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } : B9 P0 R5 w' A) L3 x% k3 g- k% B9 B
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
* `" l5 U4 [/ p/ q$ ]: Z# V  Hprivate: 9 e8 f# M! G5 N' m% z& n& b
    int _round; //iteration round to encrypt or decrypt # O, d$ {1 Z& B' K: E+ }
    bool _isNetByte; //whether input bytes come from network
; ]& a4 `' {* T8 h    byte _key[16]; //encrypt or decrypt key " M6 S/ \* C% v  L/ F5 m
}; / S2 Y( v) C& `# u! \+ K
0 k8 O+ W  n1 x4 W
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
; M2 ]# \9 O0 ~# d( |* a 2 #include <cstring> //for memcpy,memset ( M0 h# I+ \) k, E& V
3  6 s# z( n5 v/ j4 X4 }2 ~
4 using namespace std; . f" q# b) |; O/ k% E. [' h1 s
5  
: d3 E: u" x) C6 g* B, O 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
) F/ A* ~( Z3 t# u 7 :_round(round) * n9 E( E8 j; P; E1 u: F
8 ,_isNetByte(isNetByte) { ! ]+ U/ ~* A! ]" k% B9 }
9     if (key != 0)
% h) Z! T5 W0 j6 e7 C. [10         memcpy(_key, key, 16);
- i/ |8 T: j0 G3 ]! A% l11     else
/ ]+ K$ Q& ]6 y5 q12         memset(_key, 0, 16); ' A% k6 H. `8 i% O
13 } ! `9 e) Q& U0 q: _4 ^: V- ~
14  , s" |9 f% q+ H5 ^" S
15 TEA::TEA(const TEA &rhs) ; I$ M8 n4 s' R5 V/ h# c9 x
16 :_round(rhs._round)
( ?% B$ h& q/ B7 I17 ,_isNetByte(rhs._isNetByte) { 3 b! O4 N& e7 P4 _0 P. T; }% q
18     memcpy(_key, rhs._key, 16); 8 @+ L" A: t4 D5 O) A; N0 ?6 D7 U: S
19 } 5 H' S$ b" ?$ ]" J2 M! }) w
20  : \7 T3 @% ?+ @! o; X- K& M
21 TEA& TEA::operator=(const TEA &rhs) {
: X3 k2 x; k4 ^( i' P; K22     if (&rhs != this) {
) V. x" L7 l9 E- u6 l; s23         _round = rhs._round;
- }$ q' v1 c1 r8 R24         _isNetByte = rhs._isNetByte;
- U3 z5 C- g* W+ d3 i( Q& d8 W25         memcpy(_key, rhs._key, 16); , K6 m& y1 {1 h
26     } 1 b; O$ f$ P* z7 ^5 k7 W
27     return *this;
2 z2 u- G3 `. P1 ~& }7 x28 }
  y% X& o: ~/ d* ]29  
( W  a# b8 [  c0 {' K  d1 _30 void TEA::encrypt(const byte *in, byte *out) { . z: _% \! h  o
31     encrypt((const ulong*)in, (ulong*)out); 9 O) \+ ^8 @1 A- X: l! O
32 } : D3 B, {* @7 b/ {' j
33  & r1 s0 w  _/ I+ H
34 void TEA::decrypt(const byte *in, byte *out) {
2 b  R- G0 k) q: [4 M4 S35     decrypt((const ulong*)in, (ulong*)out); ; S0 h! k4 }" n$ ?% x. u
36 }
( j+ ?% A* t. T' g/ E% ~6 \4 q37  3 @/ o2 ?$ k, N& X
38 void TEA::encrypt(const ulong *in, ulong *out) {
3 d5 `# X9 @, K/ ^- D39  0 q' a8 C) q% d$ \1 C
40     ulong *k = (ulong*)_key; / @1 j6 v) _* K% `8 }
41     register ulong y = ntoh(in[0]); ! S: Z7 j; I5 G/ ?; e: G3 @
42     register ulong z = ntoh(in[1]);
# k: P3 j& B* `0 b43     register ulong a = ntoh(k[0]); 2 @* l# k, p8 U, z2 t4 ^3 S5 f% K% h2 c
44     register ulong b = ntoh(k[1]); 6 F. u; t0 T4 L6 {( `+ a; v, u5 n' m
45     register ulong c = ntoh(k[2]);
# R- @( o' N- s4 U. v- S46     register ulong d = ntoh(k[3]); * j1 K! `. Q1 A! C  s+ d
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
" G: j/ U" |9 B4 `$ j8 n48     register int round = _round; ; o1 ~3 x5 c- O
49     register ulong sum = 0; * b& L4 D4 @, y; g1 A0 L
50  8 R) a. \. h9 n+ F
51     while (round--) {    /* basic cycle start */ ) G0 A& z& D/ J6 r4 E2 p" B
52         sum += delta;
% T6 L& `& N2 o! O" U53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
5 I: R- c4 a; E' k54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); . ]. R3 E+ n- y: q2 L
55     }    /* end cycle */
) Q" q7 F6 L6 x, i$ Y% a3 D56     out[0] = ntoh(y);
$ G1 H7 t; q( [# Y57     out[1] = ntoh(z); 1 d* _, g: Q& P& W
58 } 9 y) B8 S( O' N/ j) N
59  
% T6 p! X; I1 f) k- I60 void TEA::decrypt(const ulong *in, ulong *out) { % P4 h: a7 Q, R" y4 o5 d" v2 E" s5 |4 M
61  3 h1 z6 Y2 ^4 i% X2 J
62     ulong *k = (ulong*)_key;
, w& Q3 ]0 G: l* [8 S4 J63     register ulong y = ntoh(in[0]); ( S. r! x4 d0 a; C  q1 i- g' H
64     register ulong z = ntoh(in[1]); 5 b  C# P# n3 \
65     register ulong a = ntoh(k[0]); & j! k) a$ b4 e
66     register ulong b = ntoh(k[1]);
) w& @5 Z' \% d1 n% W0 B67     register ulong c = ntoh(k[2]);
& g( {6 `6 s/ G! E68     register ulong d = ntoh(k[3]);
0 _8 Q# P6 L' a4 c, k2 y69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 9 x$ {/ T2 d' X. r2 q, ^; i/ I
70     register int round = _round;
2 p# G5 j/ e! |% \) m7 {71     register ulong sum = 0; ) i# w: n2 v: l0 T: r/ i" g
72  
& B( N$ a8 M$ V$ w) H73     if (round == 32) $ V4 d; E- P9 F0 q) H
74         sum = 0xC6EF3720; /* delta << 5*/ + P) ?& A3 Q. n4 k: Y
75     else if (round == 16)
7 U7 L2 w( B# K2 @" G76         sum = 0xE3779B90; /* delta << 4*/
# X& F8 L# A: C77     else
- g9 V, E+ }" {- X5 @0 a  ?78         sum = delta << static_cast<int>(logbase(2, round));
* _: r+ S3 {/ X% C79  2 P; [  A& t. o/ ?6 i. G5 x
80     while (round--) {    /* basic cycle start */
. G8 F4 n- ~9 Y* ^! d9 l81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ! s) O, D$ G1 Y
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
* M8 B3 s- }$ ?) ?4 f83         sum -= delta;
% d1 d+ w) X3 L  F3 n0 E2 k" I84     }    /* end cycle */
3 `1 S4 u1 z5 Q9 K; N85     out[0] = ntoh(y);
& b6 j* R( ~5 k86     out[1] = ntoh(z); 8 p9 m6 E1 ~! Z" P- Y. {% v
87 }$ s% y* u* c0 y* @' R
) f2 l0 F5 j% J
需要说明的是TEA的构造函数:
. r7 t  H+ e: w6 H% _# E# [TEA(const byte *key, int round = 32, bool isNetByte = false); 7 G: t# w! [: X2 Z8 o
1.key - 加密或解密用的128-bit(16byte)密钥。
7 q9 ?+ E  M+ S9 T" e3 M2.round - 加密或解密的轮数,常用的有64,32,16。 + i/ T' X5 @/ N) F/ w$ C! v
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! . \1 i  v1 g  s

( _, p( {; \8 ]" A, d最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 8 ?- e6 C4 r* }. n
2 #include "util.h"
: z4 X# ^$ Q, b# O' q# Z  f& O 3 #include <iostream> 9 U! t& F- Z2 W9 }  z
4  
/ b$ G# [- ^  D  c 5 using namespace std;
# w: K& S$ k, ~ 6  
& p) X$ X' W7 r" T. u' @ 7 int main() {
  l0 ?8 _: c# \+ c 8  
1 V" ]* p5 t: Y' { 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
/ x+ F6 `1 L* X+ u& [( F: H7 Q10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
9 y3 F; n% m( }& G11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
% }3 d& D2 x7 s: |# A12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
: p! |  a0 N# D3 ?! }13  " ^7 i- U7 m6 m$ |/ N2 t
14     size_t size_in = hexStringToBytes(plainStr, plain); 8 h9 e& H3 g/ H  f
15     size_t size_key = hexStringToBytes(keyStr, key);
6 w8 m: \7 V6 z7 B16  5 G" R, f$ V8 t6 O
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 0 M3 ?& _5 y, s8 x& \' |
18         return -1;
6 \+ O4 [$ ^* j3 o7 {2 y$ V19  
6 K& d3 B/ B. X20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; ; O0 n6 Y' o/ w4 U. E  R- V- P
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
$ z9 S1 y/ S; Y22  & U  j, r$ k% ]) K
23     TEA tea(key, 16, true); * B, Y2 M3 p# g7 X" [& h
24     tea.encrypt(plain, crypt);
9 g9 y9 Y$ g* p25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ( p( T, x2 a8 d8 `( E6 V5 S
26  
4 Z  H3 t+ F2 ?/ t" @7 b/ i27     tea.decrypt(crypt, plain);
5 v8 t$ o* b" {6 Y- B& f28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
- B# R0 ?0 S: t- q  U  H( c29     return 0;
! ^6 m, I5 z. b' m! Y30 }( D; m6 D5 z2 V
; U7 `3 y; [* E, X/ o
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
: V* l; E8 K0 |8 F4 J: i运行结果:
3 l2 q7 C  i" R# g% hPlain: AD DE E2 DB B3 E2 DB B3 5 N2 [1 a& f( U; }7 q0 ^* }& L
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 % D; D! r$ Q! e
Crypt: 3B 3B 4D 8C 24 3A FD F2
% b5 `- i8 a, U- e4 t& nPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-20 02:41 , Processed in 0.022281 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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