找回密码
 注册
搜索
查看: 37767|回复: 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轮):* ^! K# R- C8 r# S7 [' |: `% _
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 7 G3 T" Y3 F, }8 p  I
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
7 d! l% j, `) [% T1 X3 ^之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 9 d2 a$ l/ s3 i7 l* Q6 y3 B
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 $ g* ?' O& j" o: b2 E* Y
在 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. $ _# o7 O% `" X8 \
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ) C8 S& @! c: r) }
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 8 E% L, b$ Z3 ?  T  U
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    + ]+ o, x4 x* y1 s( [
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    0 [2 Y5 z' s/ p3 z  b+ J8 J
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 5 R0 n( B3 }; w6 u$ t
  7.          sum += delta;
    * _9 O$ E0 \" K8 O8 Q: j
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ ~% _+ R6 G0 |' T
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ' v: G6 {4 u1 s9 K+ d3 I% s
  10.      }
    8 z, b+ n. r. ?4 X- [
  11.      v[0]=y;
    # E- b" t; p, K9 k$ }( U
  12.      v[1]=z;   K3 B- `5 V& ~. a/ c
  13. }
    : {1 }6 g& r! |
  14.   
    9 v+ z9 d3 r& @
  15. void decrypt(unsigned long *v, unsigned long *k) { & T# _2 D1 a4 [! [+ G3 c
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ + S5 L- q! ?8 Z6 s" S
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 8 s$ l7 \+ x$ X% A
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 9 f1 a7 d9 k. e7 R( t
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 3 J6 T* B( m6 n7 j1 ^" c+ g/ H
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ( c4 O. ~8 z2 N- V2 y
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); : U5 t) z6 E. D+ ~
  22.          sum -= delta;                                /* end cycle */   F% G0 ~( F2 V/ K  u4 M
  23.      }   J% D' d5 U9 g) P2 C2 k2 Z* M  X
  24.      v[0]=y;
    ' j2 x6 ^: t( `; U8 d! O+ m
  25.      v[1]=z; ( I+ r; O( p6 R5 I  i! J
  26. }
    . R: }5 q3 a0 _% \% @$ e
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
# T5 r3 A" B1 g  O1 m  q#define UTIL_H
3 }6 t$ U% f; s7 G8 @+ c! U6 c* f3 }: m9 n7 {" h
#include <string> - x6 |6 h( N" R5 o7 {2 j# r
#include <cmath> * ^& O# X( V" w0 C, M1 q
#include <cstdlib>
+ G* X2 G0 u. j   N4 R" Y, V4 b9 ~- l; i0 ~
typedef unsigned char byte;
- ~! h" j# I6 P( {$ I+ ]! N2 Q4 n+ ktypedef unsigned long ulong; - z: p8 y2 y8 Q4 U2 b' v

7 W5 [/ T. G! \+ ?2 D' m/ }inline double logbase(double base, double x) {
/ K/ ?7 y2 u, @! `( b# S. J5 H    return log(x)/log(base);
! ~5 V9 W# T" U$ `; H} # U+ Z7 u, R" Z

- W  ~1 G7 e, s/* 0 c! B: S+ e3 Z; {' D
*convert int to hex char. " G+ B- C2 c+ I7 i0 W
*example:10 -> 'A',15 -> 'F'
6 u. I+ [! V# F9 k" c, i' M+ f# c! A*/
2 O+ Q! g- n* }. D  Mchar intToHexChar(int x);
% N; \9 ?9 x6 }; w. U 0 H' z8 D0 K- u" O0 T0 k5 {2 e' F
/*
7 ?# ~, d6 H' \*convert hex char to int.
& O( P; `9 `# ]6 g' ]! ~*example:'A' -> 10,'F' -> 15
! s6 J7 u+ K! b: w: l9 G*/
  y% d) `$ y% P$ Tint hexCharToInt(char hex); 1 J) L' L! {5 J9 C& X1 v7 b

  i0 x/ `! ]% f) L+ N; husing std::string;
: {; [. n3 _4 U& y' S5 @' Q/* ( }) t7 c; n$ Y! |
*convert a byte array to hex string.
9 G1 Z  w. b- C. C4 R  ]*hex string format example:"AF B0 80 7D"
% d. R7 c  `% g" z*/
2 b4 `& l: }9 g3 w: Lstring bytesToHexString(const byte *in, size_t size);
7 H7 h$ A, ?/ x6 a4 q0 g
# R2 i( Z( t& r) M/*
5 E# s5 ]5 g  h4 Y9 m. o& }*convert a hex string to a byte array.
5 Y9 a6 V! `( r8 |! Q*hex string format example:"AF B0 80 7D"
/ n2 O! v; g0 V7 h2 m& y0 J*/
9 M8 |2 v8 K9 e% H, g/ L' p8 Q; vsize_t hexStringToBytes(const string &str, byte *out); & F. C/ w+ c% v3 x5 B4 S

2 ?* t& V" B) Z8 G& l( u" [; @#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 7 ]' A- g- T9 M: O% R! b! @" W1 G
#include <vector>
5 h& a3 U! h$ J# M
9 x: U/ S" V% kusing namespace std;
4 H; \5 x5 x+ F# k; G& l- e. G( E' F& [ & G( V" M3 e* R7 v! {& v
char intToHexChar(int x) { 1 w- h  O+ p, d9 M2 s! C
    static const char HEX[16] = {
$ y& B, K" `2 @8 M8 }        '0', '1', '2', '3', ) _; a6 B/ {/ ~, r" {& \8 b7 o6 b- q
        '4', '5', '6', '7',
, A3 C9 G  o3 U        '8', '9', 'A', 'B', ; i$ y6 c( W7 C; N- p' O: S  H* u! W
        'C', 'D', 'E', 'F' , V6 u1 _# T1 Y
    };
# T# i% |, l7 l9 n4 N# x, M. t    return HEX[x]; 7 B- ~4 ?4 }, R/ p4 [! g2 j9 |) z
}
4 X* l3 \2 l0 }, G, `5 h
$ f. f, f: D: D$ Nint hexCharToInt(char hex) {
! ?9 R% l2 c1 e( t: S* e8 ^    hex = toupper(hex); + N7 F- D8 u! f; }+ `
    if (isdigit(hex)) . |$ Y. U/ t/ ^4 U5 ~/ B0 ~: n  H, d
        return (hex - '0');   l4 J( r$ ^* ~; P4 X
    if (isalpha(hex)) - `0 n8 U. d. ?0 b! c7 O
        return (hex - 'A' + 10); 3 I  y/ Z7 E' ]. R
    return 0; ' I" U: g/ ]% o; v1 {
}
; \& H9 [4 P# S; Y, k. s 4 |/ }" D+ ]4 `: `% L* }+ k
string bytesToHexString(const byte *in, size_t size) {
3 m. {5 A0 Y, \) A0 n# m( F  \  J1 n    string str;
2 a$ }* U! D. }+ U$ b9 ?6 V  I    for (size_t i = 0; i < size; ++i) { , _, R7 z% D. y1 F
        int t = in[i];
3 A3 o- v$ [, y. }2 m: o: B        int a = t / 16;
3 H2 m3 G+ c7 k5 t- x4 D# w        int b = t % 16;
/ X& z0 |! {1 J* C        str.append(1, intToHexChar(a));
. U: {0 i6 K8 L        str.append(1, intToHexChar(b));   Z9 U) U$ d* W# c0 `( J' `
        if (i != size - 1)
% o6 M* k( Z& d- d4 ]0 I            str.append(1, ' ');   l; c; H# V7 m1 m* a* i# \
    } - R! q' C: N+ C: L. W
    return str;   ^6 X/ d7 V: j1 E- M
}
) D; O" `  ?% Q 4 k$ A. ?# @/ P' M& U& Y# ?
size_t hexStringToBytes(const string &str, byte *out) { 7 o) T  ]9 y. Z! D( @9 i
& Q- U# X; R6 q& _3 F+ b
    vector<string> vec;
) k  Y4 m: B. A, l$ Q    string::size_type currPos = 0, prevPos = 0; $ E/ m6 k& U& v8 z3 C9 n
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
) L% e  s" c6 c6 K        string b(str.substr(prevPos, currPos - prevPos));   t- D  B3 w2 \+ c% D" o% ^
        vec.push_back(b);
0 F. \$ S0 ~2 M0 M" D4 W        prevPos = currPos + 1; 7 S  }3 x5 {+ L
    } 7 g0 }1 O4 ^' Y4 U' m) i+ F
    if (prevPos < str.size()) { # n  z( S8 O- y6 X) [1 J0 _
        string b(str.substr(prevPos)); " j# e0 B  [1 p- t8 M
        vec.push_back(b);
0 O) O3 R) }2 L$ b    } 9 [) O5 q5 _2 w2 v
    typedef vector<string>::size_type sz_type; 2 W  |# y8 n+ @! b8 f
    sz_type size = vec.size(); 1 r. }8 D% v. x& y- \2 u
    for (sz_type i = 0; i < size; ++i) { 5 R2 Z& g8 o" T$ N7 p' x: g
        int a = hexCharToInt(vec[i][0]);
8 g1 s! M, I/ q. F* _; x        int b = hexCharToInt(vec[i][1]); " N# J/ r- V, P' m& V7 [
        out[i] = a * 16 + b;   E+ _% w6 i4 f
    }
4 ^0 q; _- _" K; b) b" w, b    return size;
# [- @+ t6 D0 e& [% ?: @9 N}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 6 [0 g; k0 Y5 A+ \, H
#define TEA_H
! |! M, a% {2 O1 i- [/ L7 K
/ v( H* h0 h" D/*   |) e" W' {1 G; t
*for htonl,htonl , {, U2 z; s4 l) w! u8 Q+ F
*do remember link "ws2_32.lib"
% U9 P3 u( d: i6 A*/ ! a4 S! z5 X# C6 q- B/ _" ~
#include <winsock2.h>
6 {4 s4 k0 N1 L$ ~- f0 Y#include "util.h"
9 Z4 V7 l+ _- \/ b3 h7 G/ f 7 U( ]: g6 G$ p$ v5 w4 l% I
class TEA {
, }/ a% @* r' Q# o  Qpublic:
- m# f1 n/ z# r  C, t. n    TEA(const byte *key, int round = 32, bool isNetByte = false);
" k; ^# J- O( w0 A, J- Q/ }    TEA(const TEA &rhs); 5 K% y: ?1 w" O$ v: q- g
    TEA& operator=(const TEA &rhs); : e& x) g- I" n
    void encrypt(const byte *in, byte *out);
4 M" ]3 w- j5 V- J! x    void decrypt(const byte *in, byte *out); . y, ^* z3 }. Y, c7 ~( b. J
private: # y6 I, s. S  g! T( m
    void encrypt(const ulong *in, ulong *out); ! V- f/ S; C' K0 v3 t
    void decrypt(const ulong *in, ulong *out); , F4 X* V  M% ]& x5 S7 I
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 4 A: }1 g9 W- D8 H5 x" i1 p* b
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
# ]$ X# f5 d: ]( ~private:
6 J; K  u1 B0 X2 {& m    int _round; //iteration round to encrypt or decrypt
6 Z4 P9 [3 E/ L: y    bool _isNetByte; //whether input bytes come from network
2 X$ f# y4 x( L- |4 _* A1 Q; B    byte _key[16]; //encrypt or decrypt key : \. G9 q3 H% |* H. h0 W
}; + g  @: [( Q2 N% F3 v4 ^. D0 s7 d! q

; z6 W) s) W8 T$ k0 `7 Y#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" * T5 ]9 |7 G: i$ D5 b5 V2 y
2 #include <cstring> //for memcpy,memset
" `' S) o" }6 O& K% a  Y$ K 3  & e, m# y# R1 D. R9 w7 u3 u8 H
4 using namespace std;   L8 U' E9 v. n
5  $ _5 |( a5 ?( R/ K1 F
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
$ @9 t( v0 M' P% ?0 W; X6 Q1 H 7 :_round(round)
+ j% Z1 w: G, `" j- O$ c- x 8 ,_isNetByte(isNetByte) { $ m; L6 _3 M. K8 X# @  R# a% M5 M
9     if (key != 0) 4 J: I" Z) l: V' O* a3 V
10         memcpy(_key, key, 16); ' F# w5 L# }0 l+ }4 z0 B
11     else ! {2 {; t/ g: j5 t! |
12         memset(_key, 0, 16);
& Q- F- A6 `7 }7 E13 }
; _: F: c* H9 m0 X- |5 q9 j; F% ?14  
7 ^! c# _( V, U  V5 ?2 G15 TEA::TEA(const TEA &rhs) / b3 N# p/ ]. T  m
16 :_round(rhs._round)   ~  X7 P* i7 E. [
17 ,_isNetByte(rhs._isNetByte) {
0 J+ G4 I9 Y4 @3 l18     memcpy(_key, rhs._key, 16); % v2 z( N; E2 g* H" U. o
19 }
  p3 ]6 L. I2 ?% `- f: {' {( }20  
2 {, t, V3 x3 X  p2 l21 TEA& TEA::operator=(const TEA &rhs) {
& ~( N) p  W; a# ^& e/ D8 L) ~# |3 g22     if (&rhs != this) {
( v! ]# h; P0 J( a23         _round = rhs._round; 6 Q" ?% h" G' W3 G& T
24         _isNetByte = rhs._isNetByte;
+ S8 N6 `9 t4 i; a% D/ a' p& F25         memcpy(_key, rhs._key, 16); ) o- I9 c4 c9 g" P
26     } . ]! M* b* Q+ }- r4 H
27     return *this;
9 |/ g# [. {' a: O  v28 }
) R2 G. B- |. u3 E1 z  Q29  # G& K* f1 r$ N7 q8 \0 ]
30 void TEA::encrypt(const byte *in, byte *out) {
+ p5 ?4 k! K: {6 c$ M8 J31     encrypt((const ulong*)in, (ulong*)out); 2 A- x5 j  `( m. x) r5 x$ l" `9 e9 M: F
32 }
3 F8 {( ?2 k1 Z4 l, N33  
1 q  p  P9 F( m4 h% R34 void TEA::decrypt(const byte *in, byte *out) {
# B# Y/ p4 h/ n2 k9 L! T35     decrypt((const ulong*)in, (ulong*)out); 5 D! v1 t; Q: D4 Y8 m( O* I
36 } + f1 O6 P3 z- v$ W3 o6 `
37  # z, X/ @( ?( w" y. p& g
38 void TEA::encrypt(const ulong *in, ulong *out) {
  @4 d0 \7 x/ w: y  a7 |1 G- C39  : P  q0 ^) r- G5 w% {) r
40     ulong *k = (ulong*)_key;
$ g- n* L) f/ \4 C. r5 X  g41     register ulong y = ntoh(in[0]);
* @: o; c, W8 s& L9 \# S42     register ulong z = ntoh(in[1]); & u  k  N! t6 u2 Z
43     register ulong a = ntoh(k[0]);
1 [/ r1 v; f8 _  x; }44     register ulong b = ntoh(k[1]);
$ O2 Y; H  g8 t4 }45     register ulong c = ntoh(k[2]); 7 e% h( g" O9 ?
46     register ulong d = ntoh(k[3]);
8 c; ~$ s( ?- Z. X9 T5 b0 B47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
0 O# p  G) Y6 F+ Y0 H& a3 M3 k48     register int round = _round;
: L" G3 o+ ]! E6 z7 C% P49     register ulong sum = 0;
0 A" i1 w& Z, K7 D) K& H50  + ]6 n; a! T* I3 o! I$ K3 u
51     while (round--) {    /* basic cycle start */
( c7 k- r) d3 @$ D52         sum += delta; : f" j$ G7 B5 S  Y3 V
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); % O0 }9 B$ ^6 N* V9 ?
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 6 d- v. X. {; i* Z
55     }    /* end cycle */
' q' t4 k' N7 D, m7 [56     out[0] = ntoh(y); 0 R% Y2 P6 f) @$ J
57     out[1] = ntoh(z);
- M9 a! J4 C: N5 L58 }
4 t0 P/ n* E: x; E' p59  9 r$ s7 ~' C7 j, o
60 void TEA::decrypt(const ulong *in, ulong *out) {
4 D9 ]6 I. \2 p$ c. Q$ ~61  
" m* R9 s' i# f+ ~4 P1 J7 p62     ulong *k = (ulong*)_key;
$ ]* D; ]- N; e! F, O5 o4 ~2 v+ W63     register ulong y = ntoh(in[0]); ) g* d7 W6 I" }
64     register ulong z = ntoh(in[1]);
6 c5 E4 G" o. ^! \+ u65     register ulong a = ntoh(k[0]);
  ~1 h. V( g5 D6 G66     register ulong b = ntoh(k[1]); 8 M; A. E" G5 H0 K. X: _( D/ }
67     register ulong c = ntoh(k[2]);
4 U3 v6 a, n' ^$ ^* i+ p68     register ulong d = ntoh(k[3]);
2 x  y+ W8 a: w5 \4 C3 W# q69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
. \9 ^. Z' K$ H+ {& D# @& h- Q70     register int round = _round; 9 Y" ?1 H: J) I
71     register ulong sum = 0;
; C& z; c1 d( k72  + A! q% a  ]- D" C: w
73     if (round == 32)   ], l% E0 l0 T# k
74         sum = 0xC6EF3720; /* delta << 5*/ + m/ o' c& S  u" M
75     else if (round == 16) " e  Q( j, Q$ T, ?7 }! }
76         sum = 0xE3779B90; /* delta << 4*/ 3 D8 Z! ~5 c. H$ C; ?5 h) S
77     else ; |" s5 Z8 e8 H1 }3 A
78         sum = delta << static_cast<int>(logbase(2, round)); : ]+ Z3 ^( L4 b3 I
79  
$ s4 f: E  _  _80     while (round--) {    /* basic cycle start */ , Q, r+ A& r# [$ q
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 6 J3 t' t7 ?8 J) I6 E4 {
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); " ?4 ^8 f; N# a; ]# O) ]! {
83         sum -= delta;
; O- y' p, F9 ^; W. g84     }    /* end cycle */
! _# x" u5 Q2 X2 R3 i2 F4 P3 d! _85     out[0] = ntoh(y); ( O6 L3 ]8 N! z! t' p3 g. g; m
86     out[1] = ntoh(z); . e- o+ C5 V1 N. [; I
87 }
8 h) j- R7 q4 H9 w2 e: _
  g0 w/ z* h8 ~% @# W( W, M  ], k需要说明的是TEA的构造函数:
; \3 v3 g& U( s$ W  ?3 qTEA(const byte *key, int round = 32, bool isNetByte = false);
' M- h. }/ D! N  r) T. x, [0 u9 b1.key - 加密或解密用的128-bit(16byte)密钥。
5 a5 U$ ?$ G+ c) o* ~/ ]2.round - 加密或解密的轮数,常用的有64,32,16。 8 R" {" z" E5 P
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! $ R9 J  L3 \, E4 A; ^7 b0 O
; ]0 `. b0 \6 k4 v: Z5 F4 Y( B6 h; P
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
" L8 G3 J/ e  _, Q 2 #include "util.h"
4 O4 O/ V- F2 j6 z* Q* M* a+ X 3 #include <iostream> . `5 j- T5 T& s* _* E1 s1 f( c* r
4  
" L* j* ]" C, U; c; f" p# O3 w  B 5 using namespace std;
; i  n- U& c1 w+ p1 X; U. g4 G7 s5 t 6  ! g5 T( Q: \/ a7 @9 b. J
7 int main() {
! C$ r9 G& U, {% O, d- Y 8  : ^3 S" H3 X: V) r. g3 g* S  z2 L  y: ^
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
  P! ^/ x# f0 E; t  _; F6 S7 B) p6 d9 G10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
$ r6 T2 B. [" ?* o2 d11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
1 I1 T7 x0 R) q12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; + e9 P- s5 g, a5 p
13  
* b6 M8 O6 p. `- z( \14     size_t size_in = hexStringToBytes(plainStr, plain);
  y1 X& J1 ~+ g" L# Z* t3 b/ [/ W4 c- B15     size_t size_key = hexStringToBytes(keyStr, key);
- `. ~+ \/ a* C/ Q3 Q16  
! j% M  B1 k/ j+ f17     if (size_in != SIZE_IN || size_key != SIZE_KEY) . d, Y! ^9 M4 f/ B. k
18         return -1;
5 m0 v6 \& A9 y4 g( W) O19  7 _5 j# Z' o; r( }$ Q; n
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
2 x5 s) q8 f$ B9 ~2 d, z% w21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
  ?) A. o' P  R* t1 W& B" g22  
1 k2 X0 G( i4 P) y1 _23     TEA tea(key, 16, true); ) B' _: g& r# F
24     tea.encrypt(plain, crypt);
8 B9 L0 h# |1 B' B25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 7 F9 W$ e; N! H
26  % v: X7 l7 j1 H* n' r& V4 _$ i
27     tea.decrypt(crypt, plain);
& s) B4 m! \0 S" j& e28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
  i2 I- k& j9 A5 {7 N, l29     return 0;
) q! N7 y& D6 h30 }
, h- W: c1 p$ H2 |" i
: m0 k3 v- n% t# I本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx' s- J0 r" |  g" A
运行结果:
2 d/ l/ j4 ^$ e) o( yPlain: AD DE E2 DB B3 E2 DB B3
" o  A' @! O( [  g9 b# Y" z3 tKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 2 |/ t3 E) j/ n/ v/ m% g  Z
Crypt: 3B 3B 4D 8C 24 3A FD F2 / k. v9 e0 |+ R) E* S0 y
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-22 09:27 , Processed in 0.019520 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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