找回密码
 注册
搜索
查看: 37908|回复: 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轮):
0 T1 E% k- A# A" {微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 2 e' z' p) b; G+ ?: i
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
2 _$ ?9 M7 a% h" _; q9 s- a0 V& @之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 9 R5 v5 ^) o( {# t& k
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 6 g1 Q- u; E1 ]/ B3 p7 `
在 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. 3 H4 E- I& B% v9 X/ e
  2. void encrypt(unsigned long *v, unsigned long *k) {
    / q# Q$ {, I$ i  ~# N  c: `
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 0 [* ^4 l# `* T, e; R/ T
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ! b: V( i' ~4 }0 B: N# u1 @) k0 K
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ " @; R/ P8 z3 S0 ?8 L- [
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    2 R4 y- A; t$ H  e. Y
  7.          sum += delta; # R/ a3 K2 |3 J
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    1 s2 I0 {" g+ @/ Z3 s
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    - w  U+ x8 m: K& J5 B
  10.      } 2 f" n* L- @4 P9 b: a2 j
  11.      v[0]=y; * g  C$ C" Q4 e: D# J8 `( o
  12.      v[1]=z; : s, ?* B( Y# V2 m1 H, p5 f
  13. } 1 x# U8 ~: v- A. T' f
  14.   9 V6 m: f1 u, Q+ \
  15. void decrypt(unsigned long *v, unsigned long *k) {
    1 @: k; @! e4 x; U
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    # f6 y/ {" j1 W1 n" z/ d9 w2 z
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ; W0 d' ?2 ?! w7 N* Z
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ # S2 c/ d7 ^6 N' W
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ( _+ ?4 X& k( L1 K  \7 s
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    . L% l5 e( d8 f2 y  l9 t
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 5 W. ?- H1 d, e  M) Q
  22.          sum -= delta;                                /* end cycle */
    4 d% F9 z1 S0 {# E
  23.      } . b1 `; m8 X7 m1 p/ D
  24.      v[0]=y; - b( C' @* u5 F
  25.      v[1]=z; & x* t' K! D  H6 r+ B5 A2 k3 ^$ L
  26. }
    ; \$ _- v( t& n" S, P6 o% D
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H - ~8 ~: G. u' Z# V+ O
#define UTIL_H # d. E' F( @4 v% ^5 W5 g* e4 s' p
) {: Z8 b" K# H
#include <string> 9 r  Y5 @+ r5 @* O9 `/ u2 ?
#include <cmath>
+ x8 K: I7 E' T8 M* N#include <cstdlib> + w( ^% [* T# q: G$ L2 t
; c+ {/ g) v) |" j+ ?
typedef unsigned char byte; : t; S  |! ^$ ]$ T
typedef unsigned long ulong;
* z6 R+ j7 ?& O* b% _ ( {! m, S3 g8 b- k4 j
inline double logbase(double base, double x) { ' a4 d  E* m. P, J( c$ P
    return log(x)/log(base);
% w$ D8 o! A- W9 d, \8 {; O} . Z  `: U  g; }$ O2 z

2 c2 Z& @& Y" s5 i/* 9 l5 G1 z! l8 Q" q) g
*convert int to hex char. & Z( T/ g: o( }1 c9 {) }% ~" r: [
*example:10 -> 'A',15 -> 'F'
' n2 ^0 [  ^- f# b*/ 1 ]+ a4 W' Z' {* @) V7 R/ A2 o
char intToHexChar(int x); 1 F  v& i3 u& v; A/ v" [' }; S- ?  b
  o5 p! u- c+ C* `) o( W: |
/*
) x& G" v; s' Z/ ]*convert hex char to int. 4 C6 x- I9 t$ S0 E9 s
*example:'A' -> 10,'F' -> 15 ; |) V  U4 r, m. [$ [. B8 ^
*/ ( B" b% L1 I8 F! t$ f
int hexCharToInt(char hex); - o- J: y3 [4 [7 B" G

% F' r% m% {  a+ _6 C! t$ @" nusing std::string;
- T0 _( O) U6 W# t% h  n) d/* 7 c2 x- C5 f% {, U4 {
*convert a byte array to hex string.
" {& W  }* Q8 ]! a  C*hex string format example:"AF B0 80 7D"
0 c$ o: z- B5 m) ~2 \1 f*/ ' ]+ }) g. t3 h6 z+ E6 n
string bytesToHexString(const byte *in, size_t size);
+ ?, \. \5 y& F" f0 \ 9 q' u5 o# o& l8 W" D
/*
( |; l$ D. u+ N3 _) p1 i6 T*convert a hex string to a byte array.
) a) Q3 S4 K1 x2 b*hex string format example:"AF B0 80 7D" : N2 _1 n& c% M& o9 P
*/
4 D& `" n1 k+ q$ W$ \size_t hexStringToBytes(const string &str, byte *out);
1 e  ]8 q4 T7 b/ u/ f" ^4 u8 n 8 |+ W0 m, K1 F/ V$ S
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
' R/ z0 {* o& _! f3 q: H/ b- R#include <vector> 0 Q* w! a% P& T! w: J5 h
( C" \/ A1 ^' o; v" _. \; L
using namespace std;
# Y+ L7 N: ^! q/ s" Q/ |6 C0 j; H - R+ s% f& D2 y- m1 a
char intToHexChar(int x) {
  G8 }2 {$ p7 {& s% d# {! K% |    static const char HEX[16] = {
$ a' m# ^6 J9 U        '0', '1', '2', '3', & Y8 W5 b. S$ w$ P) _
        '4', '5', '6', '7',
8 w8 U7 P% W( B7 E6 V        '8', '9', 'A', 'B', 6 W0 J- F$ H0 d. N' J: B
        'C', 'D', 'E', 'F' 1 T# q( x, Q' K9 h
    };
/ M- f1 x% q+ U* j5 J8 P% C    return HEX[x];
3 q9 N* Q5 \9 {3 J. s} ) h" n( D3 o6 q9 ^
. d5 B  |/ p! J5 P1 ?
int hexCharToInt(char hex) { * E8 n2 R# f& `' r
    hex = toupper(hex); $ H0 g2 s* {$ Y& l9 P( A& {' x
    if (isdigit(hex))
( O# G6 ]- T; s# d9 {& D" w0 o        return (hex - '0');
+ l2 g% s* {' t% ]% z* K    if (isalpha(hex))
) X/ h8 e$ m5 @/ @. i2 \        return (hex - 'A' + 10);
3 s0 _1 b) l1 R) \5 T/ b    return 0; & J! u7 ?7 k% K: P  s9 _
} / r4 ~* Z# `! I  X" _

2 b, Y% L% r' W( B$ _! A8 ^7 e6 cstring bytesToHexString(const byte *in, size_t size) { % t& U3 c6 l1 a% f! f
    string str; ( [+ w, m# h% B# j7 l8 C0 l1 ^
    for (size_t i = 0; i < size; ++i) {
7 T4 l3 ?* E6 T5 F- D# T7 ]        int t = in[i]; 6 p2 m8 K' v( D1 s$ q2 ^6 K. `
        int a = t / 16; 8 Z5 k1 U8 f# }/ _# B- J% S
        int b = t % 16;
( M8 k7 K- D' k+ @  C( {        str.append(1, intToHexChar(a)); & x, w& x# w& p' `$ X$ l3 L
        str.append(1, intToHexChar(b)); 8 t9 _8 Q# q! x% {/ r& @
        if (i != size - 1) ; F1 g0 g" U- z& x3 |- E' q* w
            str.append(1, ' ');
# A+ n$ @5 w: n! w' @1 h1 A    }
2 i: J, O* w- H  E! D    return str; 4 X8 g/ j( w! x$ ?6 n( r$ S8 |+ [
} # L) d0 `- E2 Q* l! ^' \( j5 J

. l. n, G( o' j7 r$ Y6 K  ?) v9 {size_t hexStringToBytes(const string &str, byte *out) {
# \- Z1 F  o, h9 L 0 f: B: G$ J. h4 F6 O; q/ I
    vector<string> vec;
1 S" O+ B* V8 g+ I* \& A' B    string::size_type currPos = 0, prevPos = 0;
2 r; b' V8 ]3 o4 W5 F    while ((currPos = str.find(' ', prevPos)) != string::npos) {
8 A3 f8 \5 G) k        string b(str.substr(prevPos, currPos - prevPos));
) N+ r* Q' ?! A  |8 y7 T1 j        vec.push_back(b); / V8 Q7 d: v7 }) |, h
        prevPos = currPos + 1;
2 [! B3 v( U$ Q! u/ @    }
+ B9 J+ W% }, r4 o/ P    if (prevPos < str.size()) { . l9 k% t' ~2 d4 x: G8 H- m
        string b(str.substr(prevPos));
6 ]8 R  a, q5 L5 V6 A3 R/ v4 f        vec.push_back(b); $ a8 @; A6 y) z9 y& X4 C$ i& J
    }
9 C3 g- d9 S  g4 T    typedef vector<string>::size_type sz_type; 1 v7 Q9 i$ T" Z( q9 \
    sz_type size = vec.size();
5 P3 ]+ O5 @. {& l! z5 z3 X+ K3 w    for (sz_type i = 0; i < size; ++i) { 2 {; Y& v& s+ R( K9 f, V
        int a = hexCharToInt(vec[i][0]);
) v: {, K; T2 U- Z3 s7 b/ E        int b = hexCharToInt(vec[i][1]); 4 U& V2 u" v" k) J) |  V% h
        out[i] = a * 16 + b; - O5 @! T8 ~5 g: X
    } 4 a) |! P) h* K% S, y; L
    return size; & N- x7 E: M: w9 B/ B4 F1 X1 c1 R
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ) G$ H! E+ c8 V" {9 e
#define TEA_H
, Q- k3 b+ x: O
0 a4 Y5 g0 l7 ]3 O1 \7 x/*
2 G( j( c5 I- e' e; H2 K8 W7 A*for htonl,htonl
" w) D& E2 z" l, x+ D+ g*do remember link "ws2_32.lib" 6 b6 _# A4 `9 l# B
*/ 2 g" U1 P9 k3 E& B/ Y8 k( S# H
#include <winsock2.h> - k1 ?! T0 S  T- j9 z* o
#include "util.h" , m8 H0 k1 n# j7 v6 p. x
# T$ w$ r+ t! o5 J/ _1 A3 A  C. l
class TEA {
7 E5 \. w' f( |- bpublic:
0 H. u' w/ {; F# X) w) y5 }    TEA(const byte *key, int round = 32, bool isNetByte = false); 3 e: _8 `" A& M4 X. B- W; {3 e3 y
    TEA(const TEA &rhs); 1 |+ w9 z( K7 q* P8 v0 U
    TEA& operator=(const TEA &rhs); 0 x. q( q1 j! Z
    void encrypt(const byte *in, byte *out); # |7 }1 D+ u  t6 ?! M# T$ F3 `$ Y7 e
    void decrypt(const byte *in, byte *out);
6 A4 `6 L( q) x3 C4 Jprivate:
* E1 i  u& d: w* {    void encrypt(const ulong *in, ulong *out); 5 _  H8 h* q4 X( d
    void decrypt(const ulong *in, ulong *out); . ~* K- l3 w0 V. c& l! a3 L
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
0 @* ~# N6 @8 m( K- |4 Y" @    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 2 N7 T' ?+ q, p- c
private: , A% J9 e1 E0 h* L& u2 X
    int _round; //iteration round to encrypt or decrypt 9 f# k& r7 `+ `, `9 t; [
    bool _isNetByte; //whether input bytes come from network
4 K/ r2 O2 _, Q; w6 ~/ P! Y, m$ i    byte _key[16]; //encrypt or decrypt key
4 |) W7 Y  g/ Y! G, B& l' i1 \/ m}; * Z9 w+ z6 H' c; h( U8 |! i$ m4 o
7 L% o, A* ~! K% @/ |, S1 z, V
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
/ c7 I; M& B, M7 f 2 #include <cstring> //for memcpy,memset
8 n8 e, A* B# O3 Z) |1 P+ \7 @: @ 3  
; h9 Z5 R8 v, f* ~& n$ k4 B 4 using namespace std; ' b; k/ J& |. M$ c7 R% d
5  
( z2 a: ^8 C% v0 T" A7 {. x 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
- R+ D1 C0 Z$ t; G5 ?0 R% F 7 :_round(round) 5 {) _/ x% P  s9 `; M7 F
8 ,_isNetByte(isNetByte) { 6 j, \. S+ S. s5 y
9     if (key != 0) 8 M( Q! d% h/ L- n! @( q! I6 W# v
10         memcpy(_key, key, 16);
3 D$ a( F" m) G- r11     else
8 s  M" E, ^2 J12         memset(_key, 0, 16); 2 p0 H6 \+ K! ~6 N/ T/ S
13 } 6 r' u9 S. i' M+ @* @
14  
/ j+ K' P. C2 U8 g8 H6 ^/ V15 TEA::TEA(const TEA &rhs)
1 l6 f- N3 s* Y8 i16 :_round(rhs._round)
2 U8 F; P9 y$ V: I6 S) Z17 ,_isNetByte(rhs._isNetByte) { . O% E# F) H8 U" D( {6 V4 p
18     memcpy(_key, rhs._key, 16);
  `1 `3 v: c* @6 S8 I19 }
: h, E" \5 d' y20  
1 Q9 V0 _: E0 D( Z' |21 TEA& TEA::operator=(const TEA &rhs) {
5 s- n! r0 h* \- i3 B1 a* Y22     if (&rhs != this) {
) a9 u0 v" }+ K' ~- s23         _round = rhs._round; $ S) P$ s- |( [" z5 e
24         _isNetByte = rhs._isNetByte; ' L" S% o& |5 G
25         memcpy(_key, rhs._key, 16); * l. E* p0 I9 o$ b3 e/ h! G
26     }
( x# U. e9 A) F27     return *this;
: ~. M! A4 B2 r+ u0 N! e5 a28 } * I- c6 @( w( [0 g2 v# P
29  
- ~& l! K5 v+ \30 void TEA::encrypt(const byte *in, byte *out) {
- Y8 |+ A- L7 |3 s' p/ c31     encrypt((const ulong*)in, (ulong*)out); $ P( L, K+ z$ t8 ]$ M
32 }
& C7 r5 O& V2 {- R' I33  
3 V9 Y3 C2 I6 h7 L! u34 void TEA::decrypt(const byte *in, byte *out) { 6 Y- Z5 B5 x9 |+ }& m1 J
35     decrypt((const ulong*)in, (ulong*)out);
, v- u# \' l+ H* `9 k; P5 u36 } ' R8 T5 E% z3 A( S8 N0 ~! L
37  
8 W9 ~# ?7 Z/ o38 void TEA::encrypt(const ulong *in, ulong *out) {
- k7 {* i7 m2 K$ V1 c+ X39  2 l5 D5 [  A" W# C) j1 j
40     ulong *k = (ulong*)_key; 2 F; @1 M# T% G0 I3 a. W
41     register ulong y = ntoh(in[0]);
, [6 ^" Y: l, R, D, q) H42     register ulong z = ntoh(in[1]); - A8 w+ j1 T2 i4 Q& [
43     register ulong a = ntoh(k[0]);   m4 ~, }7 v4 K
44     register ulong b = ntoh(k[1]); 1 U0 v) ]: H/ }7 O( u9 m
45     register ulong c = ntoh(k[2]); - N+ R' Z# d2 w# ?$ b" Y, Y
46     register ulong d = ntoh(k[3]);
" q. j8 t! z/ h) h& Q47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
" ]4 H+ g: s9 I. V/ x48     register int round = _round; - G' M8 N+ [& a* e: k3 ~" [! ], X
49     register ulong sum = 0;
4 W) U$ o# G4 Q; B0 l; i50  - m4 ]9 p! J. x& H
51     while (round--) {    /* basic cycle start */ ( O2 [9 }9 g" W9 f6 S. E* W
52         sum += delta; ( o$ \+ o; x' b+ g: J  w# \. J
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
  z5 }% ^6 n- [/ b) w- \54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 5 q- F' i2 C# u, M( ]6 Z
55     }    /* end cycle */
+ X* o% A2 O: o) P56     out[0] = ntoh(y); 1 o* W. W$ I7 ~' _, x6 O
57     out[1] = ntoh(z);
7 \2 h& ^8 }2 L1 Q; n+ V+ q" f58 }
' G  j9 y* r  }) X: r( x0 @/ w# R59  . F5 e+ f; c6 m# {8 {. v$ s
60 void TEA::decrypt(const ulong *in, ulong *out) {
1 [  G. e- U/ F4 ]61  
; o% B, r1 o* w: r2 r& g62     ulong *k = (ulong*)_key; : z! X3 z9 H3 R  b! \- G
63     register ulong y = ntoh(in[0]); 5 h& ^- k% }; i! `; E. m9 \
64     register ulong z = ntoh(in[1]); + Z6 M) x0 W& G6 g: ]  q' P% u& L
65     register ulong a = ntoh(k[0]);
3 K# g  R5 v# R" ^: I1 l66     register ulong b = ntoh(k[1]); 8 M" U- k2 y) p" {" h
67     register ulong c = ntoh(k[2]);
' \, L! y: s( F/ q4 o68     register ulong d = ntoh(k[3]);
: m' p6 T4 S  X8 Y$ H+ L& j, B69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & B- {4 }- |- a4 a4 \6 t  z) c
70     register int round = _round; * u$ {8 r* Z9 w4 k
71     register ulong sum = 0;
9 Z# u! ^! }0 o2 o4 n72  ) y1 n4 v7 q) G2 \, [0 H
73     if (round == 32)
0 Q; a2 W6 L1 t- J3 Q* f: O74         sum = 0xC6EF3720; /* delta << 5*/
2 m% H- i, c' \& e7 n9 x8 c5 e75     else if (round == 16) ) W9 U) C! ^, i$ I! e
76         sum = 0xE3779B90; /* delta << 4*/
" o* P5 a( H! k5 S+ w- @$ ?2 T77     else
" M9 Z7 r' d: S* m2 S" p78         sum = delta << static_cast<int>(logbase(2, round)); 2 _2 [( W4 u+ {+ h" t
79  9 J. a" a! z( e* \" ^& {" }
80     while (round--) {    /* basic cycle start */ * t. d3 f6 t( o0 ^5 ^) R, s$ t% @: J
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ( V2 \* _9 n8 I& {( d7 g/ K/ a
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
! Z+ G2 [* F5 A% x0 v  D- Q  |3 q83         sum -= delta; 2 G  u: h5 @+ C
84     }    /* end cycle */ 7 l* @* U2 @4 l) @
85     out[0] = ntoh(y);
+ c' A" R+ @1 u- T$ O$ [86     out[1] = ntoh(z); ( h0 R" S8 A% A7 ^
87 }: t0 _1 ]3 r* N' c

. E% Y: `* w& D8 d# p需要说明的是TEA的构造函数:
/ [7 j7 Z4 t' h2 ~TEA(const byte *key, int round = 32, bool isNetByte = false);
( O# H( J9 a/ t1.key - 加密或解密用的128-bit(16byte)密钥。
5 ?' B4 ]( b: }! V2.round - 加密或解密的轮数,常用的有64,32,16。 & U3 B# m8 h, Q; r5 ]9 q9 C5 g5 u
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 7 Q8 w; T( _" s' n4 F0 b$ S0 }
1 F7 u. d3 A" l' Q: v( Y5 g
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" % P6 T" J+ Y- u. Y& E+ A' {. \
2 #include "util.h" " K4 [+ A( _3 `( O
3 #include <iostream>
% V6 o) z. Z7 E" {* _ 4  1 G$ y+ t& K  f6 A8 l) C1 H
5 using namespace std;
& s* P& N  y* J 6  
. n# j& p3 d+ y" h9 t 7 int main() { 0 }- }9 T& I2 x) z  ?0 O
8  
3 |  @7 j% q& W+ j) s# `* ~ 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
/ V- g* o- N3 U0 w10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); / d6 ^8 @* E" w* F, i  K# K
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; $ {5 X5 W/ T2 h5 ]( [
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
+ k: C2 _: z( }9 J9 \: b13    r. \+ a* z. f- F
14     size_t size_in = hexStringToBytes(plainStr, plain);
# n3 F9 t& E1 Z$ d15     size_t size_key = hexStringToBytes(keyStr, key); ) E& A' S+ e" J6 p3 u1 K
16  8 h6 w# L8 I+ J) `0 B
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) : ]" M. t5 Z" @( W
18         return -1; 2 H! v# u4 m& ^1 T+ `) e! C# e( l
19  
6 g) M% x6 t) _4 ]20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; ( g# ?+ {" w. X: v4 Z
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
2 Y* z. e; Y. Z3 d0 }2 k22  1 S/ |+ W! p% v% F
23     TEA tea(key, 16, true); 0 g/ |6 n/ [- k: T, q2 ?9 P
24     tea.encrypt(plain, crypt);
, J) d* }. ~0 B% ^; A. z( S25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 8 Q& b7 }/ Q- h  t, V: s
26  
6 I( G! h* Y. v) m; r27     tea.decrypt(crypt, plain);
- `! f' L/ Y8 c- ^  I8 A, p1 `28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
7 b" j2 _0 I$ ^' X. O29     return 0;
: K& B$ C2 a( Q' n5 ~( Z30 }6 [: q. v. V( A% G
1 Q- u# c1 p6 q8 H5 ?6 w4 Q
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx" J* _3 {; \& m" k0 z( T% c/ H* y, m
运行结果:
3 U* D! W! {7 e! ~' N! L' MPlain: AD DE E2 DB B3 E2 DB B3
1 o2 _1 t, A# {4 H. K" X! f! g* M5 QKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
# L, D$ l6 L/ p9 k1 z- D' d; y2 dCrypt: 3B 3B 4D 8C 24 3A FD F2
2 Z4 Y' o- o+ y- ?+ B* P* RPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-9 19:50 , Processed in 0.021072 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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