找回密码
 注册
搜索
查看: 37732|回复: 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轮):' i+ M# j) S& y) P2 m9 [
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 * i8 }, E5 [/ X. O; E# H- g
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
6 e3 E. L. w# A* W/ Q7 ~5 V之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
3 r2 u- t* p. F" B在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - [* K, v+ D+ y2 d# d
在 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. ' Y: T8 h1 L, D$ `' ]
  2. void encrypt(unsigned long *v, unsigned long *k) {
    7 h9 q9 y+ a) c+ s/ w) W
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    6 J5 ~5 d8 S) M: [
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    " p# \- R. u& U7 r
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    & V/ A2 Z8 {7 a: d* v  x6 v: D* l
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 1 e) e" E. H1 y; |+ u
  7.          sum += delta;
    # T" N% O5 t; j& P& W
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 8 V1 j' y8 d% @+ A1 p0 p
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ' g& r( L1 G3 Y' \; p
  10.      } 5 m# T; W; J% h4 @
  11.      v[0]=y; / |) E) I% @2 X
  12.      v[1]=z; 6 C; F- K. t, q) f/ r! {
  13. } ; X" d+ h7 @& E1 \) z3 i
  14.   ' y. l1 P7 u6 D% T8 A$ H
  15. void decrypt(unsigned long *v, unsigned long *k) {   J5 N5 m: q8 d( G1 |
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ ! ?& V8 _3 n$ C( \( e4 ?6 q' L
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ # X" ~, b5 p9 r) c' |, A
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ + L7 v4 ]9 X4 m
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 2 V+ X$ u8 X, I/ K' P
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    + }# V$ i/ K; L' C. n" T6 i, U/ s0 @
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ! |9 a  P9 {! l3 q0 I7 Q" X* F
  22.          sum -= delta;                                /* end cycle */
    $ N) U9 S6 R* k! `; c4 l# C& ?- e2 w
  23.      }
    ; V0 Z7 @$ S' s2 i+ y5 A  M7 c9 ^, q
  24.      v[0]=y; % R6 G$ k- N/ Y: l2 S
  25.      v[1]=z; 1 v( S" V* m# T
  26. }
    3 n$ W4 _* g2 q! V7 P
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
1 |3 i$ @& \/ _. v, \5 [) f#define UTIL_H . Y) x3 H) R9 I9 A7 Z1 H) q/ f

+ b1 m- D) r* _0 ?& ^9 Y* q7 Y  i$ i#include <string> - P% F. M5 A' I- b( R5 f; G9 q
#include <cmath>
' K7 E, m2 Y$ I( L#include <cstdlib>
/ G, R& |# E$ n9 v/ x 2 `9 ~0 u& G* k  T
typedef unsigned char byte;
+ V2 V2 Z& {8 W! @7 N  gtypedef unsigned long ulong;
# Q6 r2 n  J. i# v. N& V& w* D ( F9 n* G4 f' y6 y6 s* R% B
inline double logbase(double base, double x) {
) ~0 Y: N  I& [3 f$ |    return log(x)/log(base); / {7 _& ?8 O9 }' p: X. T/ m
}
" X/ p3 h1 z) t* T/ F) c/ b( r
/ {* i! n* H( o+ k/* ! r. z4 J/ X6 b. }
*convert int to hex char. 7 S% a9 @. F# l1 p# |8 g
*example:10 -> 'A',15 -> 'F'
4 o9 [- G2 \7 W$ d6 K*/ 0 t' |1 J$ ?4 Q
char intToHexChar(int x);
3 {1 D( f) v8 b! k, G  C
, S  x4 I1 C$ [% U) w/*
% i; w: }- K5 X, o  P* e*convert hex char to int.
& W/ u2 Y7 G; o5 R7 j*example:'A' -> 10,'F' -> 15
8 O! A5 j8 P% ^" l*/ % R# A) L- {1 Y4 K
int hexCharToInt(char hex); # B$ [7 U9 o( l' g6 {& X

7 X. q3 H$ h. ?* I% lusing std::string;
- x" T7 m- e3 F3 ~3 M/ t/*
& }1 B3 {0 W) M5 {; L*convert a byte array to hex string. ' h% e% M7 }! L& s! F
*hex string format example:"AF B0 80 7D"
% x1 r8 ^# ?( [( a8 t5 S; R*/ # |( {( p, C  s4 [* X0 h
string bytesToHexString(const byte *in, size_t size);
& ]( X8 S9 y9 S; U& A 8 Q: a3 z1 I# ^7 c0 S% L2 Y
/* 3 g6 N+ m4 d, e
*convert a hex string to a byte array. ' N0 v( }$ [( R7 t, x/ z" A
*hex string format example:"AF B0 80 7D" ! c8 q/ M, T) Z0 T# }
*/
# b- m6 k: }  ]/ R+ v6 _size_t hexStringToBytes(const string &str, byte *out);
+ E' ~! f% O+ X# r
% w9 _' `# m9 s6 H! t; X8 c#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 9 y; {$ s! g# u: x, Y0 P' ?, M/ ?
#include <vector>
' E8 J4 X/ P0 X' m" C : b9 b& G; d. R1 C, z
using namespace std;
* q  B% E9 o* N- e0 b% ` ) |8 j" @) o8 p, {$ S
char intToHexChar(int x) { 1 a0 u' F& Q8 H6 b
    static const char HEX[16] = {
5 [) W; q) E1 h- [& a        '0', '1', '2', '3',
  F$ C* ?4 d) y. d, C/ o        '4', '5', '6', '7',   y# W$ Y# {( e7 j  b
        '8', '9', 'A', 'B', 5 P) }0 I" ]: x3 m
        'C', 'D', 'E', 'F'
" |2 E: E2 c8 _    };
) T- [$ t' X$ c0 E2 R) V    return HEX[x];
2 J1 m, E- _- z; z} 6 e  G# n3 S* u$ R
3 N- {. |! Z! q4 N6 v! h
int hexCharToInt(char hex) { 3 H  k; @( m. p+ L# K
    hex = toupper(hex); 1 h. ^& ?& A' b  T/ c* t
    if (isdigit(hex))
7 {$ R" V) l1 P        return (hex - '0');
& }! Y0 U0 |; i# Q    if (isalpha(hex))
2 K! R5 G4 c. b# D. {% I) f        return (hex - 'A' + 10);
" M1 u9 p3 v: L- h8 ~4 ]    return 0;
+ [! O, t+ {; a" H} ; O# P" |: x$ ^# y! Y
1 P& ]& P' z, }/ t, t; U
string bytesToHexString(const byte *in, size_t size) { : p5 D# P1 @# h% p8 {
    string str; ! y$ h  Q# V2 n% h5 y
    for (size_t i = 0; i < size; ++i) { $ P# n3 n6 K9 s8 K0 [
        int t = in[i]; : |/ a( C! j8 Z! o
        int a = t / 16; # D, Q( q; w; E+ z
        int b = t % 16; 3 C5 U" x+ t! t4 B9 o2 h8 ]
        str.append(1, intToHexChar(a)); $ n- a" B% `8 d( j/ c1 h
        str.append(1, intToHexChar(b)); 9 ~6 }; w6 z  M( o
        if (i != size - 1) 3 L7 R( P- ]7 u0 F0 B
            str.append(1, ' ');
3 |; z- u" O  p) S+ y, Y    }
, K# r; m% w- O! \7 W4 F) x    return str; # ^8 h; D9 w, t( i; s
}
. x/ i/ h. q& s+ c: U  ^
+ k! J: E" m$ l! U) T$ O7 lsize_t hexStringToBytes(const string &str, byte *out) {
& [- p: b5 f' {! g. P1 B5 E, ?- i ! e% {9 O! {  y; U4 o# \  m6 V) _
    vector<string> vec; 1 r6 ~- [: \, \) B1 k+ S
    string::size_type currPos = 0, prevPos = 0; 0 S% }, J* I+ v  q2 g7 I
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
+ T2 u; v, Y! F' A        string b(str.substr(prevPos, currPos - prevPos)); & F: l( h% m; m( t4 g
        vec.push_back(b); / [; r/ R5 M" }/ N; j9 ?
        prevPos = currPos + 1;
' \3 j* U  n! F% L4 C' G    } ' ^) w' ]7 L' ?% A% h' T- W5 T6 x
    if (prevPos < str.size()) { 8 [7 z+ H3 n* ]/ F, e; @. l- [
        string b(str.substr(prevPos)); " F5 n/ C# q. R# ~( V. [8 H% i5 H
        vec.push_back(b);
, I3 ~6 D, m' w) }+ k! u7 |    }
! t! I) h" f' d: _    typedef vector<string>::size_type sz_type;
9 N! x: M, W$ A5 o- k9 z    sz_type size = vec.size(); 3 w8 Y) J; ?) K* v8 o& P
    for (sz_type i = 0; i < size; ++i) {
/ A) [1 P1 s& C  A& `( z8 ~        int a = hexCharToInt(vec[i][0]);
2 I* O+ V4 [3 {- h& [8 B& g! I        int b = hexCharToInt(vec[i][1]);
0 U) I" |/ ?& [# `& _9 d        out[i] = a * 16 + b;
& H  W5 J4 T, a  f+ H9 P3 ~9 n, s    } " e0 H7 A& m! T0 O
    return size; 3 ?$ S; R( I% w+ O# P- U
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 5 x4 Q$ i3 d$ m+ g1 ~  s$ h
#define TEA_H ; K' \' z. M2 p3 ^: `& w3 u
/ U* v) s/ o9 z% L
/*
% Z6 E* `5 q3 Q: x3 p+ j% f( O- u*for htonl,htonl
! m0 C( }+ U& g, c# D+ P*do remember link "ws2_32.lib"
* O. ^/ s' t0 u3 z*/
; M/ e' R3 _) j! a# |6 S#include <winsock2.h> ! c+ }( p7 P' P) F3 l- ^' B& y
#include "util.h"
5 t7 ]' x/ V4 I9 C ) p# `& q! w8 i' w9 {
class TEA {
% M5 R, Z( N$ ~. W( hpublic: ! m. {% c6 y! q5 ^8 J
    TEA(const byte *key, int round = 32, bool isNetByte = false);
: m) H$ f5 m  O$ _" w    TEA(const TEA &rhs);
- L  L3 \+ C% o    TEA& operator=(const TEA &rhs); * e! _: i2 J8 }+ k1 P+ W6 M, R" E7 d
    void encrypt(const byte *in, byte *out);
* ?( x# }/ _1 l, x& }    void decrypt(const byte *in, byte *out); . R; ]' ?: Y: m8 K
private: ( ^& Y# ^$ D: f7 j3 @0 {
    void encrypt(const ulong *in, ulong *out); 1 U+ `: [7 W# |, n7 f' X, B& g
    void decrypt(const ulong *in, ulong *out); + M# `8 h( c: N( Z1 S2 n
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 4 f3 M0 r5 k! w4 }
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
5 n, e3 f7 N- \, E5 Gprivate:
: C! I& k. h6 Q& H( p' k    int _round; //iteration round to encrypt or decrypt + S; b% u; L2 Y
    bool _isNetByte; //whether input bytes come from network
  u7 G% X/ E( f6 U9 ^    byte _key[16]; //encrypt or decrypt key ' R9 r& E! W3 {5 W2 l+ F& ^
};
' N  D% Q6 d5 V" V5 d / h3 U" H' y' C9 v1 q
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ( |: R- }3 Z7 N0 Y& \! Z9 ]
2 #include <cstring> //for memcpy,memset
. H) M/ Y6 o) C; T9 n 3  + r. ]- W+ t0 r! W  l6 b8 A2 V
4 using namespace std;
8 r' X6 E( b6 x3 _% _ 5  
, v1 k8 n3 P" `8 G7 k) X3 Y 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ! b1 |* \! z( E1 Q3 `
7 :_round(round) 7 O# i; P) H/ v" s) a7 u$ U/ R. i. p
8 ,_isNetByte(isNetByte) { : Q/ J2 c; l2 b% c
9     if (key != 0)
( N" W# P: F, t( J! [10         memcpy(_key, key, 16);
( P9 w3 T! M$ ^+ }% @5 ]( l& t11     else , l* x# a: @% k( l: E
12         memset(_key, 0, 16); % H1 Y5 i" @7 @, k
13 }
7 ]  {& R% b" `5 V14  / B( `/ u5 z& z
15 TEA::TEA(const TEA &rhs)
' b6 L% O, o( d' Z  a+ J9 g6 {16 :_round(rhs._round) ) |+ ]/ S/ _" n2 i6 c5 M
17 ,_isNetByte(rhs._isNetByte) { ' u7 b! N( c' h/ |
18     memcpy(_key, rhs._key, 16);
- k/ |; j3 Q. F5 g19 } 4 C/ K  M4 d7 z! I' y7 V# ?1 H# @
20  
9 Q; g' J$ V3 e! _4 c21 TEA& TEA::operator=(const TEA &rhs) { 9 R4 k2 P; |7 d% B0 O7 H  }5 f% @; ~
22     if (&rhs != this) {
3 s+ J" |4 T/ x0 y% ^& t! S+ h8 Z; d  v23         _round = rhs._round;
2 q  p# i# m; p5 B24         _isNetByte = rhs._isNetByte; , u) r( {' D2 e3 J) \1 R
25         memcpy(_key, rhs._key, 16); : Y# l; F' C! \
26     }
& g) E. Z+ i2 U# r, \2 r27     return *this; 0 M4 E" Q# O9 c# m- U' u
28 } - D" O  B: f- y* J1 i0 `; x
29  
; \& |4 A3 s6 j* I; ?30 void TEA::encrypt(const byte *in, byte *out) { . w8 u7 ^* Y- m* F! d8 d; o
31     encrypt((const ulong*)in, (ulong*)out);
1 d+ |+ r- `8 c" z32 }
3 S! K3 @+ U% X, j' T/ b: Y5 ?+ K33  
* E- F6 W9 s) b& h) R% ?# T  l34 void TEA::decrypt(const byte *in, byte *out) { * e3 h- w5 ]8 k* M1 Q, D- ~5 _
35     decrypt((const ulong*)in, (ulong*)out); 7 e( h* f4 _4 z$ E- X6 F0 @
36 }
6 n0 c& u  Y% p4 I1 V7 m37  
) V3 d- S. t/ V4 P3 h* {; l1 M38 void TEA::encrypt(const ulong *in, ulong *out) { 2 k9 n  }& P; E  D  Z3 W, e$ a
39  
6 `# r2 W8 j" q3 @+ g( ^' I40     ulong *k = (ulong*)_key; - R4 A0 Y1 u; V$ [8 i' x
41     register ulong y = ntoh(in[0]); 9 u/ F4 i; }4 ]/ t4 o8 T: L
42     register ulong z = ntoh(in[1]);
, S4 ]; Z- }' [43     register ulong a = ntoh(k[0]);
( l( h2 {( d1 u! |, S44     register ulong b = ntoh(k[1]); 2 `7 T( I- |4 G7 s0 M  X
45     register ulong c = ntoh(k[2]); 3 W* v: x  y7 g5 A/ r2 k
46     register ulong d = ntoh(k[3]); 0 V! c9 B" m7 D+ }
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ / y5 `7 |+ Z9 y
48     register int round = _round; 5 I1 g+ J3 L' o3 {
49     register ulong sum = 0;
0 i" \7 o) N/ e8 {" [& b50  3 H2 y! Q6 x& l4 ?* c3 o1 k
51     while (round--) {    /* basic cycle start */
' l, B5 x% v0 h, p- n" n52         sum += delta; & Y" g7 |( G  Y
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
0 k: t; e& i" h; @0 Z" U. q54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
, \. A+ K/ L% Y) x6 [" `55     }    /* end cycle */ / f+ g# t" ~+ q) \' Y9 g$ b
56     out[0] = ntoh(y);
6 K+ k6 G7 K' h' ?57     out[1] = ntoh(z);
. V& f3 E1 t. [! b9 e' B58 } ; ?. q& x& k% R6 y
59  . d- M! O  Z6 W6 C, P% o( Z$ u
60 void TEA::decrypt(const ulong *in, ulong *out) { * n3 q; f2 ]2 i& a' X7 }5 _7 F
61  
% d1 U/ E0 R4 l4 H8 ]62     ulong *k = (ulong*)_key; ' h+ {8 Z  n: Q" Y
63     register ulong y = ntoh(in[0]);
& f" I+ R5 c4 G- C& I* g6 C64     register ulong z = ntoh(in[1]);
* b5 F8 }' I3 X1 v% d. T) I65     register ulong a = ntoh(k[0]); ' d% J, ]! P5 n0 c2 |0 m
66     register ulong b = ntoh(k[1]); 7 a9 y5 O  [3 B- \1 T
67     register ulong c = ntoh(k[2]);
' y& j3 n: w! z' A68     register ulong d = ntoh(k[3]);
) @3 e1 S' x$ m" t69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 7 b9 [& _" n: I/ w2 W
70     register int round = _round; ) s# @) D7 }$ f) Q% Y
71     register ulong sum = 0;
& R# _2 P8 S. x1 a6 k72  
2 o7 J9 d: ]2 o73     if (round == 32) 6 b: d* [( ]% a3 f8 p+ b
74         sum = 0xC6EF3720; /* delta << 5*/ 4 T8 O* F0 F" G. i3 w
75     else if (round == 16)
: b- }& W! {/ A0 l! Y& v; i76         sum = 0xE3779B90; /* delta << 4*/
& m: L4 i  l7 k4 l77     else ( X/ X# B5 w5 k9 E' q/ O9 _
78         sum = delta << static_cast<int>(logbase(2, round));
9 J. n7 h/ F2 D' N% Z: x79  & A7 A6 a, C; i6 e" m
80     while (round--) {    /* basic cycle start */ ' x$ N3 f8 w0 _; j% X* m0 }
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); + ^- o* N6 V" j
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - p; b4 n/ t/ I7 _" ~
83         sum -= delta; - W0 p, V: T, T  h
84     }    /* end cycle */
4 Q2 x1 Y* |: {7 [  {9 T85     out[0] = ntoh(y); , Y1 ^: ^: Q8 n
86     out[1] = ntoh(z);
3 V0 Q1 h1 c, ?5 K4 i1 P87 }+ Z: c2 n8 B! U
% X4 }0 y/ n* e3 Q$ O
需要说明的是TEA的构造函数: 7 l$ ?8 S. \' ]1 O: a; P
TEA(const byte *key, int round = 32, bool isNetByte = false);
$ I' a' b' l1 Y( R; l! h: |2 n- h1.key - 加密或解密用的128-bit(16byte)密钥。 4 q& q: H+ e0 S7 [: m# y
2.round - 加密或解密的轮数,常用的有64,32,16。
1 d( X# u! B* D4 u8 E1 D; k( A  `3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
1 ?+ N3 U1 W3 _( H% y6 o
* ~2 `$ Q. Z* B0 S! P0 P  `+ B2 J最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 8 j5 s8 ^* S. g2 |1 W6 J$ L
2 #include "util.h"
) f. y1 H1 h! L; F( I) H 3 #include <iostream>
3 C% L: I2 U  P* X8 G: { 4  
6 ~/ X' Q: x  T 5 using namespace std;
# ~' y& Y2 \% K2 @ 6  + [) x, n, N( q# I  R0 A+ ~
7 int main() { 4 C- ?4 V( D/ j& c7 \) e" v
8  9 {+ H) _5 p/ j
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ' b8 ^# q( b3 l
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 6 y* N8 h2 ^; F  `: l
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
, f2 Z0 K. ]  W- j2 Q& @5 E8 r' m12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 7 Z& N! N% ]7 @
13  & j2 F  R% @0 X% y/ l
14     size_t size_in = hexStringToBytes(plainStr, plain);
* T0 a) L; [5 D9 }5 d% W$ C15     size_t size_key = hexStringToBytes(keyStr, key);
; H. C$ T" N  @' L16  
4 h0 P, n) e4 D) G17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
4 v3 g* b* p" u8 m: T* ?: r8 Y18         return -1;
5 \/ m6 |- i! j7 D. ]19  
/ }! P# X/ `$ n$ F* D20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; % b6 N! R4 S, G
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; % B2 z4 [0 R* A2 m" b
22  
  ^8 z& M' P  H, e% C23     TEA tea(key, 16, true);
; @$ X' p" U  q& g* C24     tea.encrypt(plain, crypt); " w2 [0 O/ C1 U
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
: A# `  C- z3 _( u26  
5 g0 M* R( _3 p+ `$ u27     tea.decrypt(crypt, plain);
. v: l. Z  D0 v2 u28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
2 w9 a0 l+ M5 r9 U. E4 F- e29     return 0; 7 }$ N. w8 F# G' q
30 }1 H# Q& T2 [6 V

8 Q9 F& A8 c+ f3 s# E) X本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
# \+ b9 F% o- [& |3 g运行结果:
+ P4 ~" m9 q7 g5 \' S  sPlain: AD DE E2 DB B3 E2 DB B3
6 X' @: O8 w& {: S# T* sKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 4 x! y7 N" _" w
Crypt: 3B 3B 4D 8C 24 3A FD F2
8 Q4 O& b# F, A; b/ dPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 18:28 , Processed in 0.020603 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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