找回密码
 注册
搜索
查看: 37711|回复: 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轮):
& L! c6 I& d! C) _微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ' A, \6 A1 L9 G4 Q. p9 s0 H5 M& W
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 0 A! I$ I. a2 e+ ~8 G; l
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
! G  N( v. s$ Y在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 * a' X- g7 w! i7 D! 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. 0 L/ |& h+ c. ^! ]( J! J
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ! V$ B" [0 U, t0 g$ z+ P/ {5 L
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 5 @* J" A* i5 K: O' y$ E. z$ @+ W
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 9 E4 j) M. k6 `$ @, b% T
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ , n' U: |5 E" A3 ^! e; v
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ - c+ a* z' |9 |. Y+ Z0 S: T5 @
  7.          sum += delta; 7 R2 m5 c3 D/ S
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); , ]1 Z7 R2 \# b7 [
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ / V+ d6 E; [& Z" w% g, W7 t
  10.      }
    + F. |$ S( I! ~6 h7 F5 n5 z
  11.      v[0]=y; # P0 r. }- [+ Y. ?. l7 l! ]0 Y8 g
  12.      v[1]=z; 5 L; P4 j5 H4 m) Q! M9 U
  13. } ! d+ l6 ]2 A7 D( @+ |8 o1 ~0 B
  14.   
    4 A, o& p' s. u& g
  15. void decrypt(unsigned long *v, unsigned long *k) { 9 y# Y: d1 F0 F( P! I
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ " y1 u( M) T9 `8 R  j
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 8 Q, F/ R* p# O0 J% X# K/ n8 x5 A
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 4 c! y  u4 ]0 f* C( u$ h( N
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ $ @3 d7 v  C9 ?, W. K7 s
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # F' S6 |& B* B& o& j
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ; p, @) P# c5 N* Y/ r0 ]6 B6 X
  22.          sum -= delta;                                /* end cycle */
    & ?/ b: s  b& g. c9 |" {$ G: i7 [
  23.      }
    2 u/ ?4 e# a! Y4 S0 p0 {
  24.      v[0]=y;
    1 b# c7 d" a0 k$ @- t' S3 e/ q& e
  25.      v[1]=z;
    6 L( P/ Q" f6 H
  26. }
    " e7 X  t1 s% W
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
, y6 @# l3 X$ M" Z2 I5 d#define UTIL_H " ~: g" h7 K& r4 z

: d# k7 j9 N* i4 z: `; s( J#include <string>
6 }% [; @, S4 L# N" u2 X" b#include <cmath> $ ~2 W) e5 @' [: Z3 n' Y
#include <cstdlib>
1 n1 q% z3 `$ V) |) g4 x- t8 v 9 {8 ^! M) H( s; Q/ M, S9 |  U
typedef unsigned char byte;
9 N1 m4 Q" |) V# ~( atypedef unsigned long ulong; 5 ?( C9 U2 ]* o. M" c3 y" u+ t+ F
* m' N0 F- r* ]2 E7 y# \% R
inline double logbase(double base, double x) { 2 z9 B" C# C2 G. D( t2 Z7 V6 ]6 u) ?
    return log(x)/log(base); 9 ]! D  H. n9 h$ C
}
& x6 b! I# C' h# D, s
4 r  e- ]( D4 m/*
' D6 E" u# g5 {' P! q4 ]; D& Q*convert int to hex char.
; z; M, s+ ], I# y2 g*example:10 -> 'A',15 -> 'F' 6 X' v1 ]; }; L3 _# A0 m
*/
# @1 r+ K9 k- Wchar intToHexChar(int x);
7 f  T$ E$ b  S5 w0 Q/ N- Z& p
# D! B3 N* k5 k: K$ x. Z& S/* 3 w) a' g; Y9 M$ f0 W) I) L
*convert hex char to int.
! m. w3 H$ n2 X" Z*example:'A' -> 10,'F' -> 15 4 g& [, ~# w; Y
*/
9 G: o- t4 R4 X1 M; i# i) pint hexCharToInt(char hex); * `6 V" s3 f9 M/ f) F

+ c3 G4 M( h; Vusing std::string; 5 z7 F; M1 j, e
/*
; O+ V/ @' E7 f# }/ X- p7 z7 g*convert a byte array to hex string.
8 _$ e% W  F: @; m3 ~*hex string format example:"AF B0 80 7D"
- d# Y3 {" P+ @) T: x*/
  w4 ~! J, T( ostring bytesToHexString(const byte *in, size_t size); ( c9 e' @: A. y
3 u& o/ |7 H6 f8 E  ?" \
/* % a! A+ \# ]* Y: U
*convert a hex string to a byte array. ! Y, q% R4 Z! A3 d
*hex string format example:"AF B0 80 7D" ' n( C3 F  ]' A) d
*/ . ?7 B/ n1 M' {2 @4 E( H4 x8 a
size_t hexStringToBytes(const string &str, byte *out); 3 V2 q% j- ~+ a1 ?( i) }. B$ i

! _; `- ~- x( ]( d" y9 Q5 r#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 2 o" |. ]0 g) i! C1 J+ w, t
#include <vector> 7 F- n, Z8 V+ w9 F, u- H6 [

5 X, ]- R3 Z4 k/ v7 uusing namespace std;
/ c6 ?! n  R' y+ ^ - U1 ?7 q2 g. a3 H. D* d4 w
char intToHexChar(int x) {
4 j+ ~- v1 _4 S% V3 h! I    static const char HEX[16] = { 5 H& n5 m% e! H# t
        '0', '1', '2', '3',
* V: T) F5 ~6 S1 p        '4', '5', '6', '7',
  z! L) _0 c9 m& O        '8', '9', 'A', 'B',
: W# n( O0 l) j- k/ e        'C', 'D', 'E', 'F'
" y$ z5 T2 E0 n! b/ ^$ D  E0 Q5 N    }; , U) `& F* D) D
    return HEX[x]; ( [, j3 n# a3 {6 k9 B
}
" M8 I/ @; l' u. p3 e0 ?7 `) R$ I 4 d$ W% m5 Y5 G9 R3 Q2 l, [; z
int hexCharToInt(char hex) {
* X1 p6 x  O2 M4 S0 f# G4 U% n    hex = toupper(hex);
/ s6 S9 S% y/ ^3 \! t    if (isdigit(hex)) # a% u5 p7 b5 ?+ U' O3 k. J$ u4 j
        return (hex - '0');
- n8 a# b1 j5 _; A+ Z* z) |    if (isalpha(hex)) 7 F1 n1 f- [0 `+ |  ]+ b% O3 i2 X
        return (hex - 'A' + 10);
! m7 f0 d/ }; N! x. k    return 0;
0 y! n; V8 C5 ~5 @/ q9 A}
5 U7 k) b  T: m. _1 V% E
' O3 s! d$ e& w& J8 w* A! [string bytesToHexString(const byte *in, size_t size) { $ ^& o8 o" D' p/ j
    string str; & r4 a' Z5 A' ^) U6 [
    for (size_t i = 0; i < size; ++i) {
$ f. h3 D/ K, w        int t = in[i];
) l- c+ ?2 d3 }6 f8 Z        int a = t / 16; ) o% q% v3 K4 q& X7 q1 s* S
        int b = t % 16;
  j/ x! }6 z- Y9 \# Z4 D        str.append(1, intToHexChar(a)); 3 D- I' B. x+ r
        str.append(1, intToHexChar(b)); 0 ~$ {; \" D4 v% ~3 ]9 V& M5 r
        if (i != size - 1) . z- ^2 P5 l3 w& @0 V# r  i" G$ c
            str.append(1, ' '); ) s$ B' {% `8 {  }0 h
    }
: r% i, U/ ?3 ]7 T    return str; , O# Q. c, ^0 t; @9 \2 s% h$ r' }
}
* q7 t7 l' o5 g. P1 ?+ \$ t6 u9 h 5 q+ U: l: \7 H. k, ?
size_t hexStringToBytes(const string &str, byte *out) {
) c% P& |# P% N( }+ g
2 P% v3 Q* F) ]5 d+ N    vector<string> vec;
! l6 `8 n0 ^8 a0 J: ~3 @    string::size_type currPos = 0, prevPos = 0; + i6 \& G0 R% f, N+ H6 K
    while ((currPos = str.find(' ', prevPos)) != string::npos) { / e0 U$ p9 W% G2 ~
        string b(str.substr(prevPos, currPos - prevPos)); % P9 ?( ~3 b8 m+ Q* H" _
        vec.push_back(b);
( |* w6 O  y2 ^4 `. k        prevPos = currPos + 1;
3 @. u5 r. U4 g8 l7 ~    } - O$ C  G! w" H7 b
    if (prevPos < str.size()) {
( v% a. z) V$ N, [- k& e- Q! R8 @        string b(str.substr(prevPos)); $ K0 L( U. q1 g4 s6 q  c+ H
        vec.push_back(b);
3 ?1 }2 ^( w3 d9 m& b6 O    } , w. U* z! p0 d' B. x. u
    typedef vector<string>::size_type sz_type;
) \& c9 z, ^* G    sz_type size = vec.size(); $ q; }# X7 k" E+ B+ ^
    for (sz_type i = 0; i < size; ++i) { ; d- d$ M% f; g$ L) [! z0 `; \" J6 [# B
        int a = hexCharToInt(vec[i][0]);
& ]" h  r/ e/ I7 D. \% i        int b = hexCharToInt(vec[i][1]);
! `- q) X4 S; x: P        out[i] = a * 16 + b; % ?" N$ H: Q9 B% ?. ~1 ^% L* R+ H
    }
# K. N( i# a& N1 U2 _) ~    return size; $ \1 r5 y1 Z" y7 N( I
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 7 q# s! E$ o3 y- R7 v% C
#define TEA_H   s0 U5 n: [6 b5 O. ]8 {7 B
' C) W$ A, J1 P2 L3 y
/*
. C& i/ B# Z* `" m*for htonl,htonl , v3 w; j: j: Y7 G$ S) _6 y5 G
*do remember link "ws2_32.lib"
+ |2 I9 O" i  l*/
7 y0 H) c* c4 v1 I" g#include <winsock2.h>
# b; S+ n6 A' C, _  w) I5 D#include "util.h"
& H" c4 C+ A7 R* {* G! ?/ f! a8 O
" \9 J8 p: W/ \. l6 P4 G$ c3 nclass TEA {
( h$ _  B! y  P4 _: cpublic:
% E. S; T- n9 B/ y+ |    TEA(const byte *key, int round = 32, bool isNetByte = false);
& l6 z9 X8 f  D( e    TEA(const TEA &rhs);
# a' i: j: Z5 N    TEA& operator=(const TEA &rhs);
# x5 ^& N% h' C' J+ k9 G' k    void encrypt(const byte *in, byte *out); * X8 K; f" q# S2 g+ J2 e
    void decrypt(const byte *in, byte *out); , h$ Z8 J; ~- _
private: ; H: `! t) }$ _5 p
    void encrypt(const ulong *in, ulong *out);
! v! ~' T" s7 M8 c2 x    void decrypt(const ulong *in, ulong *out); , P3 q& `: Y$ k1 \8 E6 W3 p
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
- N2 o7 A( _' c% P: ~2 l, X    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
' n  i7 D. a# x/ Y( x# V, Tprivate:
9 H2 |) m! y' _. A. Y- v) K    int _round; //iteration round to encrypt or decrypt
+ y- h2 C; O: w1 g+ d+ w6 ?. I5 I    bool _isNetByte; //whether input bytes come from network   {  d" ^6 S1 g: Y# E0 r
    byte _key[16]; //encrypt or decrypt key : w4 v% m% n2 n! Y0 x! M
};
8 y; x# O* A, p; k2 e" P, D, y3 V 5 m* s) t  I2 ^1 G1 E( x$ c- c; v
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ) m  H* z9 T, x3 i
2 #include <cstring> //for memcpy,memset
6 _$ L$ i2 }1 \( U. {$ a 3  
3 v3 k+ ^; M5 s7 p/ ^+ ] 4 using namespace std; # H+ i# z. M; F+ G- [8 ^: t7 u1 p
5    U3 }8 v: U4 J9 z  d2 E0 @9 Z" V# z
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) + T9 a' U6 N/ r& B$ E
7 :_round(round) " L/ E$ {8 D7 D  M9 D- T2 w0 n
8 ,_isNetByte(isNetByte) { / q6 j% s: O1 w( l
9     if (key != 0) ! D0 y  V0 b2 D% k, _
10         memcpy(_key, key, 16);
: P! S# {1 `5 g: C7 K11     else 3 I; F9 Q- k( ~8 G. B
12         memset(_key, 0, 16);
" W3 l0 Q! o7 ~  s* Y13 } % W; A. F9 R1 V  {/ J
14  2 x! \: P: Y* P1 B) t" @& H
15 TEA::TEA(const TEA &rhs)
  m# W3 w# b/ \+ g16 :_round(rhs._round)
5 k$ P- T& o, c" r17 ,_isNetByte(rhs._isNetByte) { 4 ]- t2 i  D& o
18     memcpy(_key, rhs._key, 16);
9 Q" m( x/ d% b4 D& o  @% u8 Y" a/ r/ c19 }
1 d9 w! A6 U: [, t, D1 w7 R+ O+ P) r20  5 g: M9 L% T) L  p2 H# s1 o
21 TEA& TEA::operator=(const TEA &rhs) { 3 ?0 }& F, [; F
22     if (&rhs != this) {
( O: j7 ^: Q, {/ u. h' o) ~; h3 D23         _round = rhs._round; 6 T3 _0 [! F" O
24         _isNetByte = rhs._isNetByte; . ^5 ~4 d. c/ ~' C  N
25         memcpy(_key, rhs._key, 16);
% O" ]' z' h+ Z. ~" o26     }
* K; G: U, u6 i+ Y* W( c: n/ R  S27     return *this;
  D7 X. V8 Q' P5 H3 n9 T6 A% ?28 } 9 d- u2 P' R5 s( A; x; R3 ?
29  ) }! d5 V& R6 f( J( n3 R& V1 \6 d
30 void TEA::encrypt(const byte *in, byte *out) { . x/ [* L; R$ G- p) k
31     encrypt((const ulong*)in, (ulong*)out);
, Z; }& O" @4 R' z6 L32 }
' q. {8 C  n( @) `# K2 k4 ~33  ( k* S% z8 f# d0 _0 P" M, l
34 void TEA::decrypt(const byte *in, byte *out) {
% {' C8 Q# y, F5 |) n35     decrypt((const ulong*)in, (ulong*)out); - _) q, V7 F! q1 y
36 }
7 v- y4 `; X7 ~, f% G3 k5 j37  
! O2 ^. m/ _# r" \7 G% E38 void TEA::encrypt(const ulong *in, ulong *out) { 0 W5 A9 @8 S" ^; G
39  
, ]  |, ^3 y2 g4 Q40     ulong *k = (ulong*)_key; ; n, e$ {" {+ ?1 |- Y5 J
41     register ulong y = ntoh(in[0]);
" T/ s4 A7 b7 c  L# [. K) M/ A7 J5 r42     register ulong z = ntoh(in[1]);   i7 I/ k! k: u* x
43     register ulong a = ntoh(k[0]); ! ?; g( T; d4 ?5 [7 U* q( g
44     register ulong b = ntoh(k[1]);
9 f5 l$ k8 ?0 H) e45     register ulong c = ntoh(k[2]);
' [& Y% N: i' o% Z. |46     register ulong d = ntoh(k[3]); / Z- {8 C* O, C, }: \/ u
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
* W% @. G* ^* q7 R, b48     register int round = _round;
* [! f4 }" t9 t  n( _, j6 [49     register ulong sum = 0; 3 U7 Q' l6 |. u* A' b$ o' J
50  
0 O6 g( t8 E9 r; N  L; [51     while (round--) {    /* basic cycle start */ : I  y9 u) Z. v' s( T
52         sum += delta;
" |0 n( ]  `  i; M. U53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
6 x+ b+ J$ \+ e, V7 h% U1 F9 i5 x54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ; j7 S6 w$ ?; l4 y! U' C' K
55     }    /* end cycle */ 2 {& @4 T: A5 p2 k
56     out[0] = ntoh(y);
: }' Q! v6 E' U7 {9 H57     out[1] = ntoh(z);
8 D$ ^9 j; R0 @( U! B9 P58 } ! Z9 Z$ D& B" a, F0 ]7 M- d
59    {; u5 q1 o' K0 Z+ v3 Z$ l; }
60 void TEA::decrypt(const ulong *in, ulong *out) {
4 x/ `! \# W  a- D5 h61  
5 k$ `5 I9 s+ @; u62     ulong *k = (ulong*)_key; 5 k  \- I8 J1 o
63     register ulong y = ntoh(in[0]);   ~) O$ Q7 B' l7 I( R. U
64     register ulong z = ntoh(in[1]); 0 N1 @2 |7 Y' P# C- O- P: k" S
65     register ulong a = ntoh(k[0]);
! z; k; m* g: r' @7 J2 B4 Q% O66     register ulong b = ntoh(k[1]);
# O3 N' K; V( f9 |5 \) {67     register ulong c = ntoh(k[2]); + v: a# V; ]6 a
68     register ulong d = ntoh(k[3]);
( O) y, T8 z3 u, q* Y69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
( q3 m9 R  J5 \, @70     register int round = _round;
$ n& e7 H+ J# H) U71     register ulong sum = 0;
" M3 ^, i0 w% \5 h6 `72  
% ~, R: E0 `0 E73     if (round == 32)
& v# H/ [$ @5 m- ]74         sum = 0xC6EF3720; /* delta << 5*/ # W2 O& A: T- y$ _' |: U. g' T/ V
75     else if (round == 16) , q2 t0 F3 X  u/ @
76         sum = 0xE3779B90; /* delta << 4*/ 0 _7 I7 x3 U. E% G6 g
77     else
4 T* `+ @# U8 T$ {5 s78         sum = delta << static_cast<int>(logbase(2, round));
3 C4 n- P( z. H9 n9 z9 s& g  f- O79  5 Z% T4 _3 }+ R2 M' _
80     while (round--) {    /* basic cycle start */
! H8 J& J8 J7 x( w' b) K81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , U# _5 `8 |8 r2 W
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( B$ @5 w* `& k8 h8 G8 p83         sum -= delta; $ ]# U, j/ B) N
84     }    /* end cycle */
" c' M; Z' v8 b9 R85     out[0] = ntoh(y); 2 U7 ^! C+ T% u9 z0 p( h( ]- K
86     out[1] = ntoh(z); " N/ z' E2 |" l9 _3 @  @; U
87 }0 U* e3 _. ~# K" k0 x; a- P
2 I8 N6 C# X* g4 V5 r
需要说明的是TEA的构造函数:
% \' D( z+ U5 I* y$ f- oTEA(const byte *key, int round = 32, bool isNetByte = false);
: t4 R  ?3 W2 S1.key - 加密或解密用的128-bit(16byte)密钥。
) t* g/ A. m5 |- t2.round - 加密或解密的轮数,常用的有64,32,16。 & O( k( f0 _  a: V" K3 J
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! - E& E6 w9 a! G6 P  V& ?8 \# a- B; }

7 U+ j8 a* h7 d) a; w最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" % n6 N  `7 m5 ^% R  o
2 #include "util.h"
4 ~- R/ K: r2 M 3 #include <iostream> ! w$ }' `( a8 v% y3 @
4  
9 s7 C0 \) v/ S' e 5 using namespace std; ) T. M% B* i( k8 q  M5 M
6    W4 ~9 F; x* y& M( M. a' e
7 int main() {
8 p& _- Z& F3 G% d, z- {" E 8  
7 Y4 N' _9 @( Y+ Z$ I 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
0 ~0 z5 h3 R3 y* h10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
6 R; z. c& H6 ~  N# [11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
8 ^$ [! e6 n+ ], D: q12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; % u7 k+ a" r, X7 N1 u, w
13  . Z6 D) P- U2 s# ^- n8 U# ~
14     size_t size_in = hexStringToBytes(plainStr, plain);
/ e' n* d# [8 A. Q/ Y1 M15     size_t size_key = hexStringToBytes(keyStr, key);
* q7 ^$ Z, J( p$ ]1 p16  9 S: i5 O9 r6 p6 A8 Q; k% f1 q9 L
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
  i7 Z  X1 S; t18         return -1; 8 }% |4 O3 V: s3 D
19  ( Q, P7 c+ M' Q7 X1 x
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 8 r2 j. g. M# A- J7 R0 I# T, K
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 2 ?$ X  a1 L+ @3 M9 j2 A2 Q+ q0 h- W
22  
. x9 T& W1 A  Y" v* w23     TEA tea(key, 16, true); 9 m3 I6 k. L8 K* N
24     tea.encrypt(plain, crypt);
. ^! S; ?7 m- i" ?$ j8 g25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
6 T; ~  S6 |# I, U# y26  ; J6 O, ?4 }+ }, ?! ~' b; C+ Q
27     tea.decrypt(crypt, plain);
1 \( G# N) Q  q( W( ]' Z28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
8 D/ O0 x& N5 g/ {7 F$ N29     return 0; * D: v) u$ X) B# G- A7 D( X
30 }
8 ^7 k8 B  d, {: P+ I" r4 p$ ]7 t5 y& x: b0 u
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
; f/ K$ n! N9 E运行结果:
* N  b) R7 ~- w1 b; ]Plain: AD DE E2 DB B3 E2 DB B3
5 L1 k' S8 g5 w% j# g5 @) z+ yKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 1 W- j4 Y2 T9 i2 j/ T
Crypt: 3B 3B 4D 8C 24 3A FD F2
" Z+ e( f- ?/ T- }( n* i( h6 IPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 22:09 , Processed in 0.021740 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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