找回密码
 注册
搜索
查看: 37886|回复: 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轮):" A4 s9 @) j0 }. m1 K
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 8 w0 }+ a- m. Z) R( z$ ?7 p+ L
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 0 k- M) ^" u7 S: ?. l& r
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 6 V8 J# o8 u4 Z( |
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
5 m2 t! S$ D" g' h+ F# w在 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. . b0 Y, v" w* o( W
  2. void encrypt(unsigned long *v, unsigned long *k) { / F& f0 ~* K6 p9 X" a, s
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ " P' V2 g# f, g, ~3 K* B
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ! `+ v* i3 B) J. x( V7 V) k
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ " X0 p% v7 x; T8 V3 `0 n  u% e! Q( o
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ! F, d) K% S1 ]
  7.          sum += delta;
    ' @. u. F  R" T; H6 R. w; G2 S
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ( H  G. x4 c% n) v! y5 A( F1 T% X% y
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ( u( Q6 v6 W: W7 J& I
  10.      } 5 ?, M* g8 T- `; t4 F4 `' E' p; @3 E+ N
  11.      v[0]=y;
    $ D# b! I; e: E  H
  12.      v[1]=z;
    * Z# U7 |& W0 B( e
  13. }
    * q% P' @5 [8 n. Z
  14.   
    , B, {7 Q: E0 @- Z
  15. void decrypt(unsigned long *v, unsigned long *k) { ) s$ A4 h; K) p
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ + x( E- b/ U# P1 o( M
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    2 U8 V& m! a2 e7 L
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    1 M) X7 p9 U; R( g) k% F- H5 ~
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ . w. T/ t# i4 F6 C4 {$ q
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); - k5 ~, O$ i/ h9 U" G
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); " Y. U6 I0 v& U' ~- m6 j
  22.          sum -= delta;                                /* end cycle */
    - f' g8 N& r- _  \# E% Y2 F# K& v
  23.      }
    ! I; g  {6 U& i
  24.      v[0]=y;
    ( d; r3 T4 X: c, t' G: ]
  25.      v[1]=z; : ]( T2 S8 _+ {( S# o
  26. }! B6 E1 Y7 D) k
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
. Q6 ?; Q) p6 n+ i7 D* s#define UTIL_H ( d! O5 G4 K& W& n0 ~7 v% b
4 \3 h2 ^1 V! f+ m2 z7 |
#include <string>
( J5 n% M" W% \+ ?+ N. ]6 M" h/ \( t#include <cmath>
& u  |6 r, ^$ f0 A" W$ X& f9 o#include <cstdlib> 1 U) x9 z0 i2 [) E, d2 V! y- ^) K

% M9 Z& N& w0 U' j1 ~typedef unsigned char byte;
- Z: ?1 L0 c; a# J5 S$ ntypedef unsigned long ulong; 8 }5 B% ?2 o2 }. _. g" ~

" `' d, A" v1 g, t: _inline double logbase(double base, double x) {
# q: G) d* `0 b5 z& R    return log(x)/log(base);
# ?- m( B9 n: q/ @( m0 F} ) O! \) \6 E( X0 R1 a& n1 }! M  Q0 h

0 l: `7 X+ n$ q& {, V  s/ [, j" k/* ! E0 ^: ?# T% K7 p% S5 F
*convert int to hex char. : C0 ]+ ^" C( c- X$ N
*example:10 -> 'A',15 -> 'F' 6 D& p& s- d: d3 q+ t5 s' U/ Q
*/
8 v. v& ]+ s7 d6 ychar intToHexChar(int x);
' o6 e9 Z7 Q& ^, N5 T6 N* [! z8 H
4 f6 t) S3 ^, U# ]7 D9 B/*
1 O) T& q( V. {# p) `3 ?*convert hex char to int. ( l) ~* }+ V( [/ N
*example:'A' -> 10,'F' -> 15
+ a, V/ g1 e$ N9 H) F/ y) s1 B*/
+ q5 B) Y9 w( z% l4 [int hexCharToInt(char hex);
" }4 {! L9 L* L; ]$ C- `# Z) n* Q7 H
! @; o) g) q% I  h5 N  c% I; wusing std::string; 4 k; \% h; l! p
/* ( {5 R/ y, W: o9 _2 N# u6 i
*convert a byte array to hex string.
9 R7 T1 F  I1 |5 h  `' }7 ~*hex string format example:"AF B0 80 7D" % I& S8 g+ a( Q3 g
*/
2 G- f) ]" Y4 U/ t) hstring bytesToHexString(const byte *in, size_t size); ! R) e% ?$ V# v& f0 t+ W

% [, d' a; M2 {1 Z5 O1 O/* , u: g$ |4 `0 R! p" A  z4 G
*convert a hex string to a byte array.
' E* X/ [  S$ m; _: c*hex string format example:"AF B0 80 7D"
* D1 v, }) a, N5 l' E8 F*/
' {& ^; i3 |, j, J; w7 }" Osize_t hexStringToBytes(const string &str, byte *out);
3 {" t% u4 L. j. m) ?1 I
9 v2 C' t) e' o& _5 y5 n6 I- j#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 2 ?  y6 O4 G4 K/ c, N! S
#include <vector>
7 k& o- n3 W) i
9 t# V/ t$ s2 o  p$ ~using namespace std;
" L) g* B' k5 ^$ v5 D
$ b% Y# x! `  lchar intToHexChar(int x) {
" H& O% {2 `; ^5 I. G8 Q    static const char HEX[16] = { ; p, g+ \( O* ^9 |$ G* K- X
        '0', '1', '2', '3', ( o! N2 ]) i' |3 o! R# S
        '4', '5', '6', '7', ' j$ s8 A# j: _" }) A9 o
        '8', '9', 'A', 'B', 9 s( v0 |. N0 h& E
        'C', 'D', 'E', 'F'
, d! M2 r3 D1 I* `. ]    }; 9 G: [' W# |6 }. c
    return HEX[x]; * s+ t) n" Y! L$ ~
}
- a) y' U* A$ v ) P$ T& `+ U/ ~* s+ j
int hexCharToInt(char hex) { ( }- ]& {6 Q; d7 z
    hex = toupper(hex);
; F/ W3 Z1 ~& l7 u- Y    if (isdigit(hex)) ! s/ m* |: i& a" i' y
        return (hex - '0'); : @* P  f! k( [& @( }) ?
    if (isalpha(hex))
5 P+ }7 |( |* H+ i  c" p# h4 j. o" O        return (hex - 'A' + 10); * s# O! b# j% F0 V2 L
    return 0;
) H# ^; S6 n9 Y  c! V, M}
4 a: m" o. ~+ o6 _
! N& g6 r3 c) x9 N( ^- G% ?" zstring bytesToHexString(const byte *in, size_t size) {
: w2 u1 n. V5 K1 `    string str; 0 _$ |% Q+ c4 [3 @( T
    for (size_t i = 0; i < size; ++i) { 6 N$ M0 U7 b' I9 j
        int t = in[i];
) v# o" q, S7 `! J6 e        int a = t / 16;
. |# \. V: Z' W' |* [4 l        int b = t % 16;
* Y% N' a2 E6 ]$ s        str.append(1, intToHexChar(a));
7 E- Y; z  h$ B9 ?' m' n3 w( ]        str.append(1, intToHexChar(b));
: \) a% [0 b1 l! m% n4 a% ~        if (i != size - 1)
( M: L; ?9 [8 X" v: [6 x5 o* t            str.append(1, ' '); & x( f* I4 |. ~; F, `! Y
    }
( y9 {1 W1 [2 N0 e* Y    return str;
, V4 l  P! x4 G9 [8 A- I}
& J$ z4 q8 J' e# {' q. B. l2 w
1 }3 P8 \8 D, Z1 l$ M% Gsize_t hexStringToBytes(const string &str, byte *out) {
& R: a5 y) C9 |9 n' L% I - Y' h0 T6 i- z, ~8 s
    vector<string> vec;
7 @6 w% Q5 i! G& c2 E2 W    string::size_type currPos = 0, prevPos = 0;
- X" R7 X' m! r* |/ `3 f    while ((currPos = str.find(' ', prevPos)) != string::npos) {
5 B. }# Q& {+ D5 k' C0 D* k3 |$ c        string b(str.substr(prevPos, currPos - prevPos)); & u+ O2 u. j2 ?/ z7 B
        vec.push_back(b);
5 j( n* i1 m2 y- @) |        prevPos = currPos + 1;
; d! U" k9 F) }6 k, F/ ]    } / G( i4 I2 `& T3 B. o: g' D/ Q* L+ O
    if (prevPos < str.size()) {
/ w7 G1 i3 D2 M! I; d        string b(str.substr(prevPos));
& O6 F: n* U# @  H" I        vec.push_back(b);
* Y5 q( n0 N# {    }
- Z- [1 A  |2 f- I9 l) t    typedef vector<string>::size_type sz_type;
) ?) Y& g2 E( t; _4 D    sz_type size = vec.size(); - c! N! u! |2 b5 g/ U& @8 o1 s
    for (sz_type i = 0; i < size; ++i) {
7 g9 p# n, t. m# X( C# O        int a = hexCharToInt(vec[i][0]);
1 n) U( {) p3 ^        int b = hexCharToInt(vec[i][1]);
% R% ]0 I. P0 G1 l- l5 i        out[i] = a * 16 + b; + m1 Q& r- C' {1 b8 u% E1 a
    } ' q! V( z' `( X# V- u
    return size; 2 P; K4 ]: L8 D" p6 b- X3 F
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 1 j' i- `8 N- s7 K" C/ }6 m; \/ R
#define TEA_H & R4 [- U3 d3 |8 {
$ v: l; Y4 ?# G( C. I
/*
( n) M8 h4 k/ f9 \4 |  K0 W*for htonl,htonl
$ E# R; m7 l- i. h+ g+ k' t*do remember link "ws2_32.lib"
2 P+ w6 P/ h+ P*/
% e' G/ V5 J. }, Y3 y#include <winsock2.h>
: s, y/ M8 p6 H  X% _" {#include "util.h" 2 S5 o; h% q0 t2 A/ _

8 y4 k. k7 Z) Q/ g4 [! g" z. Rclass TEA { & i2 ^' P9 D! ^1 `5 w
public:
  c: ^" j1 o; b" U( q3 V    TEA(const byte *key, int round = 32, bool isNetByte = false);
$ ]' Z' L. s) X5 _8 q8 w# A* Y    TEA(const TEA &rhs); - K0 t7 h4 @9 s- H
    TEA& operator=(const TEA &rhs); $ ^% E# }' h" ~
    void encrypt(const byte *in, byte *out); / h; i) h( A, `+ T" W4 M
    void decrypt(const byte *in, byte *out); 0 {9 p2 M8 m( e* w% R; d' h% ~1 h; A
private: - }8 O5 c7 B1 E6 Z
    void encrypt(const ulong *in, ulong *out); % @7 a  p$ N) }& G6 |
    void decrypt(const ulong *in, ulong *out);
+ }0 a" P4 A2 y" l  x' a) v0 u    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } , T+ Q, r7 i& u& E' J4 a5 @- u
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
; i( w5 z2 `; r" B+ X+ tprivate:
/ j& o) V- @# p    int _round; //iteration round to encrypt or decrypt 8 o  a( E  a; _/ q$ X) l
    bool _isNetByte; //whether input bytes come from network
& c9 V& l9 _+ N' u    byte _key[16]; //encrypt or decrypt key " V, ~* k3 m* n, t
}; , ^# Q# h" w- E9 ^/ L

7 _7 F+ h" k' a, b9 y1 W4 q#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" : ?3 U7 G" P/ p( m( T0 X: }4 j
2 #include <cstring> //for memcpy,memset 1 L$ S" k$ O7 p9 j. I* \; W' Q9 j
3  + _9 W4 H# |/ b! U; V: S6 \
4 using namespace std;
4 I+ x& P& \  y6 p0 o8 ^" Q: P 5  ( Z7 ]* R/ Q! F# q
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
9 d# W1 _/ \) k- c1 u2 J 7 :_round(round) : {/ E# @1 ?3 j
8 ,_isNetByte(isNetByte) { , C, A$ g% Q$ c* y8 T& l
9     if (key != 0)
- P3 e" ?: Z! D  J* y) r- J/ j10         memcpy(_key, key, 16); ( p4 ^) v- Z8 v  l/ C, q' @* T
11     else 0 m4 t* j0 |1 }5 M, S, u9 p' e
12         memset(_key, 0, 16); 5 i. X- v' w' _: ^7 T# t; R4 R1 e% \
13 }
" Z; f4 d+ F, {+ d/ D( G14  
, h6 h. Q6 X6 L  ?' k+ R15 TEA::TEA(const TEA &rhs) - n2 A! O& ^* I( A8 x' m/ u/ `8 L- W8 }
16 :_round(rhs._round) + a2 `: i2 Q' C: U% B/ s
17 ,_isNetByte(rhs._isNetByte) { , t  H0 R) D# ?9 W
18     memcpy(_key, rhs._key, 16);
% @* M2 O+ P$ P. n+ g4 ?1 o19 }
0 C( P7 ^! P8 y/ {20  & D. K% d2 n5 ]! z: x, \3 v
21 TEA& TEA::operator=(const TEA &rhs) {
* P  i% M, U0 V; C6 h22     if (&rhs != this) { # q. u2 a& H3 Z" O" B4 L% Y
23         _round = rhs._round; / c7 H, ]! L3 }/ f  g  m4 q2 W
24         _isNetByte = rhs._isNetByte; ) |' U8 S4 w& U
25         memcpy(_key, rhs._key, 16);
4 a7 `' u; _6 A3 _4 @26     }
, o! `& f( K8 U9 j9 H/ d27     return *this; 3 h/ z2 E- j! g5 Z0 ^# E* c! X
28 }
" D+ W+ u* ~# N4 C4 t29  
( x8 ?* z/ l) D0 `30 void TEA::encrypt(const byte *in, byte *out) { 7 c6 G; P: _4 d9 \$ l" h8 \
31     encrypt((const ulong*)in, (ulong*)out); 5 a; M) u1 Y4 r) s5 \* u
32 } 5 x8 C$ G; r, X$ K
33  
+ ~! f9 Y. D/ v0 ~( K* K1 t4 u34 void TEA::decrypt(const byte *in, byte *out) {
6 [! C- g) u# i1 J35     decrypt((const ulong*)in, (ulong*)out);
3 W) N& }$ G- C- D; v36 } $ F$ F3 ]8 E; t
37  
# }# p. F# F5 Z* z6 _3 l38 void TEA::encrypt(const ulong *in, ulong *out) {
4 Z5 ]% r! N; X# H8 M$ B2 h) D. V39  4 F1 [1 ^1 N+ ]  Z
40     ulong *k = (ulong*)_key; $ Y+ c3 Q; s/ I. z
41     register ulong y = ntoh(in[0]);
& Y3 n+ i/ j* f. l& O42     register ulong z = ntoh(in[1]);
. ]1 f' J; g5 X8 ~* I, f43     register ulong a = ntoh(k[0]);
: Y1 |: p' y3 P# C& h/ s44     register ulong b = ntoh(k[1]);
3 G$ M; u. z+ X$ G' S45     register ulong c = ntoh(k[2]); 5 J8 {* e  A  T  v$ N
46     register ulong d = ntoh(k[3]); ( I& I. H6 n9 b* T/ R5 W# }* j
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ $ b" X; P1 B: w  o) b
48     register int round = _round; 9 O% ~# J! Q+ O9 L- t
49     register ulong sum = 0; + p9 K! C, u* }& i: j; y$ g7 f
50  * u; N, K1 B- A9 L2 p
51     while (round--) {    /* basic cycle start */ ; l: ?8 B! r$ m; L- S1 z
52         sum += delta;
4 F4 p! r; S3 [$ h) b6 U) S* ~53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 3 M/ L! K; L2 b0 j7 m. g
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 3 E6 F+ b/ D# b+ I" I1 |
55     }    /* end cycle */ 1 I; F* c1 b. |  s, K* t
56     out[0] = ntoh(y); 1 E+ r- }! C2 W
57     out[1] = ntoh(z);
& j. N8 B3 o( v$ |, ~2 G2 |7 F# P58 }
, o- c, ~  u  W8 I; L3 C59  
# D! Q5 A9 P% u# f: E; k5 W: h60 void TEA::decrypt(const ulong *in, ulong *out) {
0 k  e7 u; p/ V61  
$ F) ^: a9 F/ T$ S- R( P5 d62     ulong *k = (ulong*)_key;
  H) @! b' s" E5 ?; ?  e- r2 X  X& ]63     register ulong y = ntoh(in[0]); % q& d' V5 m8 x) Y/ P( P
64     register ulong z = ntoh(in[1]);
5 a- \5 B/ {' [3 [% @65     register ulong a = ntoh(k[0]);
2 P/ @4 p& T/ ]$ n# A9 v66     register ulong b = ntoh(k[1]);
& f3 [) d9 \/ a  M  E3 _1 A67     register ulong c = ntoh(k[2]);   l( f( u' V6 i" [  K; f
68     register ulong d = ntoh(k[3]); ) m' n2 e2 m+ o4 x
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 3 P* c: E* a# [
70     register int round = _round; / ^, s3 ~5 H% e% m8 p- n) |; i
71     register ulong sum = 0; 0 |6 Y1 K$ Y8 `' v- M# x* e2 V
72  
6 ^& }- X) k9 g! d" C% V73     if (round == 32)
& L: O# J  t' M- K) }74         sum = 0xC6EF3720; /* delta << 5*/
0 V/ [) M9 D/ o0 k75     else if (round == 16)
/ X# q; C. \; [+ Y$ A/ a, R$ H76         sum = 0xE3779B90; /* delta << 4*/
7 Z" K4 D4 p$ P7 K1 \& `# b77     else / l: C0 l: o4 |3 M" ]# S0 U
78         sum = delta << static_cast<int>(logbase(2, round));
; u6 o2 I7 w7 h! C3 R* h2 e79  
+ g: {% h; p* l' [6 Y80     while (round--) {    /* basic cycle start */
- \+ y0 m4 t$ I2 n81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ ?6 n8 I  `& A+ I* z6 M82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); : ~% r2 h+ y# A+ o/ q* C* T
83         sum -= delta;
0 K7 \# b9 n% J' q84     }    /* end cycle */
6 ]9 ^( s7 C: o6 h( _8 x85     out[0] = ntoh(y);
7 m% i/ A' ]/ n4 X$ Z7 m4 e/ ?86     out[1] = ntoh(z);
2 Q* _4 U4 q' [# N; H  i% Q) @; g87 }
7 H6 J7 h8 |# B, x6 O8 I$ t& k+ W/ X- P1 s1 H. d* G) s6 {( j
需要说明的是TEA的构造函数: 6 n  A  b- G; k! q7 Z, `
TEA(const byte *key, int round = 32, bool isNetByte = false);
# E; [9 v" g2 I" \$ a% [, x& c1.key - 加密或解密用的128-bit(16byte)密钥。 ( H8 W0 q! X9 U7 L
2.round - 加密或解密的轮数,常用的有64,32,16。
- ^& P' K1 R* j  u" m  @3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! & R6 V/ M4 v. T7 I2 f

4 }$ V. U  q* E" D最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
* j* E( ]+ U& M 2 #include "util.h"
8 c' u1 E6 g" J 3 #include <iostream> . a% g* U' {( g2 C4 I
4  
* N' s, X& y+ N" m& e 5 using namespace std;
0 N3 s: d0 l& s. r6 ^ 6  ( e5 e# \6 j5 g0 [0 r
7 int main() {
  G3 k1 w( |! k" w$ w- } 8  
7 y) b# J% R4 } 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");   k7 `! L: W- J" `) M
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
* V4 |3 Q5 r4 Y2 j! g: ]2 L6 ?/ Y11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 5 A* e/ X% B, R- Y) ^4 F
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
% a( {" J7 E' Z2 q! Q0 W13  2 [& B: `% X3 G. s
14     size_t size_in = hexStringToBytes(plainStr, plain); " `/ ]  h8 Q- |& i7 @& m/ c( D) v, ^( |
15     size_t size_key = hexStringToBytes(keyStr, key); & H0 J7 R& [4 T
16  
; @4 _( N! s- i17     if (size_in != SIZE_IN || size_key != SIZE_KEY) : C* G. P1 M& s1 h# l
18         return -1; " A! o. J8 _5 v3 u. @4 Y
19  
9 z9 x5 Z: o6 F  H9 }20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
4 |2 U) R/ j& Q2 J" H" c21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; # ]7 t& N0 n% [8 }3 K+ C
22  8 I0 p8 O) m5 L6 T$ \" d& P
23     TEA tea(key, 16, true); & J) B# T9 V' s! H8 A/ A3 W5 n
24     tea.encrypt(plain, crypt); 1 z" }. e  i. ?# r9 W1 T8 c
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
+ v9 A+ h# e8 |2 u! d26  
9 G' H- ]$ X. g7 Q27     tea.decrypt(crypt, plain);
$ a6 S+ ^% E/ }* w; h2 K28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 2 U" x( t) k, N
29     return 0;
. t5 ~( e; [2 Z30 }
3 G/ p7 }' b$ D* H9 J+ @) C; L
! f# x5 v0 ]! q) M" `+ x5 o. \本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
. [2 t+ t* R+ S+ v运行结果:
* L" }2 a" Z- c% B# ~! n8 L4 _Plain: AD DE E2 DB B3 E2 DB B3
6 O& }5 x" |5 S$ jKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 $ h0 V1 o7 x3 i" A5 c0 l! ]9 O
Crypt: 3B 3B 4D 8C 24 3A FD F2 5 ]8 y/ Z1 q' i  a: }
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-6 03:34 , Processed in 0.023633 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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