找回密码
 注册
搜索
查看: 37844|回复: 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轮):
( w& r* H/ @5 E/ R微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ! E, `) y2 y6 ]# u2 n
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ; F  ^5 C; P0 {. M8 v9 S; x8 y
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 4 K% q( h8 Z$ x/ G; Z+ n4 q
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - M9 n3 [3 U1 e( B. L1 M2 b! ?
在 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. 7 k, O" _) T: F9 W! v1 J
  2. void encrypt(unsigned long *v, unsigned long *k) { 0 ]) w4 U, Z, o0 A0 l" q6 a
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ / b7 o- n) ^+ [
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    . V/ E3 {- w( q7 N
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 0 b  a# E+ [' R. L7 h
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    0 [% r  q( p4 {9 m, p
  7.          sum += delta; 0 ?, h" S; f* E4 _8 [# ]
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); , [2 }. P/ V- p+ ~
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 4 I" X  ]7 g4 x# p/ u
  10.      } " a0 M+ ~; `& G5 a
  11.      v[0]=y; , X. J$ ?+ a. i* E  _
  12.      v[1]=z; 5 n$ Z$ p" z5 z4 P
  13. }
    # N4 c9 b4 [( N& l. X; ^8 X, i# T
  14.   ! s+ w- N0 X  b) _- ]
  15. void decrypt(unsigned long *v, unsigned long *k) {
    4 [. _+ H/ i( K
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ , G- L8 H& b" p' h- ]& ?! w
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    4 K7 ]0 z8 Z0 o
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ) }  X7 r& G% M1 Z! ^: n7 ?& S0 v7 X3 ^
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ) y: Q( O* K4 L, B
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    6 s. x) [- j: ?5 L6 V5 E
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    # L4 f" I' E, V  p( D3 D3 n6 s
  22.          sum -= delta;                                /* end cycle */
    : ^7 R  g2 d' \' D9 k; y7 ^: z+ f
  23.      }
    3 v6 u, b9 u7 l
  24.      v[0]=y;
      l+ d! Q* v; C5 O- G
  25.      v[1]=z;
    9 y2 ]# g5 x% D
  26. }' I' [  r  x1 {  m& E  G
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 9 @0 e5 O, u* |* E+ S# y0 v; ]+ X
#define UTIL_H " O9 ^5 O" |& U; K
! G9 d% U  L: E
#include <string> & u3 Q6 ?0 `6 e  O4 F8 A! \
#include <cmath> # F$ ^# ?: Z& c+ h$ R( i; ^
#include <cstdlib>
  D5 M& u; G+ Q  m, z 5 R# G3 e/ L' a" q$ {& D0 O
typedef unsigned char byte;
, i! I: Q( `4 D7 M; y/ Ltypedef unsigned long ulong; 9 B' g6 I  b9 b# p0 V, y
$ L! U) k6 w( M0 f. _0 ?
inline double logbase(double base, double x) {
: `  q3 I0 c6 A' ^: o1 L1 w8 B, M    return log(x)/log(base);
5 G) `- Y5 x' y' U( x9 v}
2 J, k1 B* {* ~. ]6 W ' _6 ]$ R8 }) z
/* # c% l' k/ \% {" \
*convert int to hex char.
9 `% @2 @- z& d8 P0 W, A*example:10 -> 'A',15 -> 'F'
" Y: \* V* j% A7 }*/ ( {3 x* D( [, o/ e3 K( Z8 T
char intToHexChar(int x);
. G3 ?# `. G8 G: v* y ( V, H5 ?! t0 h" w: |
/*
* c6 r! O7 n3 f4 [. }0 |, [7 h*convert hex char to int.
7 {' r3 G$ j( M. Y# U1 c4 Z' D*example:'A' -> 10,'F' -> 15 % ]+ _2 L* q, y" _
*/
' t3 Y1 T9 j+ l( c9 h& i( `int hexCharToInt(char hex);
, i9 T. o+ U8 n2 F* J% R- x / L" P7 j$ g- ~  i- C
using std::string;
7 g$ X& K8 I! q9 y7 T8 m/*
1 z3 E# R0 [+ ?6 `9 A% C4 H*convert a byte array to hex string.
7 ^9 Y5 s: l' u+ t& O*hex string format example:"AF B0 80 7D"
# |1 ^4 W6 I( h* H' @*/
; P4 R& G/ z3 M1 u% r6 j+ T, I" dstring bytesToHexString(const byte *in, size_t size);
2 E7 B9 t& ]+ x; Z) Z
" f& M- s* W4 D' Y. u8 W' i/*
: {" l# r$ O* k* N( b: G*convert a hex string to a byte array. ; y4 U; s6 B0 M- J, w+ D" h7 V
*hex string format example:"AF B0 80 7D"
& g6 V  [$ `# A6 u# i( ]*/ - V2 q5 V, L. H- t
size_t hexStringToBytes(const string &str, byte *out);
/ w/ j) m" `  _0 {; G
$ D$ p9 ^8 M9 ]1 L2 E#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 4 m' N- c% R8 ?' A8 j
#include <vector>
2 L7 ?( O- z' u% f0 {  L
" N: o3 [% X" X+ |: u$ {' [using namespace std; & j0 X$ Q$ V7 c4 _: |
; B6 c5 k+ I. q' e0 t. ~  [. g
char intToHexChar(int x) { / h6 _. C% G) y' [4 N
    static const char HEX[16] = { " l. H  \/ C3 A$ Y) u% B
        '0', '1', '2', '3',
' o/ _; V) s% J( S  l9 {+ S8 q        '4', '5', '6', '7', 6 g1 n: T; q8 Z! b
        '8', '9', 'A', 'B',
$ m- S+ s; s& I, j- M        'C', 'D', 'E', 'F' * w% q& k% v! y: D8 c8 V# ?" w- q0 R
    };
- k5 d2 z7 ^' p" x) c" \" N6 L    return HEX[x];
. c( j" e7 Z! }} 5 c- c( \6 |! [6 p5 F

9 V, f& I' u& m8 a/ \int hexCharToInt(char hex) { 5 e$ r5 I5 M; w( u* x( d
    hex = toupper(hex); 9 n/ P$ H+ f, e, \9 H# A: P
    if (isdigit(hex))
4 t& u+ d# ]) P: o# f' b9 c        return (hex - '0');
2 v# T+ Q0 I, I' U8 O4 D    if (isalpha(hex))
2 t- R3 I- a$ }( s; t        return (hex - 'A' + 10);
9 r: ^7 ]) n1 K" O9 E    return 0; 8 c4 X9 c8 g1 r5 @' i
} ; V1 g2 r! r. S
7 Q" u6 X9 V- r8 K: O0 z
string bytesToHexString(const byte *in, size_t size) { 6 J( z+ p$ h9 w! I, J: L
    string str; - c7 N* Z& y3 P/ Y  M, e. y
    for (size_t i = 0; i < size; ++i) {
' U% L+ j3 {& Y1 h7 T& G( D        int t = in[i]; 4 n( a& d1 p, o& \
        int a = t / 16; 5 G) Z2 o, }* c  K7 Z- v9 o- `" q0 v
        int b = t % 16;
/ g" ?: M/ S1 w* h# _5 X, d        str.append(1, intToHexChar(a));
8 v8 V6 z+ S! I/ Z6 ]        str.append(1, intToHexChar(b));
# \8 U/ O8 I  v        if (i != size - 1) 6 K, N. w2 L( |1 Z  r! o5 O
            str.append(1, ' ');
4 l: w: v5 T  M4 P9 ?; P2 K    }
$ z: n7 M7 k6 v# {" T) U1 p2 k/ G    return str; ! |0 X6 {7 l, V) M# x9 s/ d: V5 \1 Z
} 7 b* k. v. L- X+ r9 C9 O
' O2 P; e; n  C5 J
size_t hexStringToBytes(const string &str, byte *out) { ' H9 q$ b3 e: \! L% T

6 Z+ d+ S8 j- I  v4 q    vector<string> vec;
4 I2 S4 }2 f0 I5 ~    string::size_type currPos = 0, prevPos = 0;
% U2 u* q4 ^; G% b4 ~0 J2 L5 S    while ((currPos = str.find(' ', prevPos)) != string::npos) { , J1 k3 Z, \% Q* x* K
        string b(str.substr(prevPos, currPos - prevPos)); / e! x) j& F. c8 H, L
        vec.push_back(b);
/ _. @5 e( Y7 L) [1 z4 J  H        prevPos = currPos + 1; / r* h1 P: }0 }9 _1 U' P2 }
    }
* J1 R4 O+ m1 W+ D9 L    if (prevPos < str.size()) { 0 n! M3 U4 m/ _; G! Q  D
        string b(str.substr(prevPos));
! ^8 k9 {$ E( S+ D        vec.push_back(b);
+ `( o2 `) ~: W    } ; ~' V7 `2 P' E9 S  c
    typedef vector<string>::size_type sz_type; 7 d  C2 C( N6 o! l' ]% J# ?) y
    sz_type size = vec.size();
7 c7 R0 O4 ?2 S* B( k    for (sz_type i = 0; i < size; ++i) { % X; r( R- J5 p. B' q, m. ~& @: T
        int a = hexCharToInt(vec[i][0]);
7 J! O5 x- I8 I& }4 D: x        int b = hexCharToInt(vec[i][1]);
; t. W( P) m& i3 m/ Y( M$ {" m        out[i] = a * 16 + b;
: _6 ]9 @4 |6 G7 e! {" h& _    } ! G8 \0 s" q2 T0 f
    return size;
9 W4 I+ c4 \5 K, d5 K( P7 U4 \: B' r1 ]9 E- V}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H % p5 B2 O' ~+ i# a& C: Z; @" H
#define TEA_H 7 m* Z3 O. _' r8 n9 r
$ l. A3 E: X, Q' M+ a) O
/*
* k/ {5 j  K* F9 _: X6 t*for htonl,htonl " b1 w. ?. ~  A' ^3 P
*do remember link "ws2_32.lib" & z2 q* u  M0 e& R
*/ " i. F3 e2 e( i- _0 }/ z
#include <winsock2.h>
4 ^; G5 ]& \1 d( d# Y4 h# A#include "util.h" 2 o4 r, p/ g* @
+ o' F" r) i) f) D) @
class TEA {
# t. E3 C7 Z; q) Opublic:
- v: e1 T) m/ j    TEA(const byte *key, int round = 32, bool isNetByte = false); * L4 O7 I9 Z/ Q$ v8 U/ s
    TEA(const TEA &rhs); - y- O! b( ?* \" k
    TEA& operator=(const TEA &rhs); 3 ?# ]6 l* o/ P6 s0 C! X
    void encrypt(const byte *in, byte *out); 6 M+ @: q, K/ o: k- h
    void decrypt(const byte *in, byte *out); , W7 b! U9 p- X) f4 t
private:
4 c+ S" ?) t0 |, a; T8 d    void encrypt(const ulong *in, ulong *out); ( u9 d. |7 t8 `* k9 V
    void decrypt(const ulong *in, ulong *out);
0 H; s4 J5 X0 h- t  A: I# |9 y: a. q% j% E    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
9 e# j+ N; W9 p    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
8 m% i2 X6 r. O' U3 ~$ R% L3 Hprivate:
. q* j. e, Z( ?7 J: M# a    int _round; //iteration round to encrypt or decrypt
% m5 \* }5 Q& R% A2 R6 ^: G    bool _isNetByte; //whether input bytes come from network
( s. r3 b1 o+ A9 b! I) [    byte _key[16]; //encrypt or decrypt key
; e7 }. k' \: H! [/ o};
' J; ?: ?0 k" E+ ]5 r- n : I4 d2 Z" b' C
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
2 n6 C1 F! M8 D/ Y 2 #include <cstring> //for memcpy,memset
/ [% ^; i" }# a4 [8 g 3  
7 H$ B) ~9 W7 G+ T& Q/ S- A 4 using namespace std; 4 A7 M0 Q4 E  o# A" S, v
5  
  H: C5 J1 w6 {; L# n 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
$ k: X8 v& U& H- y4 t- ]: k 7 :_round(round)
& P' V% g; U8 L) E/ A 8 ,_isNetByte(isNetByte) {
7 e; Y0 b* g, w6 L$ e0 ~, Q 9     if (key != 0) - V2 {, e: W* }2 B# A& u
10         memcpy(_key, key, 16); + ~$ }) F- T1 H; j# ]4 N
11     else
" y. k5 u! ]3 c& H& y5 o+ M12         memset(_key, 0, 16); % P1 o/ u6 ?& i9 \/ U6 G& ]+ O
13 } " R, Y& `) B' O9 J( [5 ]7 H
14  6 z: P8 {  F% w7 m6 m. d* h4 [
15 TEA::TEA(const TEA &rhs) & N9 V: C) P2 n
16 :_round(rhs._round) : c; h% n8 H- B9 ]9 `% _
17 ,_isNetByte(rhs._isNetByte) {
& W8 d  w/ a/ ]3 G  A. r18     memcpy(_key, rhs._key, 16); 5 j& x! }5 _, x5 n
19 }
2 Y/ x  }0 T1 i$ [1 I( `5 |" T) }9 C20  
* ^* V# l$ X7 _21 TEA& TEA::operator=(const TEA &rhs) {
9 V& K/ `: }4 ]3 [8 v/ F22     if (&rhs != this) {
! P% L9 E" O2 r% y5 v' K23         _round = rhs._round; - F: G4 D! U9 I  F' f8 n0 x* d
24         _isNetByte = rhs._isNetByte;
. E: y& P* x; `. h. n5 f6 W+ P25         memcpy(_key, rhs._key, 16); + }: M/ N& }# u. M9 e
26     }
! P8 k2 X% a' i. [( h- S: K27     return *this;
' y1 w3 R9 g6 P8 m; q28 }
3 ?. r, }( {5 t; o0 T4 U: A' Z9 k7 M29  
1 I9 @1 h9 U. z) Q8 S" i* B) E30 void TEA::encrypt(const byte *in, byte *out) { 9 G* m. H; \8 z
31     encrypt((const ulong*)in, (ulong*)out);
0 k6 x6 Y; W: l$ @! ]. v32 } ! [2 R7 A- s. i$ F. K; `' q
33  - F, ^1 d. X$ ]- H7 Q7 k% O
34 void TEA::decrypt(const byte *in, byte *out) {
4 ]0 B1 k# G5 s$ T8 C35     decrypt((const ulong*)in, (ulong*)out); . M! F/ p) V! \# h
36 }
3 ?6 H6 j, y0 D9 |! U37  + L% h% ^/ w' |
38 void TEA::encrypt(const ulong *in, ulong *out) { / C3 D9 x0 y3 I% c
39  
% N# O! Y" t' D+ ?40     ulong *k = (ulong*)_key;
" i/ S+ |& J, F. F; Z* w3 b41     register ulong y = ntoh(in[0]);
- q; t2 |' |" z9 E42     register ulong z = ntoh(in[1]); 4 ~3 Y* R; ]5 r: [# k
43     register ulong a = ntoh(k[0]); . u4 {, A0 J  q4 A
44     register ulong b = ntoh(k[1]); & G' T3 q" o' ?1 u& z
45     register ulong c = ntoh(k[2]); 7 o3 M! Z- q! S9 m. {
46     register ulong d = ntoh(k[3]);
7 J7 J8 O% k5 I( G. e47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
7 p: Y0 F! c7 z7 x0 J" E6 D48     register int round = _round; 0 Q0 m# q9 m/ @
49     register ulong sum = 0; ; ?  z: ]! _" V5 t3 [
50  
1 `: O  T, I, i! q& h: F51     while (round--) {    /* basic cycle start */ ; w2 F' w7 n; u# q
52         sum += delta;
# ~* M2 p1 I  {5 [/ H; h$ M53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
+ B& d; l2 u& c# J+ V3 K) I54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! O* b* L" V  B  l' N: f+ A- R8 l55     }    /* end cycle */
1 Z6 `$ R- V$ y$ t* J5 v  c2 u56     out[0] = ntoh(y); 0 p! m" u- n# `3 q, b( g# f0 R4 _
57     out[1] = ntoh(z);
; _7 s- k0 ^( m. i+ H9 |58 }
8 t) J3 w/ }+ F6 n/ |59  5 m1 n! g' B7 l' ]' X4 [9 J
60 void TEA::decrypt(const ulong *in, ulong *out) {
/ ?3 M9 k5 Q' B. n* y# ]61  
5 A$ F( y$ h# v, Z5 A# A62     ulong *k = (ulong*)_key; 7 ?( s# a* I. {8 ]3 x
63     register ulong y = ntoh(in[0]);
) `- }3 q' [; l. g* z# m3 n3 G64     register ulong z = ntoh(in[1]); 4 r  U9 n7 y1 C& e: c0 c
65     register ulong a = ntoh(k[0]); . z8 Z( f0 z( V7 s1 q
66     register ulong b = ntoh(k[1]);
9 f! w" x  Z. L) |5 B67     register ulong c = ntoh(k[2]);
6 [* u- v# P" s$ l68     register ulong d = ntoh(k[3]); & Q6 W/ j  |4 i/ k1 u: B
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & P  L5 n' H0 G& U) k
70     register int round = _round;
- g; j# o  g2 _: C9 b71     register ulong sum = 0; ' a5 l3 D2 y' ~& {6 S; N/ ?1 d+ \
72  
! U" t5 m0 o! C' {; I5 G73     if (round == 32)
  O0 {% M1 i6 n+ `+ G# E74         sum = 0xC6EF3720; /* delta << 5*/
% A) l8 G9 ^* ^8 ^" {75     else if (round == 16)
; m8 H; i" e4 W76         sum = 0xE3779B90; /* delta << 4*/
) O# V. i* v: s! z. y7 N+ r$ r77     else / z+ Z9 T7 v. M9 A* N/ n# p$ D8 y
78         sum = delta << static_cast<int>(logbase(2, round));
; V' h# a; ~0 _- U6 N: c9 T79  0 B# J8 j7 X! W
80     while (round--) {    /* basic cycle start */ 8 n, Z! T. b  l7 W
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 8 `9 ?+ M. N+ _2 f% Z% t1 O6 l
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); % P, ]' T/ U5 j
83         sum -= delta;
0 V- B' M+ W" n+ K9 f/ d! [  r' i84     }    /* end cycle */
' e4 e1 p7 g7 g: p6 h. T/ S85     out[0] = ntoh(y); - ^' M* V# \8 a, M4 T
86     out[1] = ntoh(z); # Q; U4 P3 I* F8 v+ }, r+ Z
87 }# f# b6 S0 h$ v6 g
$ C) @+ z9 @: K( u4 I; R6 K
需要说明的是TEA的构造函数:
+ P% ?  t0 Y" _. j4 v4 vTEA(const byte *key, int round = 32, bool isNetByte = false); 0 q4 v. S, I1 P
1.key - 加密或解密用的128-bit(16byte)密钥。
4 M2 ]7 E) z  r4 l; D6 S$ S2.round - 加密或解密的轮数,常用的有64,32,16。
6 ^; L6 _# O( Q; ~( l3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 9 v8 L: L8 ?3 G

/ G1 g+ _% @9 W最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ' w0 m/ m* L+ h+ f# k$ }6 c4 q
2 #include "util.h" 7 K. D& x8 y1 _' [7 a* s
3 #include <iostream> $ p' f- H" x! F# w' J& }" B
4  5 V* z# \2 Z! i" C# z
5 using namespace std; . i7 p4 N1 N. b8 g7 x* A. [
6  
$ b+ Y$ P" k) {4 o/ l. m 7 int main() {
* d4 n* b; \9 `/ p 8  
2 h5 f- n  l$ j+ Y7 R, _0 r! H/ B 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
6 H; b( A. a# A- u& Y. h10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); - a% ]  w  G  j4 H% @7 c/ r% ?
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 3 D% a6 p+ d* [7 X0 q& w& C5 |
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
: L4 [; E" Y3 V, t9 ~6 p13  
5 }; Q  e4 r9 e14     size_t size_in = hexStringToBytes(plainStr, plain);
% `' E* G) y: Z5 _2 e15     size_t size_key = hexStringToBytes(keyStr, key);
7 ^$ }/ i- D7 {; }; T  {* d5 v16  8 q) i" b3 E' F9 O; I: y# f( M! ?- U
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
4 q9 \, n: ^* E" v18         return -1;
3 t1 g" t- C$ R19  
% _+ W  x, s2 A6 a/ ^6 ~" P( V20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
) t3 M3 h0 O% l0 c! o' K21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ! _+ |, k5 X) D- m: ?' J( X
22  
' J, v! ?) I2 \) R; t( f2 x; }23     TEA tea(key, 16, true); . m( \7 |7 s3 P" _0 t, \  r
24     tea.encrypt(plain, crypt); , l4 M+ b$ `* L: }
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
* c: X+ M) q6 t/ O- }4 Y26    H' X) e4 ~: F% u' T' w
27     tea.decrypt(crypt, plain);
0 I9 {9 m+ H! x( B- d" I) m28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
! h/ \) L5 h* w: s/ q. D29     return 0; 1 N6 ^+ s* k3 s8 d
30 }. {- l6 |' e/ C. c" k/ i$ m
6 E( u* v5 Q2 g3 s% J' z% @
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
+ Q# K# q9 p& f& v- _  T! q运行结果:
7 d8 O$ s" D, `( @6 V* yPlain: AD DE E2 DB B3 E2 DB B3 + E" E& i. c3 _% s/ H
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 0 K7 z  z/ e' c1 f$ l! u( M5 w
Crypt: 3B 3B 4D 8C 24 3A FD F2 , [$ Q4 ~! y* l, d/ f
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 04:36 , Processed in 0.113872 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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