找回密码
 注册
搜索
查看: 37906|回复: 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轮):" P( K6 g6 l: {: r+ h/ ]
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
9 V, A5 N' y$ S: v: KTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
( {$ Y- t3 J. g1 z& K8 z: D* ?% w之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
1 E5 C, p9 R4 ^' Q6 X' V7 I% p# ~在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 . m9 I1 B. e6 u1 G- k8 G+ [
在 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. , T0 I/ b5 Y) M) @5 K
  2. void encrypt(unsigned long *v, unsigned long *k) {   [& T6 M' ~8 l- O# v: F
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 3 U6 |3 G/ }8 |9 @1 W5 w4 Y
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    " j4 X" s2 M! J- O  o! L
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    4 i5 P3 D( t, F& C" B& P& t
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    7 U0 [1 ?  ]0 |6 q3 P$ Y8 @' _) \8 q
  7.          sum += delta;
    " t& ^$ x: e& M1 l! D/ I6 z9 A
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    # m% b& {5 w, {/ e% m& u
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 8 x, S: |5 n* ]2 I* b0 p7 v
  10.      }
    7 u2 b' n) w  V# T4 X0 N9 e$ s
  11.      v[0]=y;
    ) \1 H# }* w6 z5 Y2 g" Q( K  {
  12.      v[1]=z;
    1 j: d) e# ?% M+ t! U
  13. } # m3 t, q: a2 ?/ B3 {7 P
  14.   
    % [9 E$ @% v- G6 X; B
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ! G+ H4 V4 A, q" j! X1 c. O
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ + d% C) n' {5 r( Z2 {1 p" E; `5 y/ H
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    : l2 C) j0 `* B+ F
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    - O- y0 v" w" g- F
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 8 r' L6 `9 u" N
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); % N5 x# ^6 N/ z1 g! V/ m4 V9 H
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); : _, X: T+ M! s
  22.          sum -= delta;                                /* end cycle */
    - ], x- M) Q/ {$ i! T3 ~; b3 R' j
  23.      } 5 t' f7 w" a4 z" x7 C: q, ?, S3 T1 l7 P
  24.      v[0]=y; ) r: L5 [9 t# `, A# h" O7 N0 O, A
  25.      v[1]=z; % o+ I. h" S: f
  26. }
    8 Y) V# z  P: L+ x* f3 |
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 1 B8 U* v* U! k+ `9 \5 v3 {5 R
#define UTIL_H + {: v3 b' P. |& ]1 m
1 E6 Z8 n; y/ L9 d
#include <string> % t1 Z; `  r+ k. z% \; o" O
#include <cmath> 6 {$ h5 l7 ]! m1 c9 l7 q" v4 E! A
#include <cstdlib>
6 C  d, s/ U% ?% Y: |0 C3 C' w  H ; u, a2 o0 e0 m* e
typedef unsigned char byte; 5 |- o: q% D# @+ m
typedef unsigned long ulong; ; F9 y* K; ~, W

6 _2 y" [9 a& O" n! z/ pinline double logbase(double base, double x) { 9 t, Z: M# C; t7 b" k- w) @
    return log(x)/log(base);
" b1 o2 |; A1 t5 g. f7 W}
! x7 u1 W8 v2 x% D; U  D# V 4 ?. r5 v: O) ~7 k4 l! e
/*
3 r& }6 q& n- J, |& q# Q; Q7 W*convert int to hex char. + X/ @0 Y( Z" K2 B2 A% r' Q$ i
*example:10 -> 'A',15 -> 'F' . c1 n* H  h. j1 _
*/
* l+ a! X; L3 pchar intToHexChar(int x); % v, R* F! L( ]1 Z
* |8 s. ^; ?- O( [
/* 8 ?6 K/ a. C0 [& s5 u
*convert hex char to int.
! X& [4 U2 w- \& A6 ?* c. h1 L*example:'A' -> 10,'F' -> 15
7 {  a- U3 Y" j% R' k*/
+ Q5 r$ S8 y+ c$ Rint hexCharToInt(char hex);
% s% n9 V6 P& D/ s' D& U
; a/ j  Z! k# w: Y' ]using std::string; 4 \4 {% `" @" }! o/ B  x  {
/* " G1 g$ p2 n; I7 J& [
*convert a byte array to hex string.
7 t* D6 q" v2 ]" C1 m*hex string format example:"AF B0 80 7D"
* O  m6 i5 |6 i7 D% n/ v  u" ?*/   v$ s$ ^; v6 O0 W$ q1 Q
string bytesToHexString(const byte *in, size_t size);
1 ~0 p+ j* Y" A, e! W' a* z5 _ * ~; c- |1 C, L5 H
/*
, n( r  d0 n9 g' f3 D*convert a hex string to a byte array. 4 {6 T' L0 X# t' k# X2 S
*hex string format example:"AF B0 80 7D"
  i# K9 u9 p* x' T" Z9 a( T/ q*/
: ]2 n6 H% Y& n- v% s7 Nsize_t hexStringToBytes(const string &str, byte *out);
( e, `# m' o1 \, p$ G ! f; J: f6 v& y9 M1 ?( ^9 m% V
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" " G/ [7 a( `5 r4 U
#include <vector> ( K( Q, X+ T* _8 z& A( G& _0 a6 D1 t/ Y

0 r# g9 G/ K" B, Pusing namespace std;
, Y- `. W. u1 v/ ^- @" H  ^$ Q % \: \) x' c! w8 D) A- S+ J
char intToHexChar(int x) {
  f. i* P5 G, _% S* g% ^8 g    static const char HEX[16] = { / @! P7 M& z) E6 J6 Q, Y
        '0', '1', '2', '3', % |* Z1 H9 ]& D! u3 b6 o% ]) @
        '4', '5', '6', '7',
& ^- j) z. e: F& G' E6 a9 ~        '8', '9', 'A', 'B',
, U# h4 f; \3 \1 R0 e  q9 z        'C', 'D', 'E', 'F' ; x  d) B; w3 O9 B
    }; : I. T: j, {: a) u
    return HEX[x]; ( E" g* @6 Q" |! x
} ! d  B8 u5 `2 j$ P, p5 N
! P6 l  W: l1 I* v+ u3 u
int hexCharToInt(char hex) {
) S6 Y+ o5 l. w    hex = toupper(hex);
1 @! }4 |: i5 X/ G    if (isdigit(hex)) 0 C4 f$ l1 r0 N
        return (hex - '0'); 5 m3 R3 U, g( }$ s# k7 t5 p9 a
    if (isalpha(hex)) & K* `: P! A; L/ d- g. c9 D
        return (hex - 'A' + 10);
4 q7 @+ y# J; L7 `( j    return 0;
  y' U+ B7 X/ A' d. }* y% I}
. Z# G8 U* h% j* S
/ M( D4 r5 y" e; C7 R' vstring bytesToHexString(const byte *in, size_t size) { 9 ]6 O/ t$ n, f: z3 c
    string str; / J. M7 R, i0 L* x/ `
    for (size_t i = 0; i < size; ++i) { 6 {% m9 e' D4 W, I5 \
        int t = in[i]; & R  A# y9 [2 H/ Y9 }& }0 ^( v
        int a = t / 16;
, o  B7 Z& l5 ~" z3 }7 f        int b = t % 16; + Q( o8 R' X0 R
        str.append(1, intToHexChar(a));
! a4 V1 G3 l' p2 r3 t  U. ]        str.append(1, intToHexChar(b)); $ X3 h% X) e" X% b+ f% b2 K1 `: `. [
        if (i != size - 1) 3 h) T5 c( A8 |$ s3 b
            str.append(1, ' '); " o' ~# i! O- d7 w7 _' E* S
    }
% Y8 P. ?8 A& n    return str;
. ?( Y2 k' _) I  y1 l. A5 v" s} ; b5 Q2 b  [* d, ~, H5 s7 `

! \4 x* G" o8 Tsize_t hexStringToBytes(const string &str, byte *out) { ; s1 T% x& G, G5 S& c3 a
9 F$ n/ P4 P/ D) o
    vector<string> vec; " `( E! w6 _+ {5 W9 h
    string::size_type currPos = 0, prevPos = 0; & m4 H3 f; `6 v& \; o& |- M
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 9 ]0 j( d- m6 _6 N2 S
        string b(str.substr(prevPos, currPos - prevPos)); 0 b- V2 T0 h$ K6 h
        vec.push_back(b); 9 ^- l1 Y# e; |) p
        prevPos = currPos + 1; , n  {# H' u+ t0 t. h" m0 z
    }
" ]$ f, N, V$ k+ |  G    if (prevPos < str.size()) {
* t; g; c8 O+ }* M& R! g$ D        string b(str.substr(prevPos));
8 P4 G% @4 b1 o' u        vec.push_back(b);
  G. t. U) B! H: B" b  N+ [0 [    }
# L3 D& ?9 w6 w6 Z, Y9 O4 X$ d2 M    typedef vector<string>::size_type sz_type; 2 {& n) u5 y. Q1 c+ c
    sz_type size = vec.size();
( a/ B9 b: J, N( n    for (sz_type i = 0; i < size; ++i) {
# @0 E4 _# R/ b* A6 Y  ~, `4 n! U  o        int a = hexCharToInt(vec[i][0]);
7 n- n5 L! z( p, z$ a# r1 B        int b = hexCharToInt(vec[i][1]); " ~/ A4 ?& P, }/ _
        out[i] = a * 16 + b; 5 C% e5 _' F/ u8 \  _. C
    } $ U0 M% V% Z2 t% O
    return size; + a, n: n. ^! a& }6 Y2 o+ x
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
, d+ b7 u* c# z7 d# M* A#define TEA_H
$ k! q( \: r) I1 |+ f$ [
. w/ l% [/ O2 A- ]  I' R9 r6 ^2 t/*
1 D8 \! e$ S' M- E; l*for htonl,htonl
' ]! x+ k8 A. P*do remember link "ws2_32.lib"
; x; n7 Z! i* y3 m* h9 n*/ , v& z* z5 f0 b% f' Z
#include <winsock2.h> 8 X! e5 U2 J% {- I8 Y3 s5 l0 e
#include "util.h"
4 }# |6 }) U( U$ K& @
' Z3 Z" h# ~- T9 j8 v; Vclass TEA { # G, P4 n' B7 _9 |5 Q$ Q
public: - E% h8 J7 z6 t# B, s$ q, U
    TEA(const byte *key, int round = 32, bool isNetByte = false);
3 r$ d% L9 a: P* _8 w% M    TEA(const TEA &rhs); ( w  G* J5 f6 o8 V( e; a
    TEA& operator=(const TEA &rhs);
8 a2 u- w+ u4 w    void encrypt(const byte *in, byte *out);   M% S* O; P; ?. p
    void decrypt(const byte *in, byte *out);
( d& m( i3 w1 C  F& dprivate: : j" G. X2 g" S3 E% h2 V7 M
    void encrypt(const ulong *in, ulong *out); * t' x* S: Y3 R& \/ ?  u
    void decrypt(const ulong *in, ulong *out);
0 K+ y% N6 N. i8 ?& K; ?. n- Z    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } ( b, W9 t" |2 {9 W9 [2 S6 y7 Y& A
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
0 z) ~! a+ R# n, Zprivate: ; h( k( ?3 J& V. {3 r, `
    int _round; //iteration round to encrypt or decrypt
% a" Y# ]  j' H/ }* U    bool _isNetByte; //whether input bytes come from network
5 Q" D& L: d, b" f. S    byte _key[16]; //encrypt or decrypt key
6 U; W+ I. O% r2 p1 @! z8 y}; ; s) q' B- g- j

& v7 C: }7 [0 J' q/ c1 f#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
4 {" y& |( n: t# M& w; c; ^( i 2 #include <cstring> //for memcpy,memset " |- b4 o# ~) R* b
3    G) I, T1 O7 F7 U7 X5 c
4 using namespace std;
' L! R8 C" A2 B8 G: W% j% c 5  
3 O* R& c/ L1 I' X 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) , `6 d) l1 T. H, C' S. R
7 :_round(round) * C$ B$ Z; h! ^7 G" C' O  V+ ?1 _9 q9 _
8 ,_isNetByte(isNetByte) {
3 Y, ^+ g! F# n 9     if (key != 0) ) h# \3 B: a! `. N* }% b1 x
10         memcpy(_key, key, 16); : j. f  f  e3 n9 k0 D8 y
11     else ' z# r1 l' `) |- V& J3 v
12         memset(_key, 0, 16); 9 ~& g1 P+ G# P" X( Y' ?9 w
13 }
% W6 J0 U! K# c$ _0 d14  ; S6 R! Y0 ?$ @9 Z& s/ P
15 TEA::TEA(const TEA &rhs)
5 u( P- z+ x8 U/ O' w* y0 v8 @+ Z16 :_round(rhs._round) 8 c1 n& G& U) o% V- m9 S
17 ,_isNetByte(rhs._isNetByte) { ) h- W+ e% f: ?8 G& y$ c
18     memcpy(_key, rhs._key, 16); 8 n! \9 P8 X! A& E  m
19 }
6 @$ I0 v+ W8 W# i20  
, V3 O# P2 f/ n1 g) L. w$ W21 TEA& TEA::operator=(const TEA &rhs) {
4 r) Z5 t8 a. y0 }# s22     if (&rhs != this) { 5 r. d2 B6 ?6 V% j' H) a
23         _round = rhs._round;
- A) K- e" o% [1 D6 t24         _isNetByte = rhs._isNetByte;
+ d: K1 u" R  y, Y7 E/ u6 u25         memcpy(_key, rhs._key, 16);
4 o& x# j& B: ~# [( @26     }
& c+ M" m1 y8 A0 w% A27     return *this;
' P! U. m: E9 T" M" F28 }
/ Y9 Y- U3 i( c1 _/ }, O) f* P29  5 D9 y- o' H0 N2 s
30 void TEA::encrypt(const byte *in, byte *out) {
8 S" J: m; p& W1 w. t) f31     encrypt((const ulong*)in, (ulong*)out);
/ s# k2 h# k9 x0 C9 K* H32 }
" J8 B2 w9 U3 G$ ^( m7 D( Z8 M33  
) E% H+ h$ T2 I/ K: \34 void TEA::decrypt(const byte *in, byte *out) {
6 v5 x0 E: U% g8 B/ o35     decrypt((const ulong*)in, (ulong*)out);
7 Q7 D5 o. c0 a2 c8 @1 B36 } + |" U* G0 i4 F# t1 m8 {
37  2 u" w6 K! a8 F) [
38 void TEA::encrypt(const ulong *in, ulong *out) { & q4 l2 ~4 Q0 j# `& S/ Q, z& n' {# c! G
39  
1 I' u! {, f7 T' }7 D4 s& m+ z40     ulong *k = (ulong*)_key;
6 [( c. w( B4 X% [! D41     register ulong y = ntoh(in[0]);
4 X* b6 Z/ J6 V# D2 f( K+ Y, J42     register ulong z = ntoh(in[1]); 1 x2 |! ^( v  i6 o
43     register ulong a = ntoh(k[0]);
1 h" @' k) i# y44     register ulong b = ntoh(k[1]);
, r3 y- `0 I* q. l45     register ulong c = ntoh(k[2]);
, ^4 r+ z5 v) p; r4 F# }8 U6 j8 ~46     register ulong d = ntoh(k[3]); ' ^8 k( [/ ~. t" j7 E/ f
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: k- q) `/ t/ x% G48     register int round = _round;
+ Z& w4 x) {; c; f; W0 N& I1 O, A1 K$ R49     register ulong sum = 0; + T7 w- j1 \2 I6 ^3 K7 N9 W
50  4 t: A( J/ L% s
51     while (round--) {    /* basic cycle start */ ) h( _! X; M! G5 R9 H+ K9 m" F
52         sum += delta;
* K; B2 t" o+ D: Z53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( {5 v) V' G: z3 _54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
0 D8 S4 v& @. s! v! N1 a( J55     }    /* end cycle */ 8 J: J, B- o" ^# w3 e" b
56     out[0] = ntoh(y);
0 d; e1 Y% _" _  t) E4 A57     out[1] = ntoh(z); 0 f) s& Q& ?6 K: x6 B2 b
58 }
6 a( I% I9 G3 h+ I( M$ i( _59  4 g1 Y( Y# d3 a3 S2 X" K; T2 Y) l
60 void TEA::decrypt(const ulong *in, ulong *out) {
' `1 r4 b6 {; h7 J+ h, a% @61  $ d6 ?8 K5 A4 k1 p
62     ulong *k = (ulong*)_key;
8 Y) t3 `/ `; t1 [, ]8 ?63     register ulong y = ntoh(in[0]);
0 y) B& T* v  J& K, R64     register ulong z = ntoh(in[1]);
& N  z* ~8 }9 u4 K# d& [; d/ ~65     register ulong a = ntoh(k[0]);
& c" W; R9 {3 k+ r2 Q% Z2 c66     register ulong b = ntoh(k[1]);
  B$ g+ T. ?7 w; j, m$ V+ x8 F67     register ulong c = ntoh(k[2]);
0 Z( V- J$ s" ]+ q9 J: X68     register ulong d = ntoh(k[3]);
8 I; m$ ]+ @: s$ w" S69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 2 o; O  [8 V' `0 l* X
70     register int round = _round; 1 L# C( _5 Z# H$ A$ h* b
71     register ulong sum = 0; 3 O1 t5 k; {. m. B$ Y6 p+ b7 h
72  " z" H% M. [: p
73     if (round == 32) ! b& `, g; W% |: [, S
74         sum = 0xC6EF3720; /* delta << 5*/
; W0 H- B; ^5 h" g& H5 W75     else if (round == 16)
: W1 G( r9 D: c0 H! p* x9 K76         sum = 0xE3779B90; /* delta << 4*/ 2 i( E) `. q( M% ?: s( Q; R
77     else , y' Q& {* q* l
78         sum = delta << static_cast<int>(logbase(2, round));   L) y% q1 h" y; X) D* U
79  / f) k5 D# z5 @! ?2 y
80     while (round--) {    /* basic cycle start */
3 `# D- g+ c5 M, h+ x81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 6 \. X- g* R( e& Y
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 5 P  o. B8 k8 q! M2 f
83         sum -= delta; : i7 v+ p6 w4 G' |! x+ S
84     }    /* end cycle */
/ H1 C2 @- A* _. k, I$ h  E* t: R85     out[0] = ntoh(y);
$ _  J! S) y" V  S" y86     out[1] = ntoh(z); , m0 @. Z2 [$ Y. t! n
87 }- ^8 C6 |, ~- D* I+ K9 y) L' x/ x

5 ^5 r* _; a3 @" E# y需要说明的是TEA的构造函数:
% V- q$ l* Q! j! p; {( B) [* UTEA(const byte *key, int round = 32, bool isNetByte = false); & h( h( C4 A0 m$ o
1.key - 加密或解密用的128-bit(16byte)密钥。 : n& B* Q0 |  l' B+ g' |, o
2.round - 加密或解密的轮数,常用的有64,32,16。
9 A; r; M* n7 t( Q( B3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! $ p. [8 q* o" l0 t/ Z, L5 t
3 b1 x% [( |- c
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 4 C8 W9 F5 y2 g6 O) O8 N# v
2 #include "util.h" ( z  k! h, ?* S1 z+ U+ j  ?# S
3 #include <iostream> . G" W! L! y. l$ D! N% a
4  / Z6 [+ `# q" L, E
5 using namespace std;
( J3 g: A' f+ x7 x0 y 6  
2 Q3 E+ x. c$ e$ J 7 int main() {
. M. f& V4 x9 x( K; b8 s 8    Y5 X3 V2 @7 e- Q# P3 D: h
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 5 f* \. a# Y* V" m* d' D1 a, j
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
9 C& J1 n3 F/ H6 h  ^( X11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; # A" I/ P8 f+ p" u1 P* V! R
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ( u( U9 N$ b/ O2 s
13  
& |2 s) S+ K; u4 D9 ^14     size_t size_in = hexStringToBytes(plainStr, plain); ) q5 W) r: B& z3 U) s. E
15     size_t size_key = hexStringToBytes(keyStr, key);
$ ?  S" E% R. K" G16  - H& g7 z; A9 l
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
3 R0 ^* J' n& N: B* |18         return -1;
% X" j$ e5 Y4 `/ q3 t19  
+ b$ h# y6 T, L7 y20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 5 `5 |, E8 |4 ]8 O
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
% O$ t, z+ m0 U22  
3 i% G9 d8 f: E2 h0 Y9 [7 G23     TEA tea(key, 16, true); & `: I% @- ~  g# ~9 H
24     tea.encrypt(plain, crypt); 2 e  [4 Y: I; g7 Y9 |  \# _, N' G: \
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
# b  ?$ C; ~8 h3 f: }26  
, T/ X8 x/ H. Q3 R1 `27     tea.decrypt(crypt, plain);
  k6 f" J( g$ \3 i) D28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 6 V# C9 Y6 V* A/ V  |
29     return 0;
, F! {8 c" g4 X30 }6 d' i. r2 a- p7 ?" s* ^
! r& E4 |9 G; K( e/ v) H$ C+ O
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx7 z2 i, N; `( P) J1 U
运行结果: ( p1 w6 ~. p- q  C
Plain: AD DE E2 DB B3 E2 DB B3 : M. }# k  G- ^* N
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
# ^! l3 d. t  ~  c9 {6 K/ ]Crypt: 3B 3B 4D 8C 24 3A FD F2
1 ]) w5 I) x% ?( R: e6 ~* qPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-9 06:46 , Processed in 0.024826 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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