找回密码
 注册
搜索
查看: 37313|回复: 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轮):
3 Z# F1 k$ ?- P7 P微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
; f4 o5 l0 |" t: mTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
% n6 a% O6 [: I; _. y之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 # v) S$ b9 c- T: s
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 1 [; ]. z2 d, z7 ^2 N4 n5 S2 N
在 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. 5 Y( ~' g: z$ Z" c; J
  2. void encrypt(unsigned long *v, unsigned long *k) {
    5 V- e1 N. B& i$ k5 c
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    , B$ j1 o8 V4 f5 A* w
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ; s( w4 U% h5 k3 _5 n( @  z+ d
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ * O1 D  c. @" F- R$ h3 c) L: F
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    : t4 \" ^, Y% i/ V! |1 i- c; A
  7.          sum += delta;
      N7 Y2 e! c. ?# _; M) G+ v/ ~
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    * h6 U7 T& Y. {( C" f
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ; p0 N8 Y7 b& u3 A1 J9 K4 C# p) E
  10.      }
    / t/ P1 I; i) H, l! j: E- }
  11.      v[0]=y; - b( f2 i! U$ j" N$ F2 n0 N8 y$ Y% \
  12.      v[1]=z; ; d, m  `( U2 X2 g( I6 J
  13. }
    ( Z. x8 f7 L2 E+ {( t
  14.   * E- I  k3 X; z% T# l
  15. void decrypt(unsigned long *v, unsigned long *k) { * ^' P; F& n/ _- p3 D/ s8 x" C
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ / Z# P% U: B3 F  K1 y; B( x
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 3 z0 k' e( V# n% ^* M8 B
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    8 {) Q# C; B! s5 w; w
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    + s0 p. F/ [+ d: o' \
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    # X( u) Q6 M# X2 J$ a
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 5 N6 D, i' B, Z! v$ G* \$ ]7 N
  22.          sum -= delta;                                /* end cycle */ ) J4 [) ~' R' M3 J
  23.      } " h( e% Y+ N9 U- U8 t0 S9 N$ E
  24.      v[0]=y;
    - Z/ R5 m! r7 n- l+ }2 m3 k
  25.      v[1]=z;
    9 ~  r6 c( c2 |5 u
  26. }
    ( o0 y. S) T; B- [. _
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
7 `. w! p2 n1 {8 Y#define UTIL_H
* D0 ?. O$ Q$ n6 u0 Q' f! {- q0 |" `# B
#include <string> 2 v) G( R/ x" _: R% \3 g+ u; l' H
#include <cmath> & S0 S/ B5 h% C& J6 Q( |) ~
#include <cstdlib>
! R9 c8 D) Q+ {0 y6 R, [+ T 4 G$ Z+ {( i! m* v, w8 p
typedef unsigned char byte;
  S% R( E  b2 k, r8 a  l  Ztypedef unsigned long ulong;
& n7 [& |, f# \2 v- @8 q' r
) k9 R5 H2 }( \0 L! uinline double logbase(double base, double x) {
. r4 _. q! U8 f0 h+ r! \    return log(x)/log(base);
: ^! F; @4 M$ E: {9 u}
% m' b" P; a* ]8 k0 M6 L
0 P# r8 n. d& b( i. T# R/* 4 Y: J+ d1 d( F  |) q; n( q, N
*convert int to hex char. 8 u* G- U% E: Q6 q
*example:10 -> 'A',15 -> 'F'
6 _/ _0 v$ D  |+ w& a7 t: t+ n# D0 y*/ ' f& X  J  ^) ?0 f8 d+ [+ m+ T7 E0 P
char intToHexChar(int x);
. z* p( J; m2 s5 j3 G6 ` # m( S. o1 y$ J( r4 O2 x4 k5 O
/*
6 T7 s) t1 z7 `3 B  k. P, k*convert hex char to int.
4 J; r3 _* d: {8 [*example:'A' -> 10,'F' -> 15
4 ~. J- N# K9 W# |0 I/ x5 H*/ * A+ H; x: t$ i% K" f) O! Z/ D
int hexCharToInt(char hex); 7 q1 Z8 i& d7 [' F, z

( X+ i" [/ C& D, L# _using std::string;
% ^$ H+ Z8 W' o. x4 W" j, k& L* ?/* 2 L  L' {) o- [* w* S, H
*convert a byte array to hex string. 8 k7 M9 k& r) V2 ]* m1 n# h" r: h
*hex string format example:"AF B0 80 7D"
; y; Z* p5 y7 q9 f$ M$ r*/
6 ]; ]. A6 G" C4 i9 D4 `% ustring bytesToHexString(const byte *in, size_t size);
7 a+ e! A$ o7 Z$ m. b ; ~8 a( t9 V' K( |5 J% v' X
/* 6 ~! |9 M1 A- v4 f
*convert a hex string to a byte array.
- ~: o9 P' f# V, C+ c*hex string format example:"AF B0 80 7D"
: ^! t# v: \# v) i$ ]5 f# s2 d0 p- Q*/ 9 ]+ m. w. A& D) @! e+ e2 ^9 z
size_t hexStringToBytes(const string &str, byte *out); ' O$ J$ `9 g- n
& K% z# m& S% V3 z0 j
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
3 @3 r+ x" `( H( F' A#include <vector> 6 x: b" Z5 K) j

: m) l9 v$ k2 ~7 c- |8 I$ @using namespace std;
' d9 X/ N: S' C$ z, z ( a) Q9 z" W  O  b2 C2 ~
char intToHexChar(int x) {
/ v  U! N& Q/ M+ y2 |% T, \! Y    static const char HEX[16] = { # m! I3 h. m+ \
        '0', '1', '2', '3',
6 J9 H0 a% q0 I" |! O, x        '4', '5', '6', '7', 4 [0 ?, h& s2 N# U" K
        '8', '9', 'A', 'B', 6 c; H6 U8 ~2 g+ G2 t
        'C', 'D', 'E', 'F'
9 `3 s# b9 k% i/ z6 Y* |6 S8 T    };
5 U, V! P$ N' q6 j! a  c, u    return HEX[x];
, ?) l, u# C; q) M7 {8 i9 h) ~" b4 O}
5 f8 O, e! O9 g4 J4 R ' `1 A: A( {  {  S% c0 D
int hexCharToInt(char hex) {
( n1 S* _+ j# @4 U- P) G    hex = toupper(hex); : u4 y! ~! [9 H! w& N3 b3 k) n4 v
    if (isdigit(hex))
- L. B9 w% L$ E" k4 ?: P        return (hex - '0');   Q: i5 B: _" c# C8 Y6 [
    if (isalpha(hex)) * T) H, H6 a. {% x6 n! B8 Y
        return (hex - 'A' + 10);
3 M$ W! z# s$ ~' b    return 0;
* m- G9 e! e/ }0 l1 {1 I( o' a}
- q! X; S  p( s3 x0 |) F " W/ ]1 j$ O5 y$ u$ S/ X. N
string bytesToHexString(const byte *in, size_t size) { # x6 ?+ b' i# B0 y
    string str; , n2 H: ~% L7 Q& O0 a5 d  r/ K6 s
    for (size_t i = 0; i < size; ++i) { 1 E2 Q- l1 i  i: s
        int t = in[i];
7 ]& c- L3 o; o  S, L        int a = t / 16; 9 [# `9 n# M) ?9 c
        int b = t % 16; 6 J/ n  ^: I$ K
        str.append(1, intToHexChar(a)); 0 T) J( E9 U/ i! J/ ^" q
        str.append(1, intToHexChar(b));
: _5 n- |8 }& [/ s4 d- q        if (i != size - 1)
9 F& s9 j7 L" S            str.append(1, ' ');
! X/ t+ i9 f& f; \$ n: D1 J- C+ F# Q    } 9 V) q6 O# D, P% `
    return str; 9 ]/ Z! X: {$ g, Q; k0 _9 a" i
} 9 u6 `( N( W+ u# W

* V3 Z/ J( a8 r; o9 E# m5 zsize_t hexStringToBytes(const string &str, byte *out) {
- M! p4 C5 v2 e7 G
1 U) _3 g. w4 H; ^% r4 Y6 ^    vector<string> vec;   b7 H+ F' j' p' n3 I2 E7 }
    string::size_type currPos = 0, prevPos = 0;
, }* o+ f( O- W    while ((currPos = str.find(' ', prevPos)) != string::npos) { / s# B: E2 ^  Z9 e' X  H
        string b(str.substr(prevPos, currPos - prevPos));
: K" L. t2 H' F5 @3 ~" }; e. t        vec.push_back(b); 5 c) [$ T3 i- Y; m8 A$ c
        prevPos = currPos + 1;
* u! p+ e( W0 K' {    }
1 o$ {: s( U+ l, \1 Z    if (prevPos < str.size()) {
1 j$ J) z- M! g* N/ [        string b(str.substr(prevPos)); + s! X7 m" ^' F1 n/ \
        vec.push_back(b);   W: _* u; N! l5 j" L7 E& ~
    } ; M2 Q+ I) V2 Q3 G4 g
    typedef vector<string>::size_type sz_type;
2 J' o1 c- W; n9 D    sz_type size = vec.size(); * @  W* F0 ?7 ~' c
    for (sz_type i = 0; i < size; ++i) { 2 X0 `& Z' p7 e) r- [( D( G
        int a = hexCharToInt(vec[i][0]); 5 N$ w8 s' D6 S$ U3 V: I) i) O- E
        int b = hexCharToInt(vec[i][1]); $ R3 a" ^( V9 ?9 j: a5 j
        out[i] = a * 16 + b;
6 T! f- j: K0 o! P6 y8 v    }
2 u2 g( m% @& |    return size; 5 a8 h% T3 ]" w8 X- g/ P6 d4 E/ p% }
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
; |/ v$ h# I; K0 A  `7 ^, [#define TEA_H 1 F: [9 `6 @$ W; h  `6 a5 {
' L2 Y0 [" c) A0 h7 \* p& W0 o1 G
/*
) i& x8 y. ?3 p4 d*for htonl,htonl 2 d( y4 G9 Q* B
*do remember link "ws2_32.lib"
0 n, H( M! d% F$ q" T+ f. ?" }5 Y*/
% g. o- P8 \3 h* ~#include <winsock2.h>
7 x1 v9 T$ L, Q0 w+ I#include "util.h"
6 O& v, c* r9 |  ?" I$ u8 o % T! J/ ]# y% B; Z2 \( C" n
class TEA { / L7 I5 \4 k7 J& j  h
public: ; s- ?3 U/ u& }
    TEA(const byte *key, int round = 32, bool isNetByte = false);
# \/ P8 S2 L0 m/ R    TEA(const TEA &rhs);
- N8 f' g( |- g5 {    TEA& operator=(const TEA &rhs); 1 @, E) Z/ I1 k* x9 [5 T
    void encrypt(const byte *in, byte *out); 2 a7 R( X1 E7 y  k! O9 a1 z
    void decrypt(const byte *in, byte *out); & r) Y6 y+ X5 P: {
private: - G+ h* t, V" a: d5 l
    void encrypt(const ulong *in, ulong *out);   Y1 e* E$ W1 b! Y1 Y: ], j  S
    void decrypt(const ulong *in, ulong *out); - p7 d) x1 k+ D4 ]' f
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 7 l& Q2 Q: n8 z  u! a0 V+ g( T
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } % ]- o5 M" U0 N/ _# E
private:   X" w6 V/ h( t/ Z8 J
    int _round; //iteration round to encrypt or decrypt   v- E' u3 \. K4 o/ N: Z0 b
    bool _isNetByte; //whether input bytes come from network
: d1 _0 t+ H1 h3 o% O6 @3 b/ M    byte _key[16]; //encrypt or decrypt key ( Q  }! a/ r) {' I, O
}; 1 L. J  O$ A; i* V

) H; c* M' F" J#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" / ?5 d8 q- P6 [2 P) U; h
2 #include <cstring> //for memcpy,memset
+ Q6 B# p; z( j( u" p' [6 J  _! ]( ? 3  
4 k4 s2 v* N( k* ]9 \ 4 using namespace std; & j1 M: A3 H3 m! ]
5  
& M* Y! D' y2 l7 g, F9 Z' O* d! x9 z 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 7 N  e( O: [; C  o! p# F8 m
7 :_round(round) ; I0 H9 E# f! W8 J
8 ,_isNetByte(isNetByte) {
- Z9 f3 Y, [2 O 9     if (key != 0) 2 k. v: m- Q+ |+ [" @3 v2 P
10         memcpy(_key, key, 16); 0 {: t3 U: M6 U' o3 r
11     else / k% Y; a6 H5 F: z; {: ^$ V
12         memset(_key, 0, 16);
. l9 O* o1 V9 K13 }
: O2 C" v! V3 d& @/ ]1 t+ }14  
& D2 a8 p* u1 L' d3 b15 TEA::TEA(const TEA &rhs)
% x% K/ C; V- s; D7 u& U16 :_round(rhs._round) 7 |6 J& }1 M8 C; z0 U  i
17 ,_isNetByte(rhs._isNetByte) { 1 V% R7 l# c& M5 M9 ]
18     memcpy(_key, rhs._key, 16);
6 l8 W; R$ l8 H# d0 k3 A19 }
' w7 K& y8 _3 `+ j  x* N$ N20  
; a+ f4 h: Y/ \7 z$ U21 TEA& TEA::operator=(const TEA &rhs) {
+ C; P6 m0 B: x/ Q) a# Q# r22     if (&rhs != this) {
% [! g/ t( ]5 o# X& l23         _round = rhs._round;
2 d: R; s" [( i: S1 E: }2 n24         _isNetByte = rhs._isNetByte; 4 M% p' [9 y7 N) d1 m
25         memcpy(_key, rhs._key, 16);
# I, d) n7 u% C8 V9 W26     } , H' J# Q7 B9 d) i: V; i6 c% P! y
27     return *this;
2 i1 j7 t) Y1 ]/ `0 N4 D28 }
) C! h# B+ W  {- W+ {29  ' Y( U: O) p+ k" O! l- {" h: k, v
30 void TEA::encrypt(const byte *in, byte *out) {
5 c: Z3 R: r& g5 V9 O31     encrypt((const ulong*)in, (ulong*)out);
/ a/ p4 g' |" o! x; i% E0 \3 ?32 } 0 W: n& G# |! f% i/ l6 b9 u
33  
; S) r  o/ {  J; K9 k, {. f0 Z34 void TEA::decrypt(const byte *in, byte *out) { 2 C& @8 w$ O- h" b2 A" L
35     decrypt((const ulong*)in, (ulong*)out); : Z$ t7 z6 I9 a. b. h
36 } 7 n( }/ L5 J! [( \5 }& H
37    D* l5 Y7 Q3 x) b3 ?2 D' T( Z
38 void TEA::encrypt(const ulong *in, ulong *out) {
$ Q, d$ _* I/ Z! W39  
# a& c+ I5 W) T% R* h& U40     ulong *k = (ulong*)_key;
( X1 f# V) `1 L! n3 {# p41     register ulong y = ntoh(in[0]); - T8 H, k+ w) N. u4 N
42     register ulong z = ntoh(in[1]); ) L, ]) @" [( V1 T
43     register ulong a = ntoh(k[0]); 4 S" K0 Z8 X1 a/ C+ O8 P
44     register ulong b = ntoh(k[1]);
$ u7 f+ Z3 \% Z45     register ulong c = ntoh(k[2]); # ^( _1 W7 _" O2 `0 W9 A3 g( T
46     register ulong d = ntoh(k[3]); 7 G, f7 d1 k( @" V% f5 \
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
  ^( Q( F3 \) |. @9 {48     register int round = _round; ' }2 O# i0 J+ J1 w. |5 \- F; @! r
49     register ulong sum = 0; . ]* t, i: U3 C, N1 }
50  
+ A% R& N- h4 p6 n, v* U51     while (round--) {    /* basic cycle start */ ' ^! j+ X* m8 `  r+ R& F
52         sum += delta; * y9 j( A% n7 o5 {$ E2 y
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
! G7 J* ?! U" C8 e7 W& O: t54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
4 b; P( L4 f7 H" C55     }    /* end cycle */
/ f6 R! ?2 j9 {0 n7 S7 u% C( G56     out[0] = ntoh(y);
  r( z2 m5 z# v57     out[1] = ntoh(z);
0 s. }3 q& u; B- i2 i& s4 ~4 M58 }
5 x# m. z) H( \8 n7 O% `6 g/ ]! f59  - ]( D1 y3 t& s; v5 U
60 void TEA::decrypt(const ulong *in, ulong *out) {
9 a; S- O* R) x* K0 t! z61  ' D$ A/ P5 i# N; W
62     ulong *k = (ulong*)_key;
. x; N) I$ ?% i8 r7 [! V& ^8 U63     register ulong y = ntoh(in[0]); / y& `8 g, C/ E3 ~
64     register ulong z = ntoh(in[1]); 9 W9 r8 U( P2 W
65     register ulong a = ntoh(k[0]); 1 c! F0 A8 L3 m) D8 {2 C; V
66     register ulong b = ntoh(k[1]); # }: ^0 w* R6 v5 ^6 d  C
67     register ulong c = ntoh(k[2]);
+ a9 h* D" _- ^7 V- C6 u68     register ulong d = ntoh(k[3]);
) @& o7 c# O( E1 V69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 1 K- v( c  Z, @# J& s
70     register int round = _round;
: ?: Q' Y! e9 R2 n& A/ x71     register ulong sum = 0;
- G3 W0 l' [# T1 Z+ @* S3 E72  
; g  `3 f7 R' v, F73     if (round == 32)
7 }* c( ^9 ^  Z74         sum = 0xC6EF3720; /* delta << 5*/
/ I1 l; A! J1 @! @75     else if (round == 16) 6 c+ q) R, K  l% n7 |0 E
76         sum = 0xE3779B90; /* delta << 4*/ # e( p/ V' |2 R/ R& T2 A9 O/ U
77     else # |# p$ m1 `. _& I) v9 S0 \
78         sum = delta << static_cast<int>(logbase(2, round)); ; ^6 b, N! }3 U) d$ W; d* Z
79  : y  i9 Z- ?& n
80     while (round--) {    /* basic cycle start */
# c3 }, L1 C7 |81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ; W' C6 b1 A3 X
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
  A9 Z  q/ X3 t6 @3 z. W1 u83         sum -= delta; / K3 k7 p" y. ]: r- _* G+ b# {
84     }    /* end cycle */
' [& O) l; }) B' M8 D9 ^85     out[0] = ntoh(y);
! O/ x2 P7 ^( i4 u. p86     out[1] = ntoh(z);
! j, y* n5 K; t* q8 m87 }
+ s! F6 F9 E7 F$ X
6 g  i9 o; `: r: N6 l5 x需要说明的是TEA的构造函数: % f, c4 p0 |. N+ D$ f
TEA(const byte *key, int round = 32, bool isNetByte = false);
. H( d: }: o! c- @" a- \1.key - 加密或解密用的128-bit(16byte)密钥。
. j( k4 C3 i" j' o. P9 w) e2.round - 加密或解密的轮数,常用的有64,32,16。
; N5 G! Z# F5 J+ g3 q+ H3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 8 H9 ?/ k/ I& ]! `  P

: W3 f/ T+ m" ^: o: x6 \' Z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 2 q- s2 \- E7 J9 C4 Z" K! Q( Y
2 #include "util.h" , Q# d1 b& V, g; L2 ?8 J
3 #include <iostream>
- l9 B0 ]* T( L" X" M2 O 4    [) U" a% x9 b3 E# Z' B
5 using namespace std; ; U7 G  O2 G) Y/ m  ?) ?( v3 j3 I
6  ( K0 F0 y, U# g( W) m( E
7 int main() {
8 c/ w8 L2 h0 M8 e+ c+ s8 L 8  
! B4 d$ b5 t4 h8 q( l) d 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 7 g) X4 ^9 _/ ]+ K
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
; ~4 u1 W4 p" d8 L8 w* o11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; # m; W* P/ m8 X" |. ~$ V+ T; ^
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ( r6 {+ o! E8 K: h" T
13  ' z* N: @& H  \  w: P
14     size_t size_in = hexStringToBytes(plainStr, plain);
& Y# u( K5 m7 Q+ j: C! n15     size_t size_key = hexStringToBytes(keyStr, key); 2 Z; j. r$ R# ?7 G5 I  ?
16  
$ P% V( j3 r, E/ S4 E# @) t5 D17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
, p3 I5 Z% r- D2 ~3 }; d# V5 }18         return -1;
5 L$ `& {" k: y& t19  
# l1 X' E* X3 F" v: P/ h20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; $ L# J: N& q: M$ p
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 1 l2 t5 F" `, q; O8 L1 e
22  . @  \$ _4 Q; s+ @7 N
23     TEA tea(key, 16, true); " L" {9 Y5 X' f7 _1 e
24     tea.encrypt(plain, crypt);
1 z; t# D+ ~/ M25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
$ j: F: C2 \! C# I26  & [4 g+ C* ^1 z3 n, y
27     tea.decrypt(crypt, plain); 5 i! N' p% n5 Z8 U$ X" k7 [: y
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; . X+ x- x/ \  y! n: W
29     return 0;
5 U& ?& v3 f; X4 v30 }
/ [" ~. ^' o: u6 r' @  W) O6 {3 T% O+ N! Q) o+ ~) Z: d) d
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx6 v- m( }4 F  h! x3 h& T
运行结果:
4 g5 t$ ~: Y* [+ i0 E$ gPlain: AD DE E2 DB B3 E2 DB B3
+ g' ]) P: _  a% SKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
1 Z& m* a9 J! n3 T% OCrypt: 3B 3B 4D 8C 24 3A FD F2
; w9 r! m" w; fPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-27 08:37 , Processed in 0.027016 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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