找回密码
 注册
搜索
查看: 37857|回复: 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轮):
6 n. J2 M9 A8 E1 S微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 & `! V( Q* q6 h
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 * Q- ?3 M9 ?4 R2 g" C; o
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ' E. w4 k9 W: @: Z* D: \8 {" P
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ; o4 n. q7 l+ V* p  p1 w" 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. 8 U& i, n# I7 {8 W  a
  2. void encrypt(unsigned long *v, unsigned long *k) { ; t# x) g+ ^3 y" f* Z+ T8 [9 ~3 {
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ; j4 B" U& M8 y" e& @
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    3 I: {+ c( W  L7 p
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 9 x( l# |5 f9 |- K
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ - Y. E: U/ k" A: T- e, E
  7.          sum += delta;
    2 D  F* c; t$ c
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);   l+ P" [! |  y2 `% F9 L: q
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    3 X- e5 U$ S! X: K! M% a: I3 W( \
  10.      } . D4 ~2 j0 y% k
  11.      v[0]=y; 2 K9 V  Z( f" ]) T* T! s
  12.      v[1]=z;
    , v$ U8 N0 r- @, i, m- O! ]6 o# w
  13. } + n  X# H7 f+ W8 h$ T6 z" j
  14.   $ w8 Z8 S- c6 J; k/ y% [+ ]
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ' C$ l8 g6 }: L' U8 T
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ ! p! V2 S# H3 o* X* g+ x2 [
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    & Y" p& n  T: s% B
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ' L; d& y  Y, n
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    8 P( F# x6 L* ?" f3 i3 e  r' D8 a
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); / M+ k" Q. k/ Y" F2 U
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 5 `7 y4 q1 b9 `0 h) {
  22.          sum -= delta;                                /* end cycle */
    * m, k7 e  W1 s3 F
  23.      } : I. i# v6 o9 z. p( d/ x9 e
  24.      v[0]=y;
    * S1 s) k* ?) {$ O9 w- ]* e
  25.      v[1]=z; . _7 k- n" T5 ^) ~1 s: j# u
  26. }) V* U" ^  s- c/ \" B; {& v
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
6 {- G5 q( `2 z' |, E#define UTIL_H 7 T$ N- @2 \/ ~" a1 `  |, @
. ^5 _& L7 I: c6 M4 l1 k
#include <string> " b) x  Z4 V8 e  R, m; R
#include <cmath> , b6 R# ~7 j& {6 w) X9 c! ]1 C
#include <cstdlib>
: V) P4 h0 t5 H : l) ~! \% V, A% k) a! R
typedef unsigned char byte;
$ e' ~( F" p; f" h( utypedef unsigned long ulong;
- }) a9 R3 z4 Y6 U
+ A- N% R2 }3 Qinline double logbase(double base, double x) {
# N9 g/ x4 @& n% e6 U# W    return log(x)/log(base);
, {5 g1 c# i" m( x9 z# q} 0 m% |3 l, ?( j. K+ _
3 ]! y1 b# B9 _  x
/*
) M) f0 L9 E. x9 R* g# |$ o: N* h*convert int to hex char. ( a1 b; K$ x/ I" l* X5 o, o" a
*example:10 -> 'A',15 -> 'F'   S" {# r8 l3 y+ v
*/
" y) K1 y  ]( ?$ K3 lchar intToHexChar(int x);
: U4 }0 n7 I  C. @4 } # }# N! p# V1 ^# a6 u
/*
5 a2 I4 `7 x! S! Z*convert hex char to int.
3 ~  X8 B4 Y+ B' I1 W% B*example:'A' -> 10,'F' -> 15 ! j5 K, s  ]5 e" A+ h
*/ 3 f4 {3 A0 B) Z" b/ ~$ b
int hexCharToInt(char hex);
& v9 K/ f  L; e5 S2 Z( g
% Z, W: d7 ^/ B, U0 |  eusing std::string;
) Z/ \0 X# T& I' c+ G' V/* : A6 q0 e% D  A
*convert a byte array to hex string. 4 e: ]# b/ \! H; R. N
*hex string format example:"AF B0 80 7D" 8 @, M: w4 h9 S1 l: T4 [- d
*/ 1 ?: D! s0 s& H& m
string bytesToHexString(const byte *in, size_t size); " v' ]. H8 ~" _; @+ A" T

- O0 h: e8 {( X" O! G/* $ o( l- _. D$ I4 W4 I) t- N
*convert a hex string to a byte array.   F) I  b; Z* a
*hex string format example:"AF B0 80 7D"   x0 W& z' W5 ~# }6 x
*/
5 q8 j' ^6 U& U# r/ O+ Gsize_t hexStringToBytes(const string &str, byte *out); 9 o! Z! B9 y* f' F% W/ `. z( h% \

- [# j7 c( O8 M#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"   [' V* G/ Y# A3 k! ]9 @7 d" a
#include <vector>
2 k2 A( H& a; b& g9 s9 N
8 N# e* ]. ~$ ~/ ^1 Z; nusing namespace std; / @. ]9 \: R& q2 W4 D( C  p% ]6 o
! [& `6 H2 ?( S& R+ _/ I
char intToHexChar(int x) {
( e6 d; a1 t( c7 e+ t    static const char HEX[16] = {
2 J9 h! a7 ^5 e* e: @4 q6 G        '0', '1', '2', '3', ' g; i, S" T) G" l# `
        '4', '5', '6', '7', : W( Z9 \# Q8 z1 Z& B
        '8', '9', 'A', 'B',
" o. @. P/ j" _        'C', 'D', 'E', 'F' 3 V, G/ e# X4 Z# T, m
    }; ) R$ }  m# H- `, u  ~% n
    return HEX[x]; $ X! x% g9 A2 D+ ~. ~
}
/ d% v# x/ f8 B2 [8 A1 u8 e& c: @ 6 \5 I% t3 Q  W5 b6 M
int hexCharToInt(char hex) { . i- {  [9 g& L% k. R( k. ^
    hex = toupper(hex); & {  ]7 X1 ^) j0 i* u
    if (isdigit(hex)) " q& v* Y9 [" H' ~; b' z9 A% v
        return (hex - '0'); / V& T' `# s3 {$ x# P9 H$ c) D* U
    if (isalpha(hex)) ) J3 O0 Q1 J) r9 P* \- y
        return (hex - 'A' + 10); / g/ n6 v3 a! [' F$ o! {3 {# l5 Z' @
    return 0;
9 n; X# _" U  ^$ b, t8 `1 p9 T} % r" g" R: y5 d- R2 x* }4 k" b0 a

5 w' z" g+ z2 y; i+ e, l4 Ustring bytesToHexString(const byte *in, size_t size) { ! C2 l+ w- u6 w. ^: E" \% w
    string str;
7 U* `. m, ~9 p- \    for (size_t i = 0; i < size; ++i) { 6 v1 t: H, g# `& c  @+ K0 `
        int t = in[i];
: l  R* C, {0 w8 v, h6 Y        int a = t / 16; 1 ]9 Q/ S: ?' o* [
        int b = t % 16; . X. U; D7 R2 u1 V9 L. w
        str.append(1, intToHexChar(a));
7 g5 S- f; n5 p% n9 n# D4 z3 y$ o        str.append(1, intToHexChar(b)); 3 j& O- `6 V1 ]& }  m
        if (i != size - 1)
( @6 y+ E9 f! j) Z% l            str.append(1, ' '); 5 _  v" S, P8 w7 D: Y+ I
    } 4 i+ W$ B6 ]* H  ^8 n+ |
    return str;
3 f; {1 g4 y. [* z1 e. Z( s}
( w, q9 F: |4 j' T
, t( [  j+ f+ K2 p  @size_t hexStringToBytes(const string &str, byte *out) { 9 d3 E! ~- W. T8 B6 t5 u% w

; x/ a8 R- z4 s# D- E2 |    vector<string> vec; . F9 x2 L2 i9 G; c) D2 g
    string::size_type currPos = 0, prevPos = 0; 9 l! m* z. e' v. x: V
    while ((currPos = str.find(' ', prevPos)) != string::npos) { ) {/ g9 \9 g1 ?* j3 I' {; a0 D. x$ |
        string b(str.substr(prevPos, currPos - prevPos));
1 f0 C- U! N- k( G) m$ F        vec.push_back(b);
: k5 P/ M* f& o/ V9 c9 X+ g* s        prevPos = currPos + 1; 7 a5 L3 |2 t) D" s6 X  a9 j
    } 9 O+ h8 ^- _- t* k& e1 d
    if (prevPos < str.size()) {
+ |: c8 W9 `  e! Q        string b(str.substr(prevPos));
7 Y0 L6 g7 _) D  C        vec.push_back(b);
+ c0 Y# a" h0 \+ D    } 9 z* D9 S, x9 `4 y: Z
    typedef vector<string>::size_type sz_type;
# U) Z- v' R( J4 \    sz_type size = vec.size();
+ Y. A: y$ B. y) f& t  u  s8 s    for (sz_type i = 0; i < size; ++i) {
. B# A/ u, r2 a& ~; i* z" b3 p        int a = hexCharToInt(vec[i][0]);
% n6 a! ^6 s% e- w& \* T; d4 B        int b = hexCharToInt(vec[i][1]);
. H) }8 T4 k: X/ E& @% W6 L: q: @        out[i] = a * 16 + b; 5 Z1 j# M; J6 F3 l# R6 R
    } 2 l1 {3 N) A  f4 O3 _
    return size; ; n' y" K% ^1 ]3 d& D
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H , X) R8 G- Y( }% q. e: u
#define TEA_H 8 W( i) x; u/ ?" |, [# U
, \  s& G+ E: H# k" o9 H$ g
/*   ?/ x* y4 J$ U  v: R
*for htonl,htonl
3 i* S  W$ F9 r; Q1 `8 j*do remember link "ws2_32.lib"
8 i4 }) l" m. x( ^2 h' h" z( c2 `*/
4 {# x: G& x- R' G8 @#include <winsock2.h> ! l8 r9 ^  I$ e9 k% v  i
#include "util.h"
' g4 ~8 ^, e$ u+ \9 o' h 7 `) ^% r6 |, I6 B) C1 n
class TEA { 9 H' K) n3 X; \4 D0 `" e
public: ) i- l( _# Y- e: w/ w
    TEA(const byte *key, int round = 32, bool isNetByte = false);
! [" e' {$ v& b* r5 d& P; |- g8 m: [    TEA(const TEA &rhs); 7 s+ x5 y! N, T/ S, `# U- E
    TEA& operator=(const TEA &rhs); . N; y  W1 n+ b. u% y7 M+ P
    void encrypt(const byte *in, byte *out);
: k6 k2 X" s: f    void decrypt(const byte *in, byte *out);
- Q9 j' v+ a5 \4 R. a, Uprivate: : ~! U5 ^* j4 e- s/ C
    void encrypt(const ulong *in, ulong *out); & Y& m7 Z( e8 {% c' c
    void decrypt(const ulong *in, ulong *out); . ?4 n, `. h3 T7 U0 z
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } - p2 j5 J* B6 n+ p
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
* h; Y- a7 X! C, eprivate: 9 E, n8 M8 }+ D7 u" A
    int _round; //iteration round to encrypt or decrypt . [. _' W9 z) I- {% o, I* e/ l
    bool _isNetByte; //whether input bytes come from network 2 p3 I* D! J+ \  u7 [2 I
    byte _key[16]; //encrypt or decrypt key
0 V% q; Z4 I$ K}; - _- _. t) u7 x3 _

! D8 K/ r& a: b! j5 V! Y#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
' M% A' E& C2 @4 K 2 #include <cstring> //for memcpy,memset 2 I( {3 D3 _4 J1 j) k8 r. ?
3  5 Y: f# b$ z; Y+ M$ {2 ^0 H- g
4 using namespace std; # k# p8 A2 ?; ?  c+ `6 [  v$ z
5  ! W# u' N5 Q" m0 J+ C
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 8 |" V  h$ r' U
7 :_round(round) ; E4 W+ M! |! y% e2 y
8 ,_isNetByte(isNetByte) { 5 @- o" q( F9 ]2 k! F8 i6 L
9     if (key != 0) . D% t( v) `, I9 C6 q
10         memcpy(_key, key, 16);
) y( a- H5 _  K/ {: c" n11     else
* K2 {2 o0 T2 C# h8 J, P( [8 g$ F12         memset(_key, 0, 16); 8 _5 P: [' K5 R* q
13 }
# k# S1 D2 N4 i/ k: q! g14  5 l* u7 x, y$ R
15 TEA::TEA(const TEA &rhs)
, W% a8 K/ S2 D2 ~16 :_round(rhs._round)
( n6 u+ Y1 {0 d( [17 ,_isNetByte(rhs._isNetByte) { + {: l' {# k3 L: V
18     memcpy(_key, rhs._key, 16); : W, W' ~7 o* {! s: }. s
19 } ( Q2 Y# B: o! h, J7 ?( Z2 s
20  ) ]) V8 x5 E6 F$ q  Z# P
21 TEA& TEA::operator=(const TEA &rhs) {
2 t9 v0 {# S  J/ r6 C' s+ r& b22     if (&rhs != this) {
- j/ S9 z$ T) ?+ o5 T23         _round = rhs._round; + L3 h2 |& C4 l% P( M# R# v
24         _isNetByte = rhs._isNetByte; + A6 N$ }; Y; |  w$ P0 ?2 j
25         memcpy(_key, rhs._key, 16); 9 e* d* N" u) o1 S/ \, p% b7 O& J
26     } 5 b* t6 s9 r. l$ b; M
27     return *this; 0 ~" ?1 h, P$ }1 R
28 } % D# u7 e" ^5 q* D  \
29  4 L( e4 U; Z# d( D/ u  }
30 void TEA::encrypt(const byte *in, byte *out) {
" d- [1 J5 G# p1 U% B& p4 D1 l31     encrypt((const ulong*)in, (ulong*)out);
  o, _) h8 F5 o# d# V+ Z32 } 1 j1 W1 I! V2 d& J5 `' q
33  ( l. y0 m4 U" I, E
34 void TEA::decrypt(const byte *in, byte *out) {
6 g% T# `" @0 H9 `* F- B35     decrypt((const ulong*)in, (ulong*)out);
" U3 K. u: @2 O; C2 l' |36 }
% H( f8 i4 s( U5 G& R: E, Q( G37  
* y$ M- j1 t% ?" @' p38 void TEA::encrypt(const ulong *in, ulong *out) {
$ ]6 {& q* R! R39  
, u" e* _# c5 f$ C% P* [40     ulong *k = (ulong*)_key; % B( O, u' M  r
41     register ulong y = ntoh(in[0]);
- s% y5 i9 ?  A& h$ {( o: a0 O42     register ulong z = ntoh(in[1]);
& h( g1 z% u: P# x43     register ulong a = ntoh(k[0]);
- m7 b" z; ]  j3 Q" Y* q8 d; O44     register ulong b = ntoh(k[1]);
- z* o: |8 m$ y7 J45     register ulong c = ntoh(k[2]); ( \" D5 P+ f. M4 m9 b; _( l. B
46     register ulong d = ntoh(k[3]);
) V1 `( Q& _5 @% ^+ v; w1 w47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
; ]. Y) r. V3 F& K) ?48     register int round = _round;
) ^0 l5 D( }( O4 [. g49     register ulong sum = 0; 2 g, R( a: ]$ d/ @  C
50  + ~9 E) E, o; P, N
51     while (round--) {    /* basic cycle start */
5 G& z5 J1 A0 D# u52         sum += delta; 9 D6 N) C- w; j7 p8 ~+ ]- H
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); / @( B, D' e' S
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
, _% Y% ^9 V2 c2 s' N7 ~55     }    /* end cycle */
' P% |5 m6 C7 H5 V56     out[0] = ntoh(y);
3 C- a- w6 k# c" t( ^/ s& ~57     out[1] = ntoh(z); 2 I4 L/ \7 u+ h* p& i# K
58 }
8 X6 o4 P, O  ?- W6 f" q- o+ S# n4 x59  5 `. A3 V. a1 ]3 w  |5 }! y
60 void TEA::decrypt(const ulong *in, ulong *out) { 5 L% k* ?- l2 n- Q4 [; B" M
61  
9 X& J% C; J: ^! D+ ]4 L: `62     ulong *k = (ulong*)_key; * H. C2 N' Z, W5 B3 Q! z
63     register ulong y = ntoh(in[0]); $ B2 d# E5 }' ?2 j) e$ E
64     register ulong z = ntoh(in[1]); ! r. e5 h- r3 @4 A" Z: i: p8 ^
65     register ulong a = ntoh(k[0]); ( P( D4 b: u9 z& d4 q
66     register ulong b = ntoh(k[1]); 9 |- C. c) j6 G( D9 Q: w1 R# }
67     register ulong c = ntoh(k[2]);
0 ]* A3 j- a( F68     register ulong d = ntoh(k[3]); : R5 ~. b% s5 A' f
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
% E* R* }1 \  g5 F" O" ~0 B, `- w70     register int round = _round;
9 H1 Y( M$ f2 ?' s' ]. h! H71     register ulong sum = 0; . D+ z9 Y4 C$ \9 o3 i" X: y; X& S" Q
72  * [0 v8 G; _4 T
73     if (round == 32)   B3 J! Q0 o4 ?7 L# U
74         sum = 0xC6EF3720; /* delta << 5*/ 2 @6 W4 T9 p' \, e2 z
75     else if (round == 16) # A4 X6 L4 s1 Y3 ^7 V! B# z
76         sum = 0xE3779B90; /* delta << 4*/   t: q2 Z& Y) Y" Z) l* ^+ T
77     else
2 q) e  l/ Q, Q& M0 U" A' N78         sum = delta << static_cast<int>(logbase(2, round));
$ P9 `# w# J, G79  
6 ~' ^4 I& d" A$ \80     while (round--) {    /* basic cycle start */
* }! u5 E; m% {  k81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); / H' h! l4 {. {# {8 U3 z1 |
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); + A- k4 d7 \+ m) N/ A4 c) e+ ?
83         sum -= delta;
$ e: X6 ~- K1 p84     }    /* end cycle */
) t# X+ X$ O- H6 g85     out[0] = ntoh(y);
1 ]) X/ l" J$ u4 B" J5 _9 D86     out[1] = ntoh(z);
4 U+ S  B9 p* \. v0 v: P2 z0 I) r87 }, u2 n' _1 ^0 Z9 \$ _( u' N
: i- ]( N& d; m+ ^1 K3 m7 X  Z
需要说明的是TEA的构造函数: 1 a5 \) G2 ]3 o( J, l# Z( u) X; Z. q
TEA(const byte *key, int round = 32, bool isNetByte = false);
. X! f3 R, q3 {+ n1.key - 加密或解密用的128-bit(16byte)密钥。
$ l6 e# P; K7 ^; ~+ }$ \2.round - 加密或解密的轮数,常用的有64,32,16。 ! i) U! f* `$ e+ Y2 U4 Q
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
+ K* f3 c1 [0 t# j) l9 u2 s$ V4 S/ _+ [! ]% P
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 3 C, h, C# [4 n( @
2 #include "util.h"
$ [( p9 i8 I5 K* y: K5 O 3 #include <iostream>
% \8 [( ~( X/ _+ v6 t 4  
: Y, G/ R1 t, m5 j4 V; E" I* | 5 using namespace std;
( z. w. t# F8 s1 K* _" I 6  
- a' I1 Q+ H. H- G 7 int main() {
# Y9 L- B  A2 T 8  : w& B' P5 l0 ]) v, U! y
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 1 g- g; S; ]3 G; f  w, o
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
% r) x5 W9 @& U11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; * O$ K2 X* N& k0 O% ?) y
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
! O1 e7 u" u( e! V0 S( e- b2 l13  
* x9 a) [) O& @! ^: r14     size_t size_in = hexStringToBytes(plainStr, plain);
% [2 {3 y5 b6 a5 i0 k15     size_t size_key = hexStringToBytes(keyStr, key); ' ^  S% }$ t, w' v8 u- h- K
16  
4 v' ?' a! g$ L( \* G17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 3 U5 e$ k2 u- t  Y6 g( G+ S/ y
18         return -1; 9 M& D- v3 t5 `4 q9 O% p
19  
+ t6 ~7 R& b2 h20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 9 z& k& p+ g+ ^
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; " T; t: o+ r! D( H1 N1 H% w
22  
8 Y( Z* X7 x+ T, ?1 C6 S8 ^23     TEA tea(key, 16, true); 2 I% q" F9 r  N+ _5 Y$ n7 I0 [2 u
24     tea.encrypt(plain, crypt);
3 L! @9 @  ], \- s, Y. |25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ! W! W$ m; @6 M) Y3 D8 ^# [
26  
4 B% _1 l# Y0 w0 Q0 `27     tea.decrypt(crypt, plain); 7 M. ?/ ?% B/ x2 j1 l
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) `: L* q8 k, }' @. h: x29     return 0; ; d0 k  @( `4 I$ j
30 }
2 e( K' h( o, w2 o
9 X/ v+ B$ b  I$ I% p0 ]/ K本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
1 t: n! j  O  z. A0 d  ]/ v! L运行结果: ' n# g$ x& H5 ^. s; t
Plain: AD DE E2 DB B3 E2 DB B3
0 U* i" F0 K* e3 r0 E$ {7 HKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 1 e7 X; a+ S& B: l; E
Crypt: 3B 3B 4D 8C 24 3A FD F2 ( S- B0 }/ U$ ?
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-2 00:55 , Processed in 0.019201 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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