找回密码
 注册
搜索
查看: 37391|回复: 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轮):* |: Z# W6 P4 G) a  C3 k8 b
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ' `0 i2 Z9 v  |* h$ C
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
0 ~! H7 w- I5 F5 p9 P; u+ X- W之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
- ]# U- p4 S: t/ p在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ( [$ ^- X9 E8 ?7 e( r% g8 d) _1 V
在 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. & q8 }/ I0 n8 A: V9 d9 s; e4 b
  2. void encrypt(unsigned long *v, unsigned long *k) {
    : i& v# y6 O7 x9 |
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ + r$ W) r7 L2 k% S. n- i
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    $ `+ x  c4 m7 [( A7 s
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    # G' x, c, P. \% H1 U
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
      G: \' N4 o, N- W$ N* w- r
  7.          sum += delta;
    ; b, r' L& B# J4 \) u) S
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 6 l. L! j/ Q6 H/ q6 W
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    7 L1 ]2 e' C# H- @6 Z' \. N, x: X
  10.      }
    . e. y% d2 b0 J& \: Y0 I" `$ J; y" X
  11.      v[0]=y; : q+ e6 X; H8 i! n; U3 e% _- K
  12.      v[1]=z;
    " f: |* z6 q) f" P' m: N6 q9 W
  13. } ! V8 @( |3 n, B- P
  14.   
    * C% j: p' A! n. t" Y5 ~0 ~2 `  U4 J
  15. void decrypt(unsigned long *v, unsigned long *k) {
    % b/ h) Y0 q) D# h. v0 k
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    - W+ @: \. G( q9 M
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 2 x/ L  p: e4 N
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    # z. l' ~( S1 E0 n
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 6 Z  ?5 }7 ~$ }2 P) Z4 l; R4 x2 Q
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    9 A  @( n3 P# v) s  }3 P
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); # ^# E1 ~/ y3 W% g" f/ q+ ~4 _: S+ ^
  22.          sum -= delta;                                /* end cycle */ # M( Y( M% z$ b- Y4 x
  23.      } - O! I% p  |* o# x
  24.      v[0]=y;
    * _5 F+ [7 d1 G+ \4 ^
  25.      v[1]=z; 4 j% T4 y% i2 D! {  M5 i
  26. }
    % N9 K2 q  d# H) f4 X/ j' [3 }
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
7 i0 ^+ o$ Y8 I# `. U- d#define UTIL_H 8 t3 c$ z- X% [" W

) W$ @. O* K, e3 o; n7 B#include <string> + [% W9 k4 v4 E0 F( @- U6 U: k/ e! Y
#include <cmath>
& M# [; k3 i: U8 M9 @) m#include <cstdlib> ) X' `6 W8 @! C! p% F3 y* x! y; `

' o" c* N2 Z6 X, {( P8 u, \. }typedef unsigned char byte; 2 p8 v: `0 e7 w# M  f& o( U/ e
typedef unsigned long ulong; ( a% S3 _& I% n9 S, a3 I5 L
+ G! ], q* F/ u; p, S
inline double logbase(double base, double x) {
% I: ?' q) R7 P7 O8 S    return log(x)/log(base);
7 A: E7 b" g. j  k& a7 @}
6 ?. i/ K7 N) l+ k$ q
1 L  W5 T  D" d$ @$ V8 |/* 8 R1 \: |) t4 |) Y4 ^) p
*convert int to hex char. ! I! W& v& }' d$ Q# @  Q
*example:10 -> 'A',15 -> 'F'
4 F2 u7 _7 P8 {, G7 F7 c2 F*/ , m: f! \; v! s6 z! w
char intToHexChar(int x); / C/ l. U) M5 x& O" X

- C* B0 @) T) e+ T  z! E* S& L. w/* ) S% p0 J0 G, ~) T
*convert hex char to int.
8 m  e. ^" n1 X1 s$ q*example:'A' -> 10,'F' -> 15 + v" `0 _4 @8 e
*/
7 ~& F- D$ |  b- f0 W1 kint hexCharToInt(char hex);
8 j% @7 E5 g8 k! g
. J8 k) V5 V" Zusing std::string; 1 W1 X/ M% f8 \$ _! ?& f* k
/* & K1 |1 c6 ?6 M0 g
*convert a byte array to hex string.
5 g0 ?, S# k7 J. j, {! w*hex string format example:"AF B0 80 7D"
' I* S+ R2 }% X" b1 d: t*/ & T4 H+ ?& n5 C0 i3 P" h/ M
string bytesToHexString(const byte *in, size_t size);
1 s/ ?' @3 X6 J! u" x# \0 n- Q 1 a! J2 b0 a5 V% X
/*
0 Z; k% i9 u; U; ?" ~- w6 B1 m*convert a hex string to a byte array.
1 |8 F' Y" z4 |. }% F*hex string format example:"AF B0 80 7D"
, f. J1 _- \- f*/ ) h. R2 T2 C5 g  q8 p$ _  \
size_t hexStringToBytes(const string &str, byte *out);   W- a8 W4 E9 Y; E
0 B4 i& R4 a: v, ?7 h; C: q- j) E
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ; C$ L5 U% [: Y) z' ?, R  F) l8 f
#include <vector> 0 f3 G# l7 l; O9 N
) l5 c4 S/ {* v8 i, n) l
using namespace std;
) k( _: I5 N0 c; u: s
- I8 R0 t8 E- |2 Fchar intToHexChar(int x) {
& }; X- A' e$ I+ x) ^* h7 `. o    static const char HEX[16] = {
+ Z  b. \5 N7 H1 R3 q        '0', '1', '2', '3', 9 x6 x0 H+ i  g/ v
        '4', '5', '6', '7',
7 R/ d: N+ t9 M+ o        '8', '9', 'A', 'B', 8 L& L. n& \# n  J4 F9 h* B; L
        'C', 'D', 'E', 'F' : c, \- j9 X* u% S
    }; 6 E" G* x4 P1 G% J
    return HEX[x]; : h3 Q3 ?+ B9 u% v( t
}
3 R2 e. W' ~4 ^. k1 ] 9 j* v7 `2 ]/ [  @
int hexCharToInt(char hex) { , T& n, X$ l! ?/ g; o& U
    hex = toupper(hex);
+ [8 x) C! m& K4 ]/ f$ P4 n0 I8 c    if (isdigit(hex)) ; t% l# d7 |* }7 r$ F8 B- `
        return (hex - '0'); - {# b5 ?7 f5 z2 e  C
    if (isalpha(hex)) ) |* l0 G- h; H; }4 J) O
        return (hex - 'A' + 10);
5 z- H. ?' {: ~% C4 U9 K* l* ~    return 0; 3 X2 K" \; ]1 b4 E
}
" F: j3 ^+ u) V$ W2 }
8 M) a: ?; H  s. N5 c; {string bytesToHexString(const byte *in, size_t size) { 2 n/ S0 ]; t+ ]" X+ I" Y
    string str; ; U5 t' Q6 U" E' r, [
    for (size_t i = 0; i < size; ++i) { - v: S- h2 }: p3 v, D( h/ D
        int t = in[i]; 8 w' ?+ E9 E  H( X) ]3 ~2 ^
        int a = t / 16;
! ?0 w; H( A9 o# ~5 ~  _        int b = t % 16;
1 z/ v2 \7 u  J. d" L: W. Y4 Y        str.append(1, intToHexChar(a)); 8 g1 a3 J/ ~: M" j( G  t
        str.append(1, intToHexChar(b));
# s( U& t7 w  y- V; ~) c. Z6 N        if (i != size - 1)
, N& Z& b" J/ ~, c) @            str.append(1, ' '); 5 S- v; _# I% K+ ?
    }
2 D; T$ m  G+ S" P    return str;
* a0 _) m7 q" O1 M1 [} + d% |2 g( \6 n# ^! [* Z

  u* `( O8 f: {size_t hexStringToBytes(const string &str, byte *out) {
* ^) e& t6 R. E' G' `$ ~3 ~$ X
, ^4 G% j# c) n* `3 |    vector<string> vec; % E1 B3 l; q7 y/ W# b& i; A) g
    string::size_type currPos = 0, prevPos = 0; 4 Q: x* ^; ?; `- x" i5 _: N
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
) T  y& M& q; U6 H- ?" T9 d        string b(str.substr(prevPos, currPos - prevPos));
# x' R. m) X( _6 o" ^        vec.push_back(b);
. d( _' u7 J1 W        prevPos = currPos + 1;
- N( Q# F) x% U9 p    } 0 G- B. f6 U2 e) D0 r
    if (prevPos < str.size()) { : n; O/ J: `9 k, j5 j
        string b(str.substr(prevPos));
2 s5 K/ E- j! @8 v        vec.push_back(b);
+ t9 J7 s) y+ `0 H    } + J! I8 K3 b; @8 |" d. q
    typedef vector<string>::size_type sz_type; 6 g9 m$ U+ _2 }$ p! l* W! R- e& E
    sz_type size = vec.size();
6 W* l6 F  e% Q4 j    for (sz_type i = 0; i < size; ++i) {
" [; t! t7 K4 L/ O5 G! P+ V" I1 {        int a = hexCharToInt(vec[i][0]);
6 K( }. I) x; R! C! _        int b = hexCharToInt(vec[i][1]);
; k5 R# j) l2 E% l        out[i] = a * 16 + b; 8 A3 |  O+ d( B& j$ E# j% h
    } / ]/ I# s+ C. \- R: Z
    return size; % }' G6 ]7 b1 x- y
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
0 j* v( b0 j2 \7 M#define TEA_H
$ `- l( a7 [; Q4 M, l9 _7 @7 Q
* [/ k/ ~+ t5 t$ `/ G1 s" a4 `/*
# `# j& N( `! z) e4 j2 e*for htonl,htonl ( ^+ [2 M) }' O- n# x. y9 ?# |
*do remember link "ws2_32.lib"
7 a# E( ~( [) _( i*/
  X( t  V2 d. ]! p8 e#include <winsock2.h> % t- }* W! o' Q/ S$ p
#include "util.h"   h3 m0 k. l" D  l

0 O8 Q* S( V6 F& u$ G8 mclass TEA {
$ K  E  {$ k: q6 `# r+ z2 |public: $ k+ x: i4 E5 R% P, P1 N
    TEA(const byte *key, int round = 32, bool isNetByte = false); ( ^9 A! X# k/ m6 e- ~1 @# `
    TEA(const TEA &rhs); 1 g- x3 R1 x1 l3 x3 \* B/ `! h$ j
    TEA& operator=(const TEA &rhs);   c) N: v: A7 k( o# p0 p" e+ V) i
    void encrypt(const byte *in, byte *out);
, |( s9 L) t$ F7 ^2 ?; e; i9 u    void decrypt(const byte *in, byte *out); : m: U+ I3 h; v1 {4 d- ^- P
private:
0 G, b& e; u/ n7 n. a0 Q8 {  T' c    void encrypt(const ulong *in, ulong *out); 3 p( W6 i4 z& i/ k3 e9 Z
    void decrypt(const ulong *in, ulong *out);
! ^6 u; v' B2 E# X/ F* @    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
( z9 X! F7 Y; P, ]2 H    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } / C( N" A0 Z( e# j* n: O
private:
- N! [1 O  I; q6 a+ }4 A& ?    int _round; //iteration round to encrypt or decrypt
2 y  I" {& O6 v6 s# {3 E/ Z    bool _isNetByte; //whether input bytes come from network . F4 D, }/ g! `7 j- J8 s
    byte _key[16]; //encrypt or decrypt key ! d3 Z: @% {3 \% P
};
$ Q& q7 |- A' j
8 L6 v( G/ y9 Z0 \- d5 }#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ; `/ h5 w" w6 l6 E
2 #include <cstring> //for memcpy,memset , `7 j) x" N, v5 u% R7 D+ u
3  : F0 x3 `% k& Q3 |* @( Q; }
4 using namespace std; , Z1 [2 u4 h! Y* w+ ]+ b8 ~) u& S
5  3 ~6 d; `; t8 ?; [' c2 h  O
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) : v4 x% E9 |9 B  U# E" |
7 :_round(round) ) k" A! K% i, `
8 ,_isNetByte(isNetByte) { & Q! M7 }" n0 _0 E$ I; H
9     if (key != 0)
$ A8 a) j  u. d* V1 {  b+ f8 ^10         memcpy(_key, key, 16);
7 ^! t8 `" ]4 P% _6 d! H9 P/ D11     else 4 b( t# o1 \" ~8 i& H" u
12         memset(_key, 0, 16); 7 F' y5 @3 ~. Q0 j4 z- X
13 } ! O& i& G( `% |
14  " {2 S, }7 |, A5 ~- }
15 TEA::TEA(const TEA &rhs)
3 G( B' Z! j" K5 x4 T+ }1 y9 L; L16 :_round(rhs._round)
: G; N; Z5 p2 b+ l# |17 ,_isNetByte(rhs._isNetByte) {
; F! y, P) _: R2 ]1 S( C6 ^% ]18     memcpy(_key, rhs._key, 16);
7 j3 T2 M" L' }' i1 b19 }
- _3 `( M; f- r# T7 s* U20  
/ n& y  k2 H  a1 P. j. i21 TEA& TEA::operator=(const TEA &rhs) {
9 n1 s7 [+ p% r2 _5 T5 m22     if (&rhs != this) {
" u2 X, K5 F7 I  z23         _round = rhs._round; : \2 s0 B" e' X4 F( `& i
24         _isNetByte = rhs._isNetByte;
% g! ?& y3 g) N8 d$ K25         memcpy(_key, rhs._key, 16);
8 l$ C( N, g, a( E" Y26     } 7 S' `1 k7 n' l
27     return *this; 8 x* M& G( r- e* x1 y4 ]
28 } 2 e; d6 z" i+ F! S0 ^
29  
8 C" \$ ^, m& y( p, [30 void TEA::encrypt(const byte *in, byte *out) {
. z  w2 Y1 f( u1 D1 l31     encrypt((const ulong*)in, (ulong*)out); ) q4 m* T1 U1 ?! i! q# Z
32 }
8 o% p; N, y! g- E6 m5 K% |33  ! V; Z" x% ?: {
34 void TEA::decrypt(const byte *in, byte *out) { 8 d2 f' s* C6 P# J+ o9 e& q
35     decrypt((const ulong*)in, (ulong*)out); % J4 ]7 g  c2 _4 f6 ?
36 }
/ t9 H7 b: s& H) o! n9 W# g37  
& a3 Q8 o7 K3 [* h3 V5 b38 void TEA::encrypt(const ulong *in, ulong *out) {
/ }0 O$ y% M( B% j4 q39  
% ]$ l# F, M' u8 m6 M40     ulong *k = (ulong*)_key; 8 o; w& o, @# N/ {% @6 }! f
41     register ulong y = ntoh(in[0]);
) P" r+ u4 S. M42     register ulong z = ntoh(in[1]);
3 N+ ~# M% A- Y+ C43     register ulong a = ntoh(k[0]); 4 A- a; x6 C* s% D, n
44     register ulong b = ntoh(k[1]); / i8 F7 @3 ~) j* \: G0 h- i4 _
45     register ulong c = ntoh(k[2]); / z! Y3 i( J3 ]7 _
46     register ulong d = ntoh(k[3]); 2 _3 b1 T' _1 Z. ?: I6 t
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: R4 V! l. i" P0 ]4 h5 S4 Z48     register int round = _round;   }5 n1 q9 N! x
49     register ulong sum = 0; ( e" l& T$ l. w. t8 n3 ]' z$ j
50  3 r6 n2 }" N, x' G# N) c
51     while (round--) {    /* basic cycle start */ 7 U! Q" t+ [; B% [7 c5 Z
52         sum += delta;
! D; N3 M- a6 h4 P53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); * u+ W8 f* W2 H  V% H8 \, R: y
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
8 o* R  v: x3 ?55     }    /* end cycle */ * q' \6 q0 ~5 u( m8 ?
56     out[0] = ntoh(y); * o: ?! |% ~% s7 E- T
57     out[1] = ntoh(z);
  O0 f1 Y5 o  k( i+ ^58 }
7 N! ]2 Q8 i# G7 T0 k  {2 v* C0 d59  
$ P# W1 X) M; U5 o7 F2 b7 T60 void TEA::decrypt(const ulong *in, ulong *out) {
. D# @5 U! y" V7 L# X6 }) e61  8 N: W% @+ x6 }4 x* N8 {) ^% O( `$ H3 o
62     ulong *k = (ulong*)_key; ) \) b8 |5 [1 s  _
63     register ulong y = ntoh(in[0]);
4 D8 t9 e0 F* L3 u6 N! B" Y8 V64     register ulong z = ntoh(in[1]);
( N# L' @8 q, J( u+ t3 b65     register ulong a = ntoh(k[0]); 3 {5 S% r, {4 ]: w
66     register ulong b = ntoh(k[1]); 5 `- u, B! d6 d/ [& ]; y
67     register ulong c = ntoh(k[2]);   l# c. \# R1 A" m( o- i- _$ `
68     register ulong d = ntoh(k[3]);
, e* x% ^8 [2 l6 _* R' g6 w+ \; X69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
, \* n; K; @& x. ~5 Q9 I# s2 N, U70     register int round = _round; , U- U# b# q9 B
71     register ulong sum = 0;
2 G* q9 l7 ^% S8 [, ~/ I4 o72  9 `% W; O* j& U5 d
73     if (round == 32)
" N2 }! S$ J+ L8 x! d( y74         sum = 0xC6EF3720; /* delta << 5*/ ( g% v( r  d2 f0 ]9 ?. ]
75     else if (round == 16)
0 G" `, ]7 ~' H: i, p- |76         sum = 0xE3779B90; /* delta << 4*/
: f& N; U$ O7 T' z' K3 v( ?77     else
7 f, j0 K  \+ v) Y78         sum = delta << static_cast<int>(logbase(2, round));
" s0 Z- o. q; P5 M5 `7 u79  ! y; w- n' Z0 z- f& E( q' ^
80     while (round--) {    /* basic cycle start */
( W4 A4 {1 X8 y0 u81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); & n5 c' A- @) B" ^. Z
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);   i2 L; a* }( i- y* i4 O7 [( @( A
83         sum -= delta; 7 G6 g0 g, e) `2 l
84     }    /* end cycle */ / y0 T2 z1 X* ]) t- k5 e  t
85     out[0] = ntoh(y);
& S/ c) l# ?3 ?# U$ o86     out[1] = ntoh(z);
/ A! i% R# Q2 S5 R87 }
8 c$ X6 t+ D, U/ E: y6 U6 P& j4 O" Y; b
需要说明的是TEA的构造函数:
1 P0 V7 E0 u: _; CTEA(const byte *key, int round = 32, bool isNetByte = false);
: O0 g8 U9 V* V1.key - 加密或解密用的128-bit(16byte)密钥。 + d9 d& J& `8 }' ?" a6 P
2.round - 加密或解密的轮数,常用的有64,32,16。 ) q* K9 o* j' r. S
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
; z  |9 E( C1 M8 s/ D8 b3 w6 E& W3 \3 O9 M" V1 L
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" & d1 t: K, K4 K
2 #include "util.h" 4 N) ]0 i; x, w2 ~4 R* ?2 M
3 #include <iostream>
1 ~! r6 p8 B, d* i$ v 4  ) x: N) W7 G4 e5 F/ b! z* Q
5 using namespace std; : \, M' P, T$ N5 x1 D: L; z6 ?
6  ' W8 y# r4 p3 U: Q
7 int main() { 9 P" q: h  W( x) I' w
8  
. `. Y* j  X1 H/ Z! \/ g 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ; n: Y6 z. H0 y: U* z$ M7 ^% ^. g; O( Q
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
: J% u% o) b& ?, d11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
5 P! Q, m; f7 p/ I( k8 q( ]1 x12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 3 S( \& N6 S& n8 X9 t
13  % Z7 H+ N0 p( ]3 D+ s" b3 C
14     size_t size_in = hexStringToBytes(plainStr, plain);
8 t( A' {2 q* R4 J: d( l# ~* \15     size_t size_key = hexStringToBytes(keyStr, key); ; D) H% `+ H6 e9 o
16  - s7 Y$ y6 X0 R; Q8 R
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ) o1 _# F/ x: N6 v$ e3 P
18         return -1; ; I: T2 n" ^9 S; V- j% m" l# n( c6 `
19  % h0 M: s2 W/ t: _- R
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
) m( \! ^- n" K/ W, I6 @2 V4 A21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 2 U( Z* E# S9 F( h0 x: k) _3 p
22  % m$ s. \- D" h6 J1 M$ ^/ Q
23     TEA tea(key, 16, true);
0 \4 w2 q! ?+ w  e8 t24     tea.encrypt(plain, crypt);
* }$ Z6 h, L" `/ n: h' S! [9 ?25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 7 D" \8 ^  J% P, z5 v8 F( U( Y
26  ( \8 c8 q1 z; {
27     tea.decrypt(crypt, plain);
& J% G' R" J5 p$ P% Z8 u2 K4 w  F28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
- H# q' t% z: }. F) n9 ~0 L29     return 0;
5 F: l7 `. @0 e30 }% }* T7 A; a& w' l

7 N5 M$ v8 Q& @  w/ h! d本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
1 h. e: I; h& o& u运行结果:
* _( y; K7 C1 A  d+ X' mPlain: AD DE E2 DB B3 E2 DB B3
3 y! }. a+ ~# u4 o$ r# H, F, DKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
7 y) e6 o6 p6 ~/ Y! q! i1 Z8 ECrypt: 3B 3B 4D 8C 24 3A FD F2 - m# j% _* T: T1 Y, A! G2 a
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 07:07 , Processed in 0.019503 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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