找回密码
 注册
搜索
查看: 38828|回复: 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轮):- z  e4 Q3 X  p4 W/ _& i3 {% x) }- T
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
* c, U8 L3 Z9 k+ i- G3 n) ?2 rTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 & X9 T. ]6 Z$ y6 e8 \) \( B" M% W5 |6 T
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
' x3 X5 S9 a6 Q4 [3 }+ j在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
+ I: R7 O5 Q& `9 H6 S( \在 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. $ Y1 [, c: }0 o& K! l8 A) y6 b
  2. void encrypt(unsigned long *v, unsigned long *k) {
    1 t- e! B' @0 ~
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ , H. K! x) j) U; W
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */   m7 R* z' x) z" `/ q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 2 P, r1 b" ?6 H# K3 J5 J+ t: R
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ; ?3 C; w. |# v8 c2 t
  7.          sum += delta;
    7 l. T& p2 M* r+ [" U% b: L
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    4 v; W1 W5 N: z3 ?  ~4 @' @
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    # _' q) E) @% e. \: z" ?
  10.      } 3 z, V2 M$ R9 y: m
  11.      v[0]=y;
    ' k" P8 N3 j9 l( K+ v
  12.      v[1]=z;
    ! S# _7 F! o% _- D4 s7 x
  13. }
    2 \: Y/ g: }0 u: S: D1 T
  14.   ; F  N# |% A. C+ K
  15. void decrypt(unsigned long *v, unsigned long *k) { ; _1 J6 v+ S2 s3 O+ H. G  b8 ?* S
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ ' o1 z; `; z# {- I2 }1 M' G
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    9 x; A: J9 F/ ]6 v6 U' u
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    1 B% o& K- d- \% h
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    : G/ O& G0 ^* `  ]7 ?
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    4 \1 [, {) [2 r! I
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    $ A4 P+ t: v* Y, o: r/ S9 U2 ]
  22.          sum -= delta;                                /* end cycle */ 2 B! R1 K' Q- R: p! S: c! k8 o
  23.      } ; W# |, v# w  U1 M; H/ ~8 c
  24.      v[0]=y;
    , h3 J1 y3 F% `) F7 T
  25.      v[1]=z;
    6 s& ]% B, O) F
  26. }4 V, w/ p; o0 r
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 1 p0 y( A1 f9 Z8 `* _  l
#define UTIL_H 8 G# g7 X0 B$ s  {, `/ G6 Y

& Z7 o8 c$ E4 i$ A$ ]" d' n# w#include <string> & @; d9 f# N: K
#include <cmath> * f3 W6 v0 G7 ^* ?+ M
#include <cstdlib>
6 m- L  Q, P2 h
0 y* p; L+ k; f5 B- ^typedef unsigned char byte;
2 o% u: h. |: Dtypedef unsigned long ulong;
5 r# k( z4 P( W4 F* q
( u% }1 Q6 d- D+ c" ^% Ainline double logbase(double base, double x) { . R3 `& S2 [4 V8 L0 Z& V
    return log(x)/log(base); # Z( [, y2 w/ o0 {
}
4 `, W# j) X1 u) S: \: ?' m5 i7 j
2 l- }  Y$ L; G4 K/* - P1 w; G  q8 p% z* _
*convert int to hex char. ; ?" s; l* ]4 G5 R& l
*example:10 -> 'A',15 -> 'F' " w9 f6 J0 f" q% [  f' v3 t# m$ u
*/
' }' W( ]6 ]& Ychar intToHexChar(int x); , Y" \8 O3 Z, m& Q2 B

: }# t/ C, \! a" G  z3 l/* : k0 x1 f# ^5 I3 X3 y
*convert hex char to int. 3 Z/ q# ]; j. E
*example:'A' -> 10,'F' -> 15 - g3 e( e8 f; x" m* J
*/ 0 I  N9 g' |6 `( K0 H  u
int hexCharToInt(char hex);
7 N; w1 Y+ R7 G $ K/ u& P( o' P
using std::string;
7 [/ Z, A, g9 O/* $ A+ d+ x9 e3 E2 p3 x; X8 j
*convert a byte array to hex string.
6 ?: `* v. Z) S3 V' K; a*hex string format example:"AF B0 80 7D"
% g; g2 L8 p  M8 U2 u! ~*/
# i; {$ L/ N. `6 z2 Rstring bytesToHexString(const byte *in, size_t size);
, Y; j$ B2 s- x; ?: c 0 d' o: Q$ t2 l; W9 X+ Z/ I
/*
: C% e& O2 I; |0 a& C* L' B*convert a hex string to a byte array.
# a, p; Q6 S7 }7 h- ^4 t3 F*hex string format example:"AF B0 80 7D"
# {4 G( t5 I! b5 n6 J/ S2 J0 X/ Z*/ : I: G. A1 t4 d1 a( v. f; u
size_t hexStringToBytes(const string &str, byte *out);
' k3 h: m0 Y& ?/ ^  b/ N; w4 R
& @; C7 i+ f/ y0 X3 g  [% h#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
& x  Z) [# v& y( y) @0 Z' C! F#include <vector> 8 \" \( Q- }& C+ @* h0 q
3 N& m, m) k! q" v" d- |
using namespace std;
" E' W2 c# Q  K 4 u5 g! Y9 v! d
char intToHexChar(int x) {
8 z2 r$ D' s% E8 s0 p6 W1 ^% y    static const char HEX[16] = { 8 i6 d2 W0 ]& K0 Y& w5 a- j: f
        '0', '1', '2', '3', + A7 Y* [5 F* N
        '4', '5', '6', '7',
% v/ c: ^0 @2 G1 N+ q6 C8 C/ L8 j        '8', '9', 'A', 'B', 0 V2 Y5 H& z7 G9 u
        'C', 'D', 'E', 'F' 4 K8 J5 z+ X$ z% u$ s
    }; , c# I9 A+ \' e; |! \7 Y  i0 @! O
    return HEX[x]; ! K1 u4 s  F; q: J
}
. U1 \. _3 f$ e' }! j8 w  B $ F2 [3 L9 C7 r9 z/ g
int hexCharToInt(char hex) {
3 K' E$ ^6 f- L5 ^& H  i5 A: l    hex = toupper(hex); $ h# _  ^$ {# D/ d- _% j9 ^' |$ p3 ~
    if (isdigit(hex))
7 o6 O2 f7 \2 l7 A3 b! Q; z* A        return (hex - '0');
9 s" z: G" s& D: g2 q/ S2 M    if (isalpha(hex)) 5 N% R& ]/ t+ L
        return (hex - 'A' + 10);
; ^( V  I# P8 U: ~    return 0;
8 \6 \; w9 N5 q3 @& U/ s, A1 q} - ~! X* `. m# A6 s
% r% ^' W3 @7 ~; ?
string bytesToHexString(const byte *in, size_t size) {
, ]& {: b# M( f7 c, b# a# z" G    string str;
! B; M' L. o% {7 ~& u. b; E# t    for (size_t i = 0; i < size; ++i) { 0 R( e0 E, z6 `0 u% m
        int t = in[i]; $ L9 G# V# n( y* w1 b5 z' V" s) L
        int a = t / 16; 4 q& o, D. a1 ?6 D
        int b = t % 16;
3 `, x7 x; x1 c; N& N        str.append(1, intToHexChar(a));
  M2 }6 R( K3 B6 z% ^4 N        str.append(1, intToHexChar(b)); 5 u( }5 S' \& y$ Y8 X( [
        if (i != size - 1) 0 d* S- H, g. E+ b+ D1 V  ^
            str.append(1, ' '); # J3 Y9 P" Y+ X$ @7 t1 H
    } 9 y7 k1 W0 Y7 ~$ m' G
    return str; 4 ]3 P- l+ Q- }/ n$ X7 m
} / ~! ^& _) M6 b$ i* b5 k. E
( ~) l# Q; h9 d* G
size_t hexStringToBytes(const string &str, byte *out) {
, w  X. ~: U5 y0 t% L( m
  \5 |/ g4 i* g! f/ z  [* Y    vector<string> vec;   [. ]) C! ^$ Z# `0 g
    string::size_type currPos = 0, prevPos = 0; ; ?3 e4 Y$ X0 L' Q% i
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
# h4 l: s  o; F) c$ b        string b(str.substr(prevPos, currPos - prevPos));
, d, K2 }0 {# P) B" w# [( {        vec.push_back(b); : k6 v# g; F$ s
        prevPos = currPos + 1; . Q) o* j- z1 [, ], Y! U  m4 Y
    } ' }7 ]0 W9 a1 k
    if (prevPos < str.size()) { 9 o8 G5 ]3 L5 m% S7 l
        string b(str.substr(prevPos)); $ i" L- O& Z9 T; c- ?  G* d
        vec.push_back(b); * N9 m; k  A. D, c+ _
    } 5 H# f  c3 M0 I
    typedef vector<string>::size_type sz_type; ; S7 J! f9 ^! P3 F, R1 J- u
    sz_type size = vec.size();
, |* g! R) D0 r" X    for (sz_type i = 0; i < size; ++i) {
* Q/ f$ T! g& t7 X$ S6 ]$ S        int a = hexCharToInt(vec[i][0]); 7 [+ d+ C2 C7 c
        int b = hexCharToInt(vec[i][1]); % _) r9 H/ [. V
        out[i] = a * 16 + b; 7 _7 S# A6 z, t% H) x
    } 7 t! z8 l6 ~' q9 g* P/ Z
    return size;
& y- i; e! z0 G3 u1 U}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ) w+ C# ~" F& S. ~1 O# i6 U! U
#define TEA_H ' a7 d) A2 X0 k! ~

7 Y; I  H! z5 B0 V, H. p6 x& g/*
$ z) D; ~, @4 `! |*for htonl,htonl
3 n7 y7 o# T+ n% p9 C! k' S9 X+ c+ @*do remember link "ws2_32.lib"
* u4 l2 o0 c# x/ W! ]5 p/ V*/
. \9 r& L$ S% y) B- D$ E#include <winsock2.h>
9 j7 u, q4 s  |! M) ^- T8 g+ y#include "util.h"
2 d) c9 p3 h% W; X$ R9 J. V% p 5 `5 `7 d) p4 O- T3 o) ?3 c
class TEA {
3 |( y0 c! I; F5 o# z5 Ipublic:
- E; {: W" W, a) k3 @    TEA(const byte *key, int round = 32, bool isNetByte = false); * l" Z; }6 }1 t( |7 g
    TEA(const TEA &rhs);
5 D0 [5 z+ P2 r& J! u    TEA& operator=(const TEA &rhs);
5 P0 @: e% R( u( Y. P9 h! M    void encrypt(const byte *in, byte *out); " u, P' V& I' G- r2 s
    void decrypt(const byte *in, byte *out);
# |3 c$ P; s8 {% n+ ~3 kprivate: / h4 @, d1 e  o0 Q6 |# x* h4 u
    void encrypt(const ulong *in, ulong *out); 7 S# `* O' ]# i. e" }
    void decrypt(const ulong *in, ulong *out);
  J/ v5 I1 N. F# A& @    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } % P+ V8 d4 z8 W- ]- _
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } $ z8 }$ [, T& }$ Q
private: 2 M7 l# O* L9 b7 Q: y
    int _round; //iteration round to encrypt or decrypt
/ S( b& w& l, U4 s9 e    bool _isNetByte; //whether input bytes come from network
1 Y  y; u+ B7 ~. q: ]% `    byte _key[16]; //encrypt or decrypt key
/ k* @+ ?0 j. }  A, v( g};
( R. V8 y4 B: o
' i& R7 g9 ]6 `( q/ s#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
/ p$ r- m5 G- T. b 2 #include <cstring> //for memcpy,memset
# L/ U' @2 p1 }- ~ 3  / ~1 y! {! T3 D) D" v
4 using namespace std; 9 S2 K3 w7 x) u+ t( t
5  $ ~; U2 A0 G* ^3 w3 W6 d# r
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) + R% z9 Y: t4 M/ r2 ^- I
7 :_round(round) 3 Q# ?; Z5 W) L1 q; e; ~
8 ,_isNetByte(isNetByte) {
' N$ n3 Q7 O  `/ l. L4 _ 9     if (key != 0) . C5 I, r0 T9 z. ^0 w& A% J3 r2 D4 z
10         memcpy(_key, key, 16); . l6 o, x9 u) O  p. S
11     else
9 ]8 ^+ w8 E. Q  Q9 u12         memset(_key, 0, 16);
3 H5 z- ~, Z/ M8 B/ ]: ^13 } 9 }" ~6 n1 F! u
14  
3 f" n. D/ o. M15 TEA::TEA(const TEA &rhs)
& E( a( _1 q8 M: l1 ^9 |- i16 :_round(rhs._round)
7 U0 j$ R! c% `4 b17 ,_isNetByte(rhs._isNetByte) { # a/ }: e& I9 b  ?! u
18     memcpy(_key, rhs._key, 16); + _, }* ~2 }( @4 C: b& U
19 } & Q+ o6 n; p. C/ G, W& O/ c
20  
, }7 E* s2 Y6 g$ t, d' M0 z21 TEA& TEA::operator=(const TEA &rhs) { " V* r7 U4 b  h& z- p+ W. ?: a' o/ y" {
22     if (&rhs != this) { . [( j& h( p, @8 V
23         _round = rhs._round; ! X9 ~; H0 B! r$ [; |9 ?
24         _isNetByte = rhs._isNetByte;
) J( j2 ~: s" T5 i% T6 g25         memcpy(_key, rhs._key, 16); + ~* O2 C/ M: I4 ]& Z* F* t
26     }
( ]% y( w# K  O' \9 ]- w( o27     return *this; % M+ \" ~' V4 Q+ a( i6 W# @( b
28 } 9 B( G  K- F9 `( c& r6 D+ q
29  
. f5 U/ c, s2 R/ l: m$ v+ R, G30 void TEA::encrypt(const byte *in, byte *out) { 2 u! \0 L( d" x
31     encrypt((const ulong*)in, (ulong*)out); ' ], S9 I1 x2 B0 E0 l$ l- G& V: H
32 } , t- m( T" o  W5 [# V
33  
3 s" E+ ?, i5 t$ h" K+ J34 void TEA::decrypt(const byte *in, byte *out) {
7 G5 T, O7 M& ~3 i/ D- L35     decrypt((const ulong*)in, (ulong*)out);
$ X, T1 B) g7 X36 }
" {2 x* N* C+ Q% S; E37  * q& W5 i' r. o& O; Z2 ?- ^
38 void TEA::encrypt(const ulong *in, ulong *out) {
0 a' x# ^, Y% p0 R: i3 e: b5 e39  - H% \# a# b4 M( g% w1 N) h8 N2 s
40     ulong *k = (ulong*)_key; 8 m) Y) A' L1 M' d- ^
41     register ulong y = ntoh(in[0]);
5 }+ I  x1 U, r1 e/ T" k4 Q42     register ulong z = ntoh(in[1]);
, \. }& l: T/ K& W" r43     register ulong a = ntoh(k[0]);
* M* s. `7 b2 z% l44     register ulong b = ntoh(k[1]); 4 X2 J/ F. j' g4 J8 n1 ?
45     register ulong c = ntoh(k[2]);
' K2 _7 b" V; o9 K5 p2 J46     register ulong d = ntoh(k[3]); 7 m( C# X3 [" M( M) H) a
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 0 f" S( a( l& I4 E0 S: E! g# O
48     register int round = _round;
1 N' n4 y# V! U: I( Q* Q5 t49     register ulong sum = 0; * C- Q+ l: u! e! v: W! E* [7 I5 t  [  v6 z
50  
9 b! i1 W( X7 q: [; ]2 g51     while (round--) {    /* basic cycle start */ / \! z" L4 Q1 k/ ]9 }
52         sum += delta; ; X% F5 E* H4 A- ~) {8 H' D
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); , S; }+ o. U7 ~2 z+ Z, B, ^0 ^' ?9 Q
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
9 P7 c$ X6 t7 q55     }    /* end cycle */
+ ]' E# ^+ d: q  f56     out[0] = ntoh(y); / a7 R8 d$ B% X7 n0 l; s1 B
57     out[1] = ntoh(z);
/ E6 e/ _: u* W0 j+ `# X. t58 } + R1 t# E3 W  O! ^7 L+ [
59  / V: _: v* Q* \4 _- g
60 void TEA::decrypt(const ulong *in, ulong *out) {
' t& M5 c+ H0 C1 g61  . P1 ?& v* A. v
62     ulong *k = (ulong*)_key; ' E( _6 y, k! o4 A- f: t. |6 y' k" D+ W: t
63     register ulong y = ntoh(in[0]); $ ~; h6 S- @* Z5 p, h
64     register ulong z = ntoh(in[1]);
/ k7 k& `$ A; ^2 M5 b! y7 E+ `65     register ulong a = ntoh(k[0]);
. T1 g* g) e8 q66     register ulong b = ntoh(k[1]);
6 g: p# C+ M4 d4 d5 T9 t7 a67     register ulong c = ntoh(k[2]);
9 s4 t% ^  ]- o% k68     register ulong d = ntoh(k[3]);
! h4 c: b0 f4 l" \0 C69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . S3 J( p' e5 M, g. V+ C0 z
70     register int round = _round;
& \% u/ O# @6 d9 i1 j71     register ulong sum = 0; 1 L1 T5 I7 o- x( v& V
72  ) l/ X+ {' X. M' A( d5 S, {- `
73     if (round == 32)
" k1 i7 X' Y: X5 d: a* X74         sum = 0xC6EF3720; /* delta << 5*/ ! ]7 x, l3 \4 N( y' J
75     else if (round == 16) 3 Q) U5 b0 \, v, C. {( ]) ~3 _
76         sum = 0xE3779B90; /* delta << 4*/ 2 W8 N8 c) \  o8 D5 }/ Z4 m, W
77     else % a2 `4 U" v* K
78         sum = delta << static_cast<int>(logbase(2, round));
8 ~& O/ o# Z8 Q$ J0 Z4 Q8 G79  
' s6 W; M" n7 C* o! R80     while (round--) {    /* basic cycle start */
  S% {( b% y+ e) U$ X! |81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
# ?4 H5 }. k0 g$ g: N! l82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
0 @$ ?+ |: ?7 f' m2 U/ f9 v4 q83         sum -= delta;
: W7 i! W+ y6 n3 c84     }    /* end cycle */
9 \7 {+ J$ G7 |+ P& W85     out[0] = ntoh(y); / Y: c0 N5 v, Z, T" s. q" e7 v
86     out[1] = ntoh(z);
( Z5 h/ c& l9 Y( m87 }
, Y8 G+ P2 B  Y% O. M. f; M
. u" T1 C, I4 h5 y0 w" j需要说明的是TEA的构造函数: ! {( D# x7 ]& G; H2 q" J: S* r  ^
TEA(const byte *key, int round = 32, bool isNetByte = false);
, I) N2 G$ I' s; s: D5 n+ l1.key - 加密或解密用的128-bit(16byte)密钥。
2 u* X; h; Q" z9 H+ {+ H" y' d2.round - 加密或解密的轮数,常用的有64,32,16。 ( C8 e1 S( ?. ^
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
- T$ \$ z9 G& U$ K9 {# g% E" ]( j" C/ W2 D
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
4 ]; _4 J9 a, E+ U# g) N 2 #include "util.h" $ e, S4 A) Q# J, |& W
3 #include <iostream>   ~2 b2 G; j6 f" ]! |! m$ h# \
4  
* ^  T$ ?% X$ r* I 5 using namespace std;
: ^0 l3 [  L( }3 r' _# v; b 6  
# M8 z& P/ M2 U* Q# U; T 7 int main() {
" R! q( Y% r) S' }5 A1 S 8  9 m3 O1 z& p6 w$ S' O3 m
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
4 e2 K+ w4 e, g* y9 s10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
$ }( j3 ]$ ]# r* ]! m11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; % T: s0 h# k0 P
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
: D1 x/ t* _. H0 K' |13  ! g! C* b( Q# K9 R: L
14     size_t size_in = hexStringToBytes(plainStr, plain);
( D6 d- u: D2 S9 \1 k2 `15     size_t size_key = hexStringToBytes(keyStr, key);
. n0 h9 W" c% n1 V- S3 V* l16  
7 J+ D4 l- p5 T- U) l17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
! j  X. C8 v* a" ^2 E) l18         return -1;
) w, d& A, D% W5 v7 P  E19  # M  l, p0 Z! d) ~6 o8 d0 P
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 3 S9 Z/ X) m! Z: {' p
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; . f* J: v/ q( m; t5 W  `6 t4 M
22  7 d3 h  r, E' ^1 t2 ?! d- q
23     TEA tea(key, 16, true); + `& F' @+ s1 G' h8 Y
24     tea.encrypt(plain, crypt);
& l% F. W' f5 x1 y6 l1 {: J7 ^25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
( c* `! K. Z& i8 H% e& \" W, U9 J8 a26  
/ @% K2 X+ `: Z, J27     tea.decrypt(crypt, plain);
) N$ S& r* [1 B28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
0 d2 z% C% |$ {5 t7 C& O, E29     return 0;
  J+ t9 s3 h" n8 r& M7 f30 }  H$ l2 \" t3 s' C

3 C( E  Q- Y; @1 V5 e本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx% X! m9 U* A6 k" }6 p# a
运行结果:
, z; S% }/ i3 ?- oPlain: AD DE E2 DB B3 E2 DB B3
) ]! S: t- {2 i3 y% FKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
( z& H* t* l* I/ q1 Y2 RCrypt: 3B 3B 4D 8C 24 3A FD F2
6 t7 d4 k* i  H+ [2 M9 lPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 22:40 , Processed in 0.018724 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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