找回密码
 注册
搜索
查看: 37823|回复: 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轮):6 a6 Y# ]. V* N: X
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 : I7 G. p0 d8 ]( t- {! K3 e4 K
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 7 I. h/ E+ M* Y: h5 T2 Y1 X7 u
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 9 M; c3 s+ S9 A5 x" J" ~+ F, m
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 % X! l5 u8 s0 z" u+ A! H5 g8 w2 h; ~
在 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. ' t8 P, M! j! W4 B3 o
  2. void encrypt(unsigned long *v, unsigned long *k) { 2 v# \2 @; I# @( y
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 4 M$ m( h6 [! P4 M; E  n
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    5 l- {( I6 o& y! H
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    & f6 `7 l2 E- i% D$ [8 S
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 2 p/ X  r5 T8 Z, `+ Y' f& U
  7.          sum += delta;
    9 Y* c7 u5 o( O$ c$ D: ^, z" e
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    : }1 Q9 w. Z! I* e0 |% A4 S9 x% {
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    # r+ H0 `: Y1 G5 t. s1 h! J# V! y
  10.      }
    6 s" \: C; M8 ?) D3 o* j
  11.      v[0]=y; , F% G# K. @) R' W% {
  12.      v[1]=z;
    / T; S- b: R0 D  E( Y6 h1 Z: R/ ?
  13. } . ?! W+ k3 N# W7 h9 L8 Y
  14.   ) D, @% N& m. c- m8 r
  15. void decrypt(unsigned long *v, unsigned long *k) { 9 q% B. W5 ~$ M! N0 s7 U
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    0 a5 R2 g% f2 p7 i$ C1 C* L
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 1 i1 J  }5 K3 [' g" L. E
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    " i! M5 c+ N! |' T: Z  d
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 1 Q. s' v; p1 y/ ^! L
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);   s" {6 P% H* _5 O& C  W
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 7 B6 K2 Q1 e% E6 Z7 h/ d& w0 Y1 L; f; ?
  22.          sum -= delta;                                /* end cycle */ 9 h  u0 N: F5 N" v) K1 Y
  23.      }
    : |+ o1 r+ X2 W# ]3 w: Z( h
  24.      v[0]=y; 7 W4 K$ u5 Z8 I% X  _7 L
  25.      v[1]=z; & A& [, ^% _3 p& L
  26. }3 Q# y8 A# A+ {3 F
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 7 [' T3 n& U) S$ V
#define UTIL_H
3 q+ V  n- E9 L+ A, \. y7 V' N1 q5 Y" M% _" ^! q7 @
#include <string>
3 V' \3 l1 |! _0 d4 J/ V#include <cmath> # v# `& ?. l! p& v$ v- I
#include <cstdlib>
7 G8 y* z( s- q" [5 D4 g& E
1 J6 e( b- |% A# G7 ]5 N2 B$ ntypedef unsigned char byte; ) w; x* t; e( q- W5 W$ b
typedef unsigned long ulong; " Q) n3 @' d" [

0 J$ F0 C3 Z% ^. W+ X3 u* [inline double logbase(double base, double x) { " E8 u( L9 ?% e, S0 v( }" {
    return log(x)/log(base);
: Q# }% t: p4 H* y3 o} 6 k. g& n& T  r3 t0 f, f1 W2 j$ v
% u) h; V% F$ Y
/* 2 I, s. ^3 |, t  ^* c+ i
*convert int to hex char. * ^  I: b' k5 m, w  ?! n  R% z- w
*example:10 -> 'A',15 -> 'F'   _% T; J7 @* F! h8 M' O' U) o1 D
*/ ! [5 b) W& \- T% [$ r) u
char intToHexChar(int x);
7 G0 w' [7 E) z1 U5 J4 k
( ~/ g* T% }& q7 P( m/*
! Z' e6 D* e& v% ~& h( ?9 R*convert hex char to int.
. t+ f+ N( r* ?! K3 |5 q" a*example:'A' -> 10,'F' -> 15
% o) R7 _' \; @; F*/
1 S( m* L' m2 b  k% l2 Hint hexCharToInt(char hex);
2 j- ?6 p; x  W' \2 t" M 5 X" D+ o0 R$ D6 @/ S
using std::string; + i- `4 T$ Q6 R, q  Y: j# S
/* 9 N' r$ H- a2 ^. h# B/ o# q
*convert a byte array to hex string.
% O5 F( g  B3 |*hex string format example:"AF B0 80 7D" + |/ f9 w# F& u2 T& ^$ b
*/
8 _$ h0 _* D6 d6 N8 e  m% ~string bytesToHexString(const byte *in, size_t size); 2 U5 S3 g. p" i) E* |

/ \6 U- E0 h+ X0 W# j2 ~/* 5 I' D& U. W/ J; k1 Y
*convert a hex string to a byte array.
" I9 R0 D2 r, v* [*hex string format example:"AF B0 80 7D" ) ^( e6 X: b& d% Y
*/
" ?* X. Q; f: E$ @: L9 o3 Ssize_t hexStringToBytes(const string &str, byte *out);
) T& P2 {+ U2 u3 U# w( [1 V 9 A$ r& e- K& ~0 _7 h
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
4 l8 _, y8 N; H9 S; c; z" W* b#include <vector>   N& ^* z+ W. w: p) I: u
4 D5 `  W0 T) ?9 l* q
using namespace std;
! h( F" c- i  K+ S. | 9 e: c- m8 v2 d+ U6 S) u$ P
char intToHexChar(int x) {
* }2 [3 B- M) b    static const char HEX[16] = {
# E7 s$ o6 k2 r: W        '0', '1', '2', '3', # s2 _! {3 \* G! t% m/ \
        '4', '5', '6', '7',
1 w0 u5 c7 R+ C/ p+ Q        '8', '9', 'A', 'B',
5 J. e; p9 a9 G( k: N        'C', 'D', 'E', 'F' " R" {( j8 ?5 u5 l4 P* ^. [
    }; , V9 ^# m5 D5 V+ f1 ?8 i+ R6 M
    return HEX[x];
" j2 J0 D  l2 K& \6 i& Q}
* X6 |8 \7 z( G+ E/ ]
2 m0 ~) y1 N) ~8 }6 cint hexCharToInt(char hex) { / @' w6 x3 V' M. v$ Z( s% {2 b/ b
    hex = toupper(hex);
' S- B: {2 F- s' m    if (isdigit(hex))
0 i+ ^0 _; P5 Y6 F, ~. }/ G9 Y        return (hex - '0'); 3 x: c) p: H8 U5 X: [3 u# r
    if (isalpha(hex)) 5 o4 v7 H7 j0 E0 s8 x( s
        return (hex - 'A' + 10);
3 p; Q, g+ w  w3 B    return 0;   V7 }7 n8 i. i1 f7 R; P
} ! e7 U! F0 W1 O" H3 j8 C, k

, Z6 H# y! d5 ?' @6 Lstring bytesToHexString(const byte *in, size_t size) {
5 `/ o) u' k' |    string str;
4 ]3 k  S) c* t4 v+ d3 S& s    for (size_t i = 0; i < size; ++i) {
; [1 F# l6 _6 @/ J% l6 n+ F  G, l        int t = in[i];
, \% n6 N# A. a0 U# b8 @- F        int a = t / 16; ! q: k& w$ e5 X7 h! b. H
        int b = t % 16; 6 ]$ V2 S! ^  ~) d- z
        str.append(1, intToHexChar(a));
* a5 i' B8 d3 n# _        str.append(1, intToHexChar(b));
; A' M, ~7 r, {        if (i != size - 1)
* C  A( G9 r: P' R. ]            str.append(1, ' '); # N1 K4 c8 r  y$ @
    }
. R& N! D6 B( d( e$ F    return str; & L) c! m4 x% v. Y, p* b, {' ^. O
}
! K5 {1 _9 K# t
: N" i- u' H+ Y8 q+ |size_t hexStringToBytes(const string &str, byte *out) {
3 i4 ~8 ]+ r# f, l5 \. c) ?7 y" P' b
7 N( ^+ w% H) I    vector<string> vec;
+ N$ P$ M- D. a: F7 f0 U/ n% s    string::size_type currPos = 0, prevPos = 0; , y  J4 ^% X6 M: Q9 X* \6 l
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 7 b' `# \% ]- r) y
        string b(str.substr(prevPos, currPos - prevPos));
% ^+ x$ z" c2 O# E        vec.push_back(b); # j. q7 C5 |1 x, c0 K0 y( [0 n) \) C$ x# e
        prevPos = currPos + 1;
$ P) H$ a7 `0 T) B7 Z7 n    }
' G* C# l  s- R, \" [. H5 _9 X    if (prevPos < str.size()) { , f9 D/ Q# O1 C
        string b(str.substr(prevPos));
* z9 U/ q* _# l' P& e        vec.push_back(b);
2 K1 D" j% t: h" \  \/ O" y" l    }
" X! ?& X1 y$ E" j9 O' H5 j* k8 W; X    typedef vector<string>::size_type sz_type; 8 l3 y1 b, s( o0 d+ x4 ~/ V
    sz_type size = vec.size();
! Q  D& Z- J  C1 R) {4 b4 ], Z' o    for (sz_type i = 0; i < size; ++i) { ( L) T9 h7 H2 c
        int a = hexCharToInt(vec[i][0]);
( a8 \3 c  y: F- v' A        int b = hexCharToInt(vec[i][1]); . h: l0 E1 I/ H. M' j6 [2 A. \& M, b/ J
        out[i] = a * 16 + b; . }2 S& o& A2 c# p& ]
    } ; Q- J7 O; c% {( c% {+ }8 o0 Y
    return size;
3 r2 J  b8 _! t, g. `}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 5 J; ^: j' W9 @# F
#define TEA_H
: D+ L( s* i# \1 {
5 R$ L$ B- o* K1 i/* 4 ?- b/ n# r& y1 t
*for htonl,htonl # }6 s5 @0 V1 v- c1 G# n: H+ I
*do remember link "ws2_32.lib" 3 f* H# K9 X, {4 i  K
*/ 1 ?% O0 k7 f* E
#include <winsock2.h>   J1 D( |, `: Y" ?$ H
#include "util.h"
* K! G+ j- Z  \; |8 z9 |
& f% W: |! O4 H7 [class TEA { , T- |8 c& i2 @3 e5 z) ~2 S8 d, L
public:
  Z; b: p; r# Y% I. V9 l    TEA(const byte *key, int round = 32, bool isNetByte = false); - J6 v2 K4 L6 s9 o; [$ c
    TEA(const TEA &rhs);
& k, H/ `. x' q) b/ t3 U    TEA& operator=(const TEA &rhs); 5 N& w. P1 Y" |
    void encrypt(const byte *in, byte *out);
% w5 E) z$ [6 |    void decrypt(const byte *in, byte *out); - @/ |' L! K) l( K8 s- m3 `$ w
private: & R  B* w2 |* U1 _" ?
    void encrypt(const ulong *in, ulong *out); + D/ B5 K( [6 d0 @
    void decrypt(const ulong *in, ulong *out); 1 x* D; L3 H# S3 p& ]0 H
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
0 ?8 u2 ]2 x9 `    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 6 g9 M% f+ f0 o5 W$ [0 S, m
private:
0 |, I& S- i/ }/ V    int _round; //iteration round to encrypt or decrypt
5 [* `0 B! N) x% l- b5 G6 c& ~    bool _isNetByte; //whether input bytes come from network 3 @" `& G* C5 P3 v
    byte _key[16]; //encrypt or decrypt key * B7 T8 u, m- P$ Q/ g! x6 o
};
; F2 T4 X3 G1 |
4 g& C1 I9 i/ V' f$ Z9 D' k#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" * k+ C& a- B0 L. |1 C
2 #include <cstring> //for memcpy,memset
: }/ D0 N$ W9 G% K4 W8 Y* ^9 f 3    ?' `* F! U1 k( T+ k5 g
4 using namespace std;
  d# d4 Y+ c6 |6 z 5  ' |/ h. v" W6 n$ \; V7 B
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
/ d, w5 N0 Y9 f/ }8 C 7 :_round(round) & @1 h+ e( N9 N1 O* J' }. e
8 ,_isNetByte(isNetByte) { * F& `; R- U! k; M: {: D+ ]2 `- r
9     if (key != 0) 8 ?9 m- a; |1 M: H
10         memcpy(_key, key, 16);
* F# X+ d" L6 h11     else
* q+ [+ U8 Z' v& ?, b8 g) g  {12         memset(_key, 0, 16); . Q$ e2 `$ X/ p8 t
13 }
* U6 n1 o) M0 Z" {3 Y0 b: b9 S14  6 Y* r0 l$ B7 i  I) L' c
15 TEA::TEA(const TEA &rhs) ! x3 `% T& y$ L+ q, H  O
16 :_round(rhs._round) 7 M' t0 v2 O2 @  {3 l
17 ,_isNetByte(rhs._isNetByte) { , H/ Z) G* u6 Y8 G9 X
18     memcpy(_key, rhs._key, 16);
$ L0 |6 D/ ?/ V( L. s9 h/ j& P19 }
, `% ^4 z$ W" v, K/ J: V# p20  
+ m2 f9 r7 K' i& C9 {21 TEA& TEA::operator=(const TEA &rhs) {
6 [+ q' T8 k% q4 P4 s22     if (&rhs != this) { ( J. Z1 [, r- O/ z* K$ ?
23         _round = rhs._round;
& F( N8 h  N3 n24         _isNetByte = rhs._isNetByte;
+ k1 `7 S/ h; |/ p, N. q2 {25         memcpy(_key, rhs._key, 16); " {, x$ _6 ~4 X% b
26     }
% D' V$ d+ C8 Z1 N9 J3 E! X27     return *this;
% @/ a; `* M8 Q8 T  I% o1 }28 }
. V* S. ~7 R: Z: z29  
9 B; S4 H/ v( Y30 void TEA::encrypt(const byte *in, byte *out) { $ `# |8 D% B+ ?: ~
31     encrypt((const ulong*)in, (ulong*)out); " y- N* x( t3 L4 |
32 } , [3 r0 T" A' C& T
33  
& U. Q5 |% V, ]9 s3 M2 `34 void TEA::decrypt(const byte *in, byte *out) { " M- S. x5 @% @
35     decrypt((const ulong*)in, (ulong*)out);
! i$ g, f; O4 l$ f& R- A36 }
' N, y7 {& N5 Y37  , Z# I* ?2 g' V1 n$ ]' g- }+ }
38 void TEA::encrypt(const ulong *in, ulong *out) {
8 b- E" p1 X1 [1 I0 h39  $ Z0 e" R/ \. |; {
40     ulong *k = (ulong*)_key;
( w) O" ?6 G5 o' I- l2 R7 G' T41     register ulong y = ntoh(in[0]); 1 u3 Q/ K# E/ I9 L% C  S. d; y
42     register ulong z = ntoh(in[1]);
* G0 a6 V1 s; [$ `7 |43     register ulong a = ntoh(k[0]); 8 d, l2 ]4 Q* p4 [
44     register ulong b = ntoh(k[1]); 4 v0 K' a+ M' G
45     register ulong c = ntoh(k[2]);
( X. Y6 N1 l0 r( v& N, q46     register ulong d = ntoh(k[3]); . k! T  B: ?$ \7 t$ ~8 Q
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 8 H/ ^. T+ o' S" P, f
48     register int round = _round;
' {8 W* ?( g4 b3 Q7 c! W! _49     register ulong sum = 0;
6 u# W' \2 I; @0 L50  
# ]3 @7 l0 O- g9 C. x/ w- i51     while (round--) {    /* basic cycle start */ 2 G" H$ g; H% a. ?' o
52         sum += delta;
5 Z* F% I" `2 u! I: H53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ( ^' C" Z4 E$ m7 D. e9 s* K8 H1 L
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
5 {! \; s- H& V; }55     }    /* end cycle */
4 c/ E& M% k& ?0 c5 R* P' w- T56     out[0] = ntoh(y);
8 c+ b& f: w& K# P) R- q% O57     out[1] = ntoh(z); 9 X% I; V" [8 E7 _% \. s
58 } ! [5 C& z% s7 K- X
59  
6 Q8 k; s: c: t; ^; y9 l* i60 void TEA::decrypt(const ulong *in, ulong *out) { 2 }. m% M9 T* J7 j, k
61  & {  i+ M! i6 g/ d7 U
62     ulong *k = (ulong*)_key; 2 P2 Q  o) I( G1 D; X
63     register ulong y = ntoh(in[0]);
- d3 C/ s  V! d% ?, J9 p5 T( m64     register ulong z = ntoh(in[1]);
" H) w( p: V* }' D8 b4 l65     register ulong a = ntoh(k[0]); & C* G7 N" `' F& t
66     register ulong b = ntoh(k[1]); : }- Q# _3 ~9 I' P2 Q1 l4 f
67     register ulong c = ntoh(k[2]);
  W: I& E- f% s! T' {. Y# X68     register ulong d = ntoh(k[3]); 9 E- S% Q$ c# A1 s
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
. C' [; s* @, O+ t: r70     register int round = _round;
- y, d  u# X  g" h8 W71     register ulong sum = 0;
* `$ ~) N- d& Q* ~% L72  * v2 d% ]9 g3 N: f/ `/ ~
73     if (round == 32)
3 z2 L; d& a: Q8 g0 A4 U# W74         sum = 0xC6EF3720; /* delta << 5*/
& d6 d- g; b" C: F6 p75     else if (round == 16) ' g* x) I. s- L0 w
76         sum = 0xE3779B90; /* delta << 4*/
1 n+ Y. N  E) w8 U% `77     else + O1 ?/ G! i) m/ `3 I% o- W
78         sum = delta << static_cast<int>(logbase(2, round)); 2 u  ?! U- v% D+ l6 \+ o
79  # e* Q, M: @" n8 \
80     while (round--) {    /* basic cycle start */
1 b. {5 [5 d2 v81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
8 B9 F2 z: G& J, R! m$ S  b82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
8 l1 T3 i2 x  K* Q' {, r83         sum -= delta; & l0 x+ e0 }" r* L! U; X
84     }    /* end cycle */
. E* u& U: R, y7 H. |( Y# b85     out[0] = ntoh(y);
" H' Q/ s" N9 V2 l  i% @& C86     out[1] = ntoh(z);
, H7 I, M6 ?& R4 R87 }# K# g# [4 M: g& c$ S* _8 R. h
. d! z! H" ~1 s7 a
需要说明的是TEA的构造函数: * O3 m+ y$ q7 g7 O. Y, j! Z% ], n
TEA(const byte *key, int round = 32, bool isNetByte = false); % ]' K4 Y) T7 g6 K2 r2 m
1.key - 加密或解密用的128-bit(16byte)密钥。
6 z6 h) |/ I! ^$ \2.round - 加密或解密的轮数,常用的有64,32,16。 1 y9 ]3 h& G- i$ M
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
  B4 D* Y' i* W# i: p! D
: e  |! L0 a! z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
# ^. ?1 {( [, y! u) X& | 2 #include "util.h"
* D  [. ~+ @- B( p0 F+ R" a 3 #include <iostream>
9 E1 J: E% X2 r: Q1 }: h 4  8 o. H" [$ z0 {) y; a( ~& _
5 using namespace std;
+ U8 ~& J+ Y; r: N 6  
; h$ \# K0 E) i6 C0 G5 m 7 int main() { 7 @' [* Z/ S0 ]# k* g
8  & N- T8 @- H. U/ o; r" d. i
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); & U% e/ G' i( G; ?
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 8 r1 L' ^, v- V5 k8 }
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; " A; h4 g9 F+ B- ^; B/ u
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
  v. y  k+ W( v0 W13  
( a& u+ u5 M4 @. v0 i14     size_t size_in = hexStringToBytes(plainStr, plain);
( ~% Y. f" D) z$ q15     size_t size_key = hexStringToBytes(keyStr, key);
4 \1 L! O6 k! v16  
1 ^1 R! v& e7 s. `4 S- C; ^17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
1 J: h  ], o+ c3 t18         return -1; 5 q5 r) [) Y. z2 E. o8 t0 H2 H
19  / v: z0 `4 E; ~: m5 t
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
% k  h* e1 d& D7 t0 J  K21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
5 G, w5 _! t6 C! J7 s3 j22  ) ?! I1 n8 n+ Z8 T2 _
23     TEA tea(key, 16, true);
3 X- J$ e. R5 ^' O1 |, N24     tea.encrypt(plain, crypt); * A! r% U, V# [2 I
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 0 _* l* j" `8 @" o  K7 V# v
26    f: K: o% }' w* V5 Y) @
27     tea.decrypt(crypt, plain); 0 O; {0 Y: C/ J7 _; k$ m- \4 w
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
$ P- u8 g" P% b1 b% _29     return 0; $ j3 X& I7 y$ Q8 H7 T8 M
30 }
  X6 T( _2 c. U+ ^1 f" Q) o- f" E3 d% f/ x4 W
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
; K" j+ O* R* w/ s: D运行结果: - G9 l1 q9 @# L8 L9 K
Plain: AD DE E2 DB B3 E2 DB B3
* p' q" G7 n8 }! \Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
" N# B7 q4 A7 L2 R8 u- ~! a; W6 {9 KCrypt: 3B 3B 4D 8C 24 3A FD F2 1 ?6 T  d+ j/ e( R+ J0 i1 o
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-29 17:59 , Processed in 0.020968 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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