找回密码
 注册
搜索
查看: 38540|回复: 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轮):+ P7 _3 ], @! p) q
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ( w, S$ c6 {" g6 v/ ?& s" }6 ~
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
# ?/ Y; v5 Y* C" l) G; Q6 i, L3 L之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 % k# U7 F- P- M* X0 g
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 8 `% z. A( A0 U6 j1 X0 w; m
在 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. # b# c) C6 V1 k1 d1 c
  2. void encrypt(unsigned long *v, unsigned long *k) {
    5 K$ J7 Q: O: W, e, `$ F' a4 F
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    8 Z) f3 B1 I/ y5 G
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    - w" E5 a7 R9 n* Z0 P0 W' w
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ . P+ j8 P, e3 P2 f
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ + M+ v+ q! A# b1 T- m2 f
  7.          sum += delta; $ j: R' s, h1 r# f$ S  O7 \$ h) f
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ! `. w# o- j  C- G1 f8 M" f# N
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 4 K0 {5 o. p9 N% M
  10.      }
    9 j+ o4 @4 G2 N& o6 R: r( O
  11.      v[0]=y;
    % A; }( E& r! o; R& H: U3 _
  12.      v[1]=z;
    ( B0 Z! h" S" H& z: J0 d( E
  13. }
    5 b0 ~- @9 g# ?
  14.   
      b  |% |* }1 C$ f8 m% U; d
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ) {3 a+ j% F9 F
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 1 C2 R, x2 `8 @) A6 V6 e, U9 d
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ) n* W8 f6 r4 o5 z
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    5 O; E+ [9 o  \5 o
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    7 ~1 x# G' H# G! a5 Y% q7 ^8 G
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); & t! L8 s% V; O9 a- M$ j+ c0 Z
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    - f! [: M) w# d6 i2 @+ R/ |  B# I
  22.          sum -= delta;                                /* end cycle */
    7 x( z2 g3 E3 i9 y
  23.      } , K- _. j4 K7 ~0 N) m9 F5 [
  24.      v[0]=y; ; {4 g3 u; j" e5 o; w! w
  25.      v[1]=z;
    # \7 T3 |2 r' V. X
  26. }
    ) @5 z- N& J' d5 f
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
2 f/ ^& ~; N- F* p  O2 G#define UTIL_H
; M4 T" S+ x9 A" W8 W- O# c2 }5 Z. X' C$ ]# y# }$ C
#include <string> 5 T9 B8 z1 N5 z
#include <cmath> 5 Z& P* l# |+ W5 k! T# v, l7 S% Y4 A
#include <cstdlib>
9 A1 v; T3 b2 z& w! ]- `
9 C8 _' q2 g! A& C# gtypedef unsigned char byte;
+ p8 b: }; g6 x! }% l" Z! Ktypedef unsigned long ulong; 8 z$ Y/ H  A7 u; C# f* E8 x
! T4 a, N! B7 o; f4 p% h. Y) D
inline double logbase(double base, double x) {
$ ^1 Y7 c) W- h" u. f2 `- ~    return log(x)/log(base); : R* Q6 y6 H$ L) i& Y
} & F& T+ T+ W6 n  L1 r
0 l+ a& s; K: y( H
/*
, G5 a3 s. f  ~/ t3 M$ G0 F4 ~' {" a" T*convert int to hex char. 7 {3 a/ z" @: }* h: P
*example:10 -> 'A',15 -> 'F'
1 Q/ w" O, V0 K& u2 D- J! j*/
6 O( N( c( c( y5 b6 Gchar intToHexChar(int x); ; f5 S9 a: M& Y; L" q
% S4 d) y. l5 S# O) o+ N
/* 7 x( S! m( K% v. T% V6 U8 O
*convert hex char to int.
- z2 m+ J: C- x+ k*example:'A' -> 10,'F' -> 15 0 E8 L/ T9 ]2 b
*/ 8 n: p9 C# r! F
int hexCharToInt(char hex); ) s3 F5 p4 }! J8 a2 r

3 p5 c& k, s! f9 Uusing std::string;
% K2 s! [5 U4 n" j1 [: u3 Z/*
  ]) [$ F9 V8 H+ L8 W4 w4 e% T*convert a byte array to hex string.
; j8 l7 G. }5 R0 x# _*hex string format example:"AF B0 80 7D"
- w  ~: K: ?  M# F$ @& \*/
! g- P$ y0 N' z7 l; }: B8 K' W0 Jstring bytesToHexString(const byte *in, size_t size); . J+ x) z; T8 l  l/ T3 b
( @5 e/ ~/ Z; B
/*
7 \5 |/ s/ K# |5 M*convert a hex string to a byte array. $ ?. ~- I( y# Z9 `  S( H& B0 j
*hex string format example:"AF B0 80 7D"   @, ^  z5 o% P% l" Q
*/
( i2 D! F% i+ M" Y; _size_t hexStringToBytes(const string &str, byte *out);
3 h* s( s1 c' ]7 c/ t3 _ % p! B' G% V- N2 z5 t3 J& {5 r, O0 L
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
3 X3 k4 ]! |& T# k% p3 T#include <vector>
2 }( A# |' R8 Q7 `( ~: v
4 n- i' p, R9 n% i6 n- Q; yusing namespace std;
8 h) |9 Z1 G* P9 ]+ o
& h* ^1 F& K5 q2 S8 Y/ U8 j& Zchar intToHexChar(int x) { $ S7 ^# \, Q8 J7 F( t
    static const char HEX[16] = {
7 d" [8 |! u2 h3 q% V' b2 B. I        '0', '1', '2', '3',
& m' s, ?9 B' v3 W8 e0 W        '4', '5', '6', '7',
' M% S2 A# w1 u0 F+ a3 ~        '8', '9', 'A', 'B',
0 `. i7 t4 q7 l6 [        'C', 'D', 'E', 'F' 0 B; z" r% S+ p( O7 R
    };
7 X" ^2 r8 U! B& }  u    return HEX[x];   P: Z* B+ C: D9 U( j$ i! p
} : T7 X8 N5 Y0 n& _4 y- x8 U

- l8 }$ M+ J2 R- ?- @2 iint hexCharToInt(char hex) {
! J; [* u: }9 d0 g    hex = toupper(hex);
8 u% `" C; e) I2 X    if (isdigit(hex))
) ~( E/ ]$ m% P        return (hex - '0'); ) u* h( Y) ^8 B! M. R) B
    if (isalpha(hex))
" `  U' Z- K9 N/ _5 I5 W4 [- Z        return (hex - 'A' + 10);   D9 ]. I5 ], L- f( {
    return 0;
$ [4 p1 z1 E& V}   Q, L% J6 Z/ {% D9 @$ _1 N7 b+ ]

8 \1 h# u1 u! m7 y( H: S5 P) I2 e) Hstring bytesToHexString(const byte *in, size_t size) {
7 x' A' r8 L; P    string str;
- X7 N5 j% n% R4 E/ `3 r" c. z: v    for (size_t i = 0; i < size; ++i) {
$ v  y% r! H6 E        int t = in[i]; + a2 ]- b2 Q8 w6 B! C9 `9 S
        int a = t / 16; " F" k$ G5 w& N) q7 |) w% o; f
        int b = t % 16;
9 s: B+ g7 a6 v1 }! s3 p, y, i8 O        str.append(1, intToHexChar(a));
% I+ S4 f- V, A% r# e        str.append(1, intToHexChar(b)); ( ^4 H6 z1 e3 G% J: J
        if (i != size - 1)
. ?% F. Q9 l1 P  m% m) g' |            str.append(1, ' '); 0 ?5 p+ K. l& ^
    }
3 l4 d  u( d* ^: z- b2 N1 Y' x1 z, T    return str; 1 z# i0 c% s! i" I" x: _& H( d0 D
}
4 ^) b* ]; v$ k( i2 l% h- O
% U1 L) ]4 n/ w9 E; Tsize_t hexStringToBytes(const string &str, byte *out) { ' V4 B5 N# y! j( U% e
7 q4 f9 K) \( \/ C2 b$ a& W
    vector<string> vec; / N  p3 K* J0 a! A
    string::size_type currPos = 0, prevPos = 0; ; v5 l/ i# \( `# ~- Z  T
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
& @+ J' ~1 @7 |2 i# w3 t( O3 D( n        string b(str.substr(prevPos, currPos - prevPos));
# E( m1 ~( g- {6 L# s! n+ X5 s6 {        vec.push_back(b);
& d/ i+ A+ p8 ^& P0 B& p        prevPos = currPos + 1; 6 C! m3 Y7 q' X1 b# T4 c# \; W# V
    }
! t4 c9 E4 w/ |: [) N- \    if (prevPos < str.size()) { 4 t* S7 S& N3 [2 f& p
        string b(str.substr(prevPos)); ( H7 N: ^3 v) [& v; E% R, X
        vec.push_back(b);
: c/ Q4 ?/ S0 f$ n5 `& S+ g    }
6 N, ?! Y  I* v& ~. f4 c6 V* M    typedef vector<string>::size_type sz_type; 4 o6 {9 z8 }* r! a/ Y5 y8 i9 q
    sz_type size = vec.size();
! F1 H7 a4 B; c3 n$ _    for (sz_type i = 0; i < size; ++i) { 3 J: X. g; Q! ?$ d
        int a = hexCharToInt(vec[i][0]); - C' `) E$ f3 P1 ?
        int b = hexCharToInt(vec[i][1]); 8 j, [/ r( |; W' u  X6 s
        out[i] = a * 16 + b;
5 \$ m0 d! b) b: M' f' C    }
9 W, Y2 X3 f) U$ z2 U* H1 w    return size; . ]# i1 C2 c! f! k
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 9 a5 x9 b1 Y  f  @) S
#define TEA_H
) Q& @6 w" n3 c8 A3 j9 s7 Q% A 3 ~. B1 [) \( X  H; ~/ G
/* : e2 Y% L/ @1 ]7 @0 \. I
*for htonl,htonl 2 Y/ M( R( o0 f; P- M
*do remember link "ws2_32.lib"
2 O" J. e) g3 X4 H3 ?*/
$ t3 @/ f1 [1 r# T' U( W; |+ `#include <winsock2.h> / X0 ?$ T. R3 {/ b% S! _
#include "util.h"
7 b- k, V7 c3 E9 o, S, q& T7 L8 h
$ L( y; Q! F6 |+ L% aclass TEA {
- y/ g0 C1 K& ~( S( J4 tpublic:
% ]7 h3 u0 i6 B: r9 h    TEA(const byte *key, int round = 32, bool isNetByte = false);
- s+ Y7 w4 {* r  h) e' h, Z    TEA(const TEA &rhs); 2 i# R0 L- o) s# Y9 w4 t4 O
    TEA& operator=(const TEA &rhs); . U& Z; t& k2 o" X5 K! J+ Y
    void encrypt(const byte *in, byte *out);
/ a* i9 }' |/ ?5 q6 Y% [! Z: A3 t    void decrypt(const byte *in, byte *out); ! \' x; j# }0 V, G
private: " F+ G$ t1 o  o) S. I# y0 L7 i6 V
    void encrypt(const ulong *in, ulong *out); % `. @# q0 w/ A3 C5 M' [/ F
    void decrypt(const ulong *in, ulong *out); 1 x- o" u6 k3 L7 y
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
- A9 [* }; K& @    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
7 E7 i$ w9 x5 k2 {7 j% X2 s& P# {+ yprivate:
. Q" D! T& z: y1 Y- s    int _round; //iteration round to encrypt or decrypt
: c- }' C. Y9 w7 y2 W1 C    bool _isNetByte; //whether input bytes come from network ; A1 C+ ^2 W! L- u( l
    byte _key[16]; //encrypt or decrypt key
( j5 |1 P; ?. }}; ' q5 r+ e) ~( ^/ ]! F7 x9 w* x
& \. \& D- K) z3 D# o
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" . Q# q# X& x6 U
2 #include <cstring> //for memcpy,memset
( Y, H) v0 F& t  e 3  
5 _% x" [0 g% ^9 R& c" O% m 4 using namespace std; 8 q, [8 B5 b9 K0 h  B% v
5  
# Q- |: ]% V3 S1 p 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 2 |; A( {3 B2 y) f2 O' h
7 :_round(round)
- R; q3 B( O! G8 j4 D7 {. f0 @ 8 ,_isNetByte(isNetByte) { : A' s8 ]1 I! z+ L/ l
9     if (key != 0) % \, `- ?: D9 C  |/ c
10         memcpy(_key, key, 16);   [/ N1 Y/ N0 s; b
11     else
0 }1 l0 q( }+ R/ `$ l3 ~) f12         memset(_key, 0, 16); 6 M0 b; ^- b/ o$ ~+ ^
13 } ( ?* S! ^+ I% C7 J
14  
+ e' K; t& a% ?- i  V15 TEA::TEA(const TEA &rhs)
+ x4 ?9 B$ G0 q: b4 f16 :_round(rhs._round)
# ^  r% j, y1 m: w) j' p17 ,_isNetByte(rhs._isNetByte) {
( h" k9 F$ I- Q18     memcpy(_key, rhs._key, 16); , c' y2 c- z! {
19 }
" e8 e1 V& y/ Y; h( S2 {% l20  5 o: S* B7 U1 g$ I
21 TEA& TEA::operator=(const TEA &rhs) {
. P+ w/ P* @3 I7 {22     if (&rhs != this) { 5 v1 b# w3 k0 ]2 U8 {5 y; [( }# J
23         _round = rhs._round;
/ w7 D% {% v0 N3 ?24         _isNetByte = rhs._isNetByte; 0 K" U1 Z8 M6 \! N* h/ q
25         memcpy(_key, rhs._key, 16);
4 ~2 W( O& Q; e" x% y26     }
  J3 J9 z# H7 z: ~) D! ?27     return *this; ' R6 d0 l& n* h6 v0 ~& u7 A1 M
28 }
, X; ?5 Y' x/ u( |7 f( Z29  ) ]# R/ x. W  Z& D, J9 o
30 void TEA::encrypt(const byte *in, byte *out) {
  @8 z3 w+ i7 O& Z9 N1 Q3 M31     encrypt((const ulong*)in, (ulong*)out);
6 U0 \) M1 ?% }# N6 h$ z8 B& ]32 } 8 h$ \! [- z* w! O
33  
- h& h# F4 E2 x2 c$ J( U) A$ b34 void TEA::decrypt(const byte *in, byte *out) { . m* h( c4 z9 ^$ v* ~" W. u
35     decrypt((const ulong*)in, (ulong*)out);
6 @, \. {, ^. K36 } % ^. l4 }7 e" a$ U, {- w
37  
0 t. T* d2 }, G% T! K# ~5 E38 void TEA::encrypt(const ulong *in, ulong *out) {
, J0 y5 R9 s1 ~39  
& p( c7 Y, K8 M! [+ ]40     ulong *k = (ulong*)_key; 7 h' Y. |# ?$ M: E. |
41     register ulong y = ntoh(in[0]);
0 C# N  m: Q9 T- K0 I1 p: O42     register ulong z = ntoh(in[1]);
" m/ |4 t( s/ b43     register ulong a = ntoh(k[0]);
8 w  F: _4 G& R* \/ K. w+ p/ o44     register ulong b = ntoh(k[1]);
5 p0 a9 ?5 l* d, p/ S( l% H45     register ulong c = ntoh(k[2]);
: o* ], ^! L  v! t46     register ulong d = ntoh(k[3]);
4 o4 d$ R% b8 J47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
* |3 z% j. ]7 M3 V( Y48     register int round = _round; 1 F$ u- ~- n) z3 ^( \7 a  }2 Q
49     register ulong sum = 0; ) ?. G; i  A) a5 e8 I
50  
; m, I) D: E. Q& G; p) y51     while (round--) {    /* basic cycle start */ 6 v% V0 J; r7 T4 i8 h
52         sum += delta;
  Y- Q: S( i+ A53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); & v9 `+ }, j' n* ]5 l- n! B
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
; T5 ?. C6 s1 k' q* A55     }    /* end cycle */
7 `# y& F9 {$ J( y. F* H: X) Q2 _56     out[0] = ntoh(y); 0 s5 N$ `" D! P; z& E) Q
57     out[1] = ntoh(z);
+ `3 r0 {0 M& \- \8 E58 } % q6 Z, z0 _3 V5 F/ m; E2 y9 C0 ]
59  
% |! U$ w. r- @3 N60 void TEA::decrypt(const ulong *in, ulong *out) {
7 @0 F6 [: J' g61  
* L. `' o+ P- d62     ulong *k = (ulong*)_key;
8 X) H' Z. ~9 r$ C63     register ulong y = ntoh(in[0]); 4 ]' v, _2 e6 W* {+ o
64     register ulong z = ntoh(in[1]);
$ }+ ?$ D" a8 t% t2 a* K4 [* Y65     register ulong a = ntoh(k[0]); 9 J/ t3 J; y+ [6 T! ~0 e6 Q2 n* T
66     register ulong b = ntoh(k[1]); & u& R) h" g* R( A4 F
67     register ulong c = ntoh(k[2]);
3 {! T3 x' g1 Z2 ?68     register ulong d = ntoh(k[3]);
( g& W& i8 j; [# }69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
! o& F0 O" u- `7 _' O70     register int round = _round;
& L6 y6 q5 O. M" p6 E& X8 m, i" M& z# G71     register ulong sum = 0;   U8 q; R2 [+ Z8 M9 l8 r
72  
4 C6 m5 W+ r; U7 M1 y73     if (round == 32)
0 j; M3 o! f/ }; R4 s% r. u; H74         sum = 0xC6EF3720; /* delta << 5*/ - b6 E- s  h- u) }! y+ y
75     else if (round == 16) " d1 {( N8 E  E# h$ O
76         sum = 0xE3779B90; /* delta << 4*/
$ {7 m$ b" B7 d5 t* m77     else $ h, w) z4 F$ Z# `" l$ D
78         sum = delta << static_cast<int>(logbase(2, round));
/ J% e! `! c  S$ J7 C) K6 U79  % d& |! Q' [) Q
80     while (round--) {    /* basic cycle start */ + `# D- J9 m7 ?7 v; o5 J
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
% o1 t, Z5 {& K4 h1 U82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 4 w) z: P& w0 K7 K) Q. X; l- |
83         sum -= delta;
4 `) [7 O* J9 [( _' M  S84     }    /* end cycle */ & G( y6 u$ q" V% e5 i3 n
85     out[0] = ntoh(y);
# t% g% d1 Z! R8 p86     out[1] = ntoh(z); 3 w8 [: G; e( k) g
87 }
, k. r4 V0 r- v9 n. r8 ?- C  c8 E- J# }
需要说明的是TEA的构造函数:
. @" _; z; e6 D5 H5 fTEA(const byte *key, int round = 32, bool isNetByte = false); 9 u8 e  P& a2 y: O3 s
1.key - 加密或解密用的128-bit(16byte)密钥。 9 i8 J0 e/ k* w! h& T& ~5 f, K! A) Z
2.round - 加密或解密的轮数,常用的有64,32,16。
# ?% G+ c& _( o2 B8 ~' }3 T) i3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! & ~6 O. z4 z4 X6 S; G8 Y" K$ S& t

2 G% d2 V; y9 N4 Y9 f! I8 E  I最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" : {0 I0 j+ c8 b! |' b- t4 P5 m
2 #include "util.h"
9 q/ x: C2 R$ w 3 #include <iostream>
* X) I5 f/ A; z0 \* C 4  
- ^' t* S* ~) n* d! p 5 using namespace std;
5 `5 ^% q4 o1 g! I0 B0 G 6  
6 y5 j0 a/ p- }0 u# I6 d2 H7 ^3 A 7 int main() {   D9 Y# u0 e5 N7 {: T
8  
; a9 d3 j% ^& F8 g* \) ~0 G. v 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 4 I+ {7 |6 ]! Z) X6 |7 [
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 7 g& k" i0 H7 ~. y: ^
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
0 V+ ?! h( \5 n/ M& M! p+ \( F8 a12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ; G6 ~$ t& \' `2 E) I* ?# o
13  
; W" G8 ?3 X, r# n14     size_t size_in = hexStringToBytes(plainStr, plain);
/ f7 P7 y" f& _- N: O+ B3 _15     size_t size_key = hexStringToBytes(keyStr, key); 6 R- ?0 D2 d! e: p5 d' w! Z' b0 ?
16  % v: Z0 Q% l% d6 u& T9 d  l
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) $ f$ P2 @: u5 E6 ^! d8 N
18         return -1; : a) v3 V" A9 r
19  
* M" M$ _( j# H20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; " }$ {- [  C2 r  y* g  h
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; " X: ]/ h! |: B  F2 p
22  
& a8 z  H) c3 i) O- [23     TEA tea(key, 16, true);
+ I  n) |+ C+ F. ]5 x8 ], l24     tea.encrypt(plain, crypt);
& p# Z3 A+ x7 i: w6 l4 ]25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
9 n- Y3 n% r' I) c7 H) g26  
! O8 l* S/ X6 Z+ @" n27     tea.decrypt(crypt, plain);
9 ~2 W( R0 L( @' e" E7 k28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; / z; X- B1 O* C6 e
29     return 0;
  v1 o/ V# ]( U) _+ b/ I8 L30 }* L3 `. f9 ]" y; T. z
8 _/ Y" C+ ]* S4 \8 N/ l( d
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
3 _$ ^) _+ t, x4 e$ P) E0 R7 Y运行结果:
; [) [" R2 L$ [5 [$ C  ?# p) TPlain: AD DE E2 DB B3 E2 DB B3
) [7 @* R# I' qKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
- Q$ B0 E' Q/ B2 YCrypt: 3B 3B 4D 8C 24 3A FD F2
1 @8 `% [# \) r- A9 lPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 06:02 , Processed in 0.023752 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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