找回密码
 注册
搜索
查看: 37675|回复: 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轮):
& h- F& g- x8 W* F微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 0 e7 G/ ?* E! W9 h0 p7 \. ]8 R: t
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 + B5 |: T$ H" T9 X6 ^8 [
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
, T/ @% w& H. {5 X1 A" j7 o在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
, d3 E. g! p0 B; n0 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. 3 E" L3 D; n( K5 ~( }% u2 u( F
  2. void encrypt(unsigned long *v, unsigned long *k) { : ]" h* c: k0 A7 F+ p; i
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ , K3 n9 t4 @- H0 C3 z0 X* d
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    . N1 m- e7 f0 Q) J
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 0 ^/ H2 \- @2 p/ e7 {. W  J
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    9 ?, {9 `* |& r' s
  7.          sum += delta;
    # I0 r5 l3 s: R& a$ v
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    3 D5 h  z+ B$ Z4 l. {* J
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    5 x8 u% w9 h0 _. x! A" o* H$ A
  10.      } + l* X& ?& J; L4 D5 L
  11.      v[0]=y;
    $ Y; y- T% ]" {5 ~. g! O; L
  12.      v[1]=z; - p4 l3 x8 N# t( J
  13. }
    / n4 O6 ?- c2 z
  14.   
    & k( n9 L6 {5 ^8 a
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ( D9 r8 e- C' h: c$ F
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    , ?$ Y0 ?$ ]3 z5 R
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ' ~( x+ m- U( E2 E
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ! H5 F; W% O: R( m; t
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ' A0 T  N/ x: T, I* A; R" j: G
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    7 B$ i& K- G- A
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); , M# [- l( T/ g, `3 Y% z0 U, k" `8 e
  22.          sum -= delta;                                /* end cycle */ 9 c8 _2 V- V) ^! n3 l
  23.      } 7 h$ A$ k; G1 i+ O4 Z
  24.      v[0]=y;
    8 F  p6 I* j0 ^/ B/ Q. Z. N1 F
  25.      v[1]=z;
    & _8 V0 L- z7 c/ U: s, h1 H
  26. }
    ( s& X" M- h2 w9 \# I% i
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
7 n, ~' ~( ?, P/ H#define UTIL_H
) }0 a3 Z4 _2 r9 h, \$ g% x# F, d  k. j7 A6 ?: m- F7 V. `/ \4 e) s
#include <string> 4 ~8 W7 T9 w- \& n
#include <cmath> 5 ?# Q/ M0 }: T4 {( G
#include <cstdlib> " ]' L, T, [) D# a  l1 A

8 B+ W6 t3 N5 Vtypedef unsigned char byte; . L( }* I/ s7 H* v: L; `7 J
typedef unsigned long ulong; ( v  O4 C9 B/ @5 X+ H

" j+ W8 e! |  `2 Jinline double logbase(double base, double x) {
# v2 k; p- A; `3 [    return log(x)/log(base); + ]; F; [5 N) j  _2 p! U
} ; \& L; P+ f) [+ X

; z$ [  O1 {* W6 M/*
- |% K! D+ S2 q6 H*convert int to hex char. # _7 [3 ~# Z2 ^5 _* m
*example:10 -> 'A',15 -> 'F'
' h) D- R+ C: R* L$ e*/ 4 g" D0 W# g% t1 O
char intToHexChar(int x); + H* l9 A+ C: i, a
6 |6 i! S+ |: o, r+ ]- Q# G
/*
7 m' U9 i1 t8 n( q*convert hex char to int.
3 G! O- l3 ^( Y- Y! x4 e# _+ g*example:'A' -> 10,'F' -> 15 6 J/ a! h6 P" N# x7 g, R4 O) r
*/ 6 R5 C; R8 X/ C2 K
int hexCharToInt(char hex); & X3 D" W6 p. P9 ~6 x# T

4 Z. B' \7 y7 q# @& Vusing std::string; , a* C& C7 p$ U2 U3 Z
/* . ?7 j8 ~1 ?9 I
*convert a byte array to hex string.
( F( a6 K/ K! i! i/ ?: ?: Q% z8 N*hex string format example:"AF B0 80 7D" 6 `( N( P- X. V* p2 B! A
*/ 6 e0 f- v% }) z- i1 V" m6 q
string bytesToHexString(const byte *in, size_t size); + P: }0 t) F( q, t

* `, p3 |, G# w: z/*
5 {* B4 b2 y0 a/ G7 s*convert a hex string to a byte array. # W! s/ M+ ?* G0 ~% i# P
*hex string format example:"AF B0 80 7D"
# O1 \0 P/ F$ D) T: h*/
% [9 c! H( @! Y( B  g1 o0 ~, Wsize_t hexStringToBytes(const string &str, byte *out);
4 T4 J0 M( s! S# f ; j% I, m: c. B
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 5 H1 ?9 c8 X+ o; Z
#include <vector>
5 V2 r) N# }' |. D% k
. _1 Z$ m1 A) |using namespace std;
9 U8 k2 j, V. B7 X
8 G$ ~" F* V% q' M% t; D3 c/ Dchar intToHexChar(int x) {
- r. v3 `* M4 t/ q+ A3 T2 A/ \    static const char HEX[16] = {
2 n) o' S: q/ C: A: X, a        '0', '1', '2', '3',
3 e9 D6 I' K" K1 y5 z& o8 \9 f( H        '4', '5', '6', '7', 7 C; N; t; q5 B* `! Q) c
        '8', '9', 'A', 'B',
  |* Q9 H5 |' D: i        'C', 'D', 'E', 'F' 4 L1 r/ ?7 R7 ^  V' m- m
    };
6 a: a6 _$ G4 O! x: v0 h    return HEX[x];
* b+ [3 m2 ?" p/ h' U) |& J$ n} 1 k& n- V5 K9 `; u7 N( ?9 t$ q+ F
( C# v5 ]+ h, \; \1 S
int hexCharToInt(char hex) {
- V" e: m+ ^: I  l, c    hex = toupper(hex); + U6 z3 A& s# c& T4 e
    if (isdigit(hex))
, [5 S0 [+ P- Z1 Y: F        return (hex - '0'); 3 o" {  W. f' N7 q2 F4 I
    if (isalpha(hex))
$ z- {3 v% O1 Y6 C' ^' G        return (hex - 'A' + 10);
8 ^. U5 C4 b9 m9 k" k    return 0;
/ n* P2 P, S' E  A3 n! l( G0 h} 6 i3 f( H9 ~5 X8 D+ g( L
0 A7 ]% e3 F7 J3 y! q
string bytesToHexString(const byte *in, size_t size) {
' m. f( e7 j( P; i3 K: a1 y1 o    string str; % E9 U& d! N& }& r- N
    for (size_t i = 0; i < size; ++i) { & ~- g' Q" G( U
        int t = in[i];
  `7 T8 J9 `6 ^$ @/ |: x0 m        int a = t / 16; " x# y; U& `3 w  G* e
        int b = t % 16;
1 G  x3 `, A, R2 o" o        str.append(1, intToHexChar(a));
1 b$ @. \5 a6 c        str.append(1, intToHexChar(b));
( X8 N$ `( m! g9 v        if (i != size - 1)
; ]- B& q% G3 P  f8 }, Y            str.append(1, ' '); - l4 T  X, j/ z: e$ ?
    } + z. ~. v% b2 y2 C: ?$ ^# x. g
    return str;
9 Y; m3 n5 ^/ J1 m& ^% l3 \} + U" J7 r) r( @" @1 Z4 ]
( k3 W& k8 E7 j; Z; N: s
size_t hexStringToBytes(const string &str, byte *out) { % R. V# {( _: b$ \

& F; Z- X% y& V9 _" o- f    vector<string> vec;
6 F; b: V+ n1 z2 \    string::size_type currPos = 0, prevPos = 0;
: Y+ M0 ^$ U" i    while ((currPos = str.find(' ', prevPos)) != string::npos) {
, `, k# C2 m7 O& Q1 s. o  ?        string b(str.substr(prevPos, currPos - prevPos));
. O- v* {  \6 _2 k) E# s; X$ O        vec.push_back(b); 9 @  G  e) g" a8 B! A4 T/ K
        prevPos = currPos + 1;
  I( S& D. I1 ~    } 4 Y: o6 N7 D# d& h' P& ]
    if (prevPos < str.size()) { . a& p3 j/ V/ o
        string b(str.substr(prevPos));
; r' z* u9 C: L& g# m        vec.push_back(b); + m( Y3 p: y1 p7 j0 ]
    }
# u- g2 }+ r" V8 @$ y6 O3 u    typedef vector<string>::size_type sz_type; 2 U, a* B5 x. \( c  s/ z0 E
    sz_type size = vec.size(); 3 Z, g7 k- V2 j9 g2 K% i) a1 S
    for (sz_type i = 0; i < size; ++i) { ) H7 A$ w3 ~7 S& _5 h& M1 ^
        int a = hexCharToInt(vec[i][0]);
; `/ {. {9 X  L        int b = hexCharToInt(vec[i][1]); 4 O/ I" ]0 U) ?, v* }% Y& d
        out[i] = a * 16 + b;
1 ^- w& `7 q# V    } $ D2 Z4 q" L* x! b" W" H) [* a9 H
    return size;
/ B' ~' ]" k1 F0 M}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
$ m6 u3 q2 j7 U( G1 X; D9 A#define TEA_H 5 `# Q: ]- \8 p& v5 ]' b; `' s$ }

2 A6 h& M; J( o* ]) B2 ~- k. F/* 8 z* \$ z" _" m. `# Q: H
*for htonl,htonl
! Q% Y  g6 Q# P6 B; }*do remember link "ws2_32.lib"
; h2 y( [4 n) v1 [*/ 6 K% a5 \6 m+ V5 \( ~# x2 F' _
#include <winsock2.h>
' z6 M, ]! \# G#include "util.h"
) [! Z2 s4 w+ V1 V# j& I3 d$ Z
9 @6 d" y% x" V1 ^" R3 I) y1 j) Lclass TEA {
9 _# A! n/ Q; r6 x* X2 `/ ]4 Vpublic: : Z* F1 |$ Z& q2 I
    TEA(const byte *key, int round = 32, bool isNetByte = false); 6 r+ f; [2 X2 X; u# X
    TEA(const TEA &rhs);
0 q+ v) m( `' m. s" U  a    TEA& operator=(const TEA &rhs);   u- s1 G0 t3 ]4 B7 M* l
    void encrypt(const byte *in, byte *out); , k4 A" d  I$ N; G! A  K1 _, M
    void decrypt(const byte *in, byte *out); . r" d1 l/ X- z) |3 d
private:
; L3 A# ]' D$ b! I( D* l+ Z: @    void encrypt(const ulong *in, ulong *out);
$ W# p2 D8 }# J# x4 z" Q3 k+ m: R    void decrypt(const ulong *in, ulong *out); - e4 N5 u$ }) V& y/ h
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } % c, o  I$ N0 l* i' |4 Q
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 6 a5 e" F( B& m! h& S
private: $ ]) f# \4 ?5 [  L8 k
    int _round; //iteration round to encrypt or decrypt
4 _8 Q# V! L0 w: d3 O    bool _isNetByte; //whether input bytes come from network
7 h) Q# K+ A4 d    byte _key[16]; //encrypt or decrypt key . p$ ~8 p" A* }
}; : u$ w% [* _0 e
  N) |! m: `9 E$ U
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
5 [4 v7 E) m9 ^. I2 h 2 #include <cstring> //for memcpy,memset
! b2 x  H5 D- T2 z0 { 3  ' [$ u4 S9 g) x4 f& ^4 [$ L
4 using namespace std;
& G! A7 M8 |4 W 5  # D3 T2 ^* W3 i$ m1 p: O1 p# Y
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
; t# ?$ Z1 P; S( i6 a6 a+ E: s 7 :_round(round)
* r9 x/ n. F: } 8 ,_isNetByte(isNetByte) { 9 z4 \7 ?3 d. J8 `! \) ]
9     if (key != 0) - Z& b( u6 K2 R5 H
10         memcpy(_key, key, 16);   r+ L2 P: Q0 l
11     else
0 B# l5 q2 Q1 g* ]5 w1 l. S1 y12         memset(_key, 0, 16);
5 p' H7 E) X; Z( ~; ?' Y13 }
2 q8 @) J# ]6 D" T( k14  2 {- ~. P- S. n2 o% n3 \. }$ _  p  V6 n
15 TEA::TEA(const TEA &rhs) 5 G; n$ P/ C0 [/ {* u( E& z
16 :_round(rhs._round) + Y0 Z. V0 V% \( q( D. E7 C6 L
17 ,_isNetByte(rhs._isNetByte) {
! K3 A3 k1 [. M) z7 \" d+ v0 d18     memcpy(_key, rhs._key, 16); 9 e" V0 E# t: i
19 } 8 u7 r( a  @; V3 n
20  - ?  l( P* r4 ^3 J
21 TEA& TEA::operator=(const TEA &rhs) {
1 m- j; y( n# w5 ]( O  X* {( _5 U; g22     if (&rhs != this) { 1 D6 W. p3 j  ~2 j
23         _round = rhs._round; - w6 a6 \9 o; Z2 k
24         _isNetByte = rhs._isNetByte;
: |& H7 N/ N  m2 K, E3 \25         memcpy(_key, rhs._key, 16);
. F' l7 _6 r+ H1 `26     }
7 w+ P* U7 M- B' t" _+ n6 P$ H2 j27     return *this; % `8 `4 o' {' t% Y$ u) B- b
28 } : E* E% Q: x1 j
29  % E, Z& S4 k- a1 y. ^9 M, s/ K
30 void TEA::encrypt(const byte *in, byte *out) { ! t" Y9 j5 y0 t- h3 S) X: v
31     encrypt((const ulong*)in, (ulong*)out);
9 [. G. W" s1 f" l( ]8 o: `, \32 } # U/ ]8 Q+ b& O8 x9 t* k
33  
# B' R; k8 C4 w; M% A34 void TEA::decrypt(const byte *in, byte *out) { ' N# E- S1 B/ y
35     decrypt((const ulong*)in, (ulong*)out); ( z1 O  Y/ i2 t. A+ u% r
36 } % U) c/ `# E* U( ]" \# u; Q3 V
37  / z9 {/ K  M. E; v% `7 o. H
38 void TEA::encrypt(const ulong *in, ulong *out) { * m/ C! B( @# }( n5 P
39  
* D6 j) ~6 C$ `40     ulong *k = (ulong*)_key;
8 Q, I5 W4 d  @4 _0 s5 T& l# ?41     register ulong y = ntoh(in[0]);
9 p4 k3 ~. l5 u1 [1 ~42     register ulong z = ntoh(in[1]);
, c; i- @% q1 n* H! |. W( j9 }' q7 U43     register ulong a = ntoh(k[0]);
, g. j/ @# ^3 J) f1 a  L44     register ulong b = ntoh(k[1]);
, H/ ]( [  }  l1 h* g. P45     register ulong c = ntoh(k[2]); . F/ W& P* t: ?
46     register ulong d = ntoh(k[3]);
* i) l, z' T7 p1 h: o; z: F- E! o" g47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
3 b( r  T; X, g: E48     register int round = _round;
' g( s% T* `* ]: M& p) R. Z. E! L49     register ulong sum = 0;
" U- y) m4 L0 I' r+ \/ n) K50  " ^- M* X7 C7 G. C
51     while (round--) {    /* basic cycle start */
& P4 L- W8 m5 K" G: K% D52         sum += delta;
/ ^3 _: m4 S2 k" m" Z53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); . \  `$ E- H" C0 {4 ^( g# y2 ]1 W
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); / i. w6 E; b0 g" B
55     }    /* end cycle */ ( S# V1 _  q) a: [& \( r
56     out[0] = ntoh(y); + W# _9 a/ D* M; ]1 ]9 Z
57     out[1] = ntoh(z); , k& K4 n0 }0 V4 R7 e/ ~. x" s6 v
58 }
0 e$ M- V! j/ U; M, }$ r: I59  
& S3 W! V# K% m* v9 u5 J5 N60 void TEA::decrypt(const ulong *in, ulong *out) {
4 t" r4 \; X; i* a  `0 K61  - H1 t) }9 d  f5 `2 A9 k( i
62     ulong *k = (ulong*)_key;
! U. m+ H" X9 H0 ~3 ~3 r63     register ulong y = ntoh(in[0]);
" ]- c7 I2 }# y1 k: Z64     register ulong z = ntoh(in[1]); 3 [1 b& A4 F- ~$ M+ h% _6 ?2 G
65     register ulong a = ntoh(k[0]);
- _. V: C0 w6 V3 I) A" I# J66     register ulong b = ntoh(k[1]); ; U0 O1 a5 K; S) X2 ?) \# m
67     register ulong c = ntoh(k[2]);
6 L) J& x: h* |# ]. Z: o68     register ulong d = ntoh(k[3]);
: m5 k9 Y( Q- ]4 Z! A' b: `! ?69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
$ e  v8 a  @. @. Z70     register int round = _round; 3 {+ l" N3 O; r7 Q  ~" V1 C
71     register ulong sum = 0;
" K( n1 C* e; M3 }8 o72  
5 l( X5 x% n" T73     if (round == 32)
7 y) k1 A/ n. B  Q" V. N) Q74         sum = 0xC6EF3720; /* delta << 5*/
( H, v$ R% v4 B' z3 D75     else if (round == 16) ; q1 Q, p; S$ t
76         sum = 0xE3779B90; /* delta << 4*/ ; ?2 G" L& j' N+ b" Q
77     else 2 p) @9 Z3 P  G( X6 o; n" x
78         sum = delta << static_cast<int>(logbase(2, round)); . A) x. e, F9 q1 o8 A' \. J! t
79  2 R& v! U3 q7 s
80     while (round--) {    /* basic cycle start */
& [+ D* ?8 b( o( W* Y6 v# ~' ^81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
* [2 c8 v# ?; L. B+ q82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); $ v4 O* G7 ~) w( b5 K% w7 B  v" s
83         sum -= delta; 2 V# Z# _4 Y3 `/ R% s+ k; R7 t
84     }    /* end cycle */ ! {$ C9 o! J. f7 x2 K" Z/ ]
85     out[0] = ntoh(y); 1 P8 b& V6 v( F* g$ w
86     out[1] = ntoh(z); . k; f2 U, \; T5 n1 v0 x& p" i
87 }
0 p* Q$ |, v: v
( l6 L5 E  X" I! Q4 s需要说明的是TEA的构造函数:
; d7 O$ [& @8 YTEA(const byte *key, int round = 32, bool isNetByte = false);   K8 b" N" W7 n+ |: \
1.key - 加密或解密用的128-bit(16byte)密钥。
; x$ s) f2 a' q. N" z2 g: d2.round - 加密或解密的轮数,常用的有64,32,16。
8 q3 Y$ ?$ ?9 p7 f- t3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
1 Z0 Q% {& A& t0 d  n0 R5 u3 b/ K# ^: J$ _/ L
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
) [/ d+ k* Y8 M' {& `  x) B; K 2 #include "util.h" . s, Z1 a( n3 [
3 #include <iostream>
  S# F0 x& _- D  C 4  
% B& _4 {  _+ D- W 5 using namespace std;
" h2 y* M8 Z4 H5 q5 k  n 6  
+ i) o0 Z9 a) Y3 m( x 7 int main() {
/ H# H% K1 V  O; D5 C 8  1 s2 @* J" E3 ^( F% s$ T
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 5 p# h6 j' @! U; _1 i" w
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); " n' C3 F5 f  U/ |; s1 ~3 g8 q6 P3 V
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; + h: Y( }% C/ x) U- P( j; k
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 4 K( {9 `$ o/ b, B2 |$ m4 l
13  
: l9 Y+ y! g& W' @9 M  A14     size_t size_in = hexStringToBytes(plainStr, plain);
9 A4 R+ O3 Y5 k5 u5 Z! M5 Z15     size_t size_key = hexStringToBytes(keyStr, key);
" ?/ y+ [4 H0 h16  
, @  A0 ^* r7 s' l+ j% |17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
& i5 m/ l2 g- c5 w$ w+ u18         return -1; & l4 A/ A# e% n1 M" J8 [. _
19  
* ^& W8 @( L; Z- h; W( {7 n- V20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
; y9 J6 Y9 {) a5 P& {  Z21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ( T! Y# f' P1 J- [9 n
22  
5 Z% ~9 V5 E4 P% }7 c; P: [23     TEA tea(key, 16, true);
$ G" u* T: i! p; N8 Y24     tea.encrypt(plain, crypt); 8 \' e& H6 G% q* P) C
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; : h9 k9 d. h+ X$ t" C
26  
) l9 S# `6 z! E- `; i: r/ m! G27     tea.decrypt(crypt, plain);   Z  q+ f1 {! {5 b- {
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 4 D$ ?* V9 m( ^( @  T
29     return 0;
% a3 ~! `3 C4 s' F. k$ n8 m! S% Y30 }/ o3 G* ~: I) V" _3 A! K2 Z: h6 n

6 U6 e; K# X: i+ n- Y! U本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
3 M# t8 f! T" H# x( @/ i运行结果: 6 D0 b( J8 h. K; A9 L' u; Z' S
Plain: AD DE E2 DB B3 E2 DB B3
' V; Z2 a0 O" K- g) ?Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 4 b, w+ K; r8 b' l$ O" [* S
Crypt: 3B 3B 4D 8C 24 3A FD F2
8 I0 i  Q+ p1 A# P3 r# mPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-13 14:52 , Processed in 0.031137 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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