找回密码
 注册
搜索
查看: 37366|回复: 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轮):
# B9 n+ _" d9 W. a, @, L! n. g微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 " n. T  {4 U% J# {. L* [6 ?9 |
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
, X% B* e2 W: J; m0 c9 M& K# |之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
7 R; X" W! M9 D$ ~在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ! Y, w* }6 t4 i0 ]/ ~$ }1 {. h9 c
在 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 z' [$ @+ r* i4 c/ S$ ]$ V
  2. void encrypt(unsigned long *v, unsigned long *k) {
    2 K) k8 F* N7 v6 L4 k5 ^, C. U
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    * j  |, _1 n, _, b5 U
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */   `  X0 c0 k3 C8 g5 J
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ . S  q/ {) {, \) p# Q! l
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 0 V/ e5 X. b$ p/ S* l
  7.          sum += delta;
    # y! e% p/ E: R" B7 r* |6 X
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); : j1 M3 j, h) B" [
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    5 d* x7 O6 {  M3 f# S9 l
  10.      } - O; B$ m3 Q( e. o/ e  O, q  V
  11.      v[0]=y; . C0 O3 c) T4 x& Y# h/ q; ^# p
  12.      v[1]=z; 2 I0 j+ F+ i, j. l; [: W& l
  13. }
    - s/ G7 u4 S' ]! Z2 C
  14.   
    & b7 q$ r& @8 e; d
  15. void decrypt(unsigned long *v, unsigned long *k) {
    2 m- x/ f2 T( K( U
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ( L  `; A4 P" C3 Q4 r1 ?
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 0 b; F. [& @- m% t# I" g# O
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 7 c* v8 {8 R6 o, \8 Z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ , V1 m. |: m- I" R
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    4 ?/ k6 a  w5 Q
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    / T9 C& I7 N4 e4 d- Q; l# ]
  22.          sum -= delta;                                /* end cycle */
    2 L0 x: k8 o8 N: \8 m6 Y. f
  23.      } & }1 @$ r0 M6 [
  24.      v[0]=y; 0 N, J3 v( |! {
  25.      v[1]=z;   X" ~/ u7 i, T* q! y, f
  26. }0 y5 v8 H( F) Q' [! o
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H " p# c% f! V4 n! l7 D! ~
#define UTIL_H
* `7 f- S( H- l6 o% w6 G0 a) w  Q: |( c+ \- B
#include <string>
! W: c) K' p& w- ~4 Y#include <cmath> , A  Z- i! D7 J- X
#include <cstdlib>
9 h/ `; Q: x, S" H# Q# F7 s! L ! @& T0 Y( ~# Q8 @" v
typedef unsigned char byte;
. r2 c7 M& M) ftypedef unsigned long ulong; 5 h% F% R% e5 m; Y5 f* g; S5 Y
1 g1 j7 o- E) v4 v8 O% N
inline double logbase(double base, double x) { ' O. k! p6 Q8 Z4 d
    return log(x)/log(base); ; i0 e5 P& x9 G) q9 u/ k. }: e( j3 w
}
  P" Q3 b5 m' m7 d* X 6 B1 @5 P7 q0 [* g' f! O
/*
2 D9 j$ w% G; c* k2 H$ ?5 D' k*convert int to hex char.
$ D. W! b) o  j& h' X! \*example:10 -> 'A',15 -> 'F'
2 e& m' u% K; {3 p8 M*/
+ S: B) n9 Y0 p. a8 d+ _7 R/ ochar intToHexChar(int x);
% h( h4 [/ L9 R4 U) f
7 D1 |3 A' \; M" f( p9 l& c/*
2 h+ C' n  D% Q+ s$ l) C8 r*convert hex char to int.
4 z, k3 _/ h" F7 j*example:'A' -> 10,'F' -> 15
! Q3 X: Q" @; G" f$ D" p2 n*/ % s8 ]7 l4 |2 I. _
int hexCharToInt(char hex);
5 e* W% E* [$ |# T- Q# a0 M
  _. `: l) N8 x; S; ]( uusing std::string; ' K, e2 i1 R5 m/ [* f" B
/* ; G4 N9 M6 J  `0 P! E
*convert a byte array to hex string.
: h' ~5 M8 }  V0 u/ n*hex string format example:"AF B0 80 7D" 4 o6 A. a* ~+ K' v9 J
*/
8 Z( R4 ^7 G) E1 T9 x7 @* r! X  p* nstring bytesToHexString(const byte *in, size_t size); & F' U+ E) n( ^" Y) E7 N! F

7 N: C5 h8 n" G1 N  W5 B" V/* 5 r  m, h, L* W
*convert a hex string to a byte array.
9 j- v5 m( f3 \% L; q& Z0 d( L*hex string format example:"AF B0 80 7D"
4 Q* W, V$ ?, f( r* o. w9 D*/ ( z- S$ q+ g7 s8 i1 G7 r/ P6 ~6 V
size_t hexStringToBytes(const string &str, byte *out); * d; i: j  C' ~" O; C
8 Q& }2 D' k/ U% }& ~! [& c; c; W
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
$ R; A* Q: ^) P2 B$ b#include <vector>   D( H; q6 A# h4 S& ~
0 e# G( f' R" F( ]' d
using namespace std;
2 B6 L7 K& a4 \ $ \: e+ L5 t( j! P7 E
char intToHexChar(int x) {
: @# {" o; j, n) ~    static const char HEX[16] = {
, D7 t" S. g' ?9 z! J' Z$ K        '0', '1', '2', '3',
) b! V# u& b( l) \' C        '4', '5', '6', '7', ; B( H/ [' {! u  V# R7 V
        '8', '9', 'A', 'B', 8 }: S+ x$ z1 l9 W
        'C', 'D', 'E', 'F'
" f& r! Q  y7 F# N    }; & d3 B( P" w- L& s
    return HEX[x];
4 h1 ]2 {' S" T9 N) `} ( J6 `! {) V- q% |- }2 |9 x  ^

" R  H: j9 H* i8 K, ?int hexCharToInt(char hex) { , r/ i5 c0 Q# Y5 J/ M* E% E0 `
    hex = toupper(hex);
9 |- D" C5 m" d/ c( b    if (isdigit(hex))
& C) Y+ [6 l- N: u4 O9 q) @        return (hex - '0'); : u5 d( W. R+ u  `; n( k7 ~, I
    if (isalpha(hex)) % f& Q# Q( H& `  ~' t6 k
        return (hex - 'A' + 10);   s2 q/ z' h2 j! C
    return 0; ' ?$ r/ }; @  l/ \3 D5 M4 g& c
}
; W/ ]" h8 j* O! [% G) R) C . ^, |4 J( \* V% x. |) ~' F
string bytesToHexString(const byte *in, size_t size) {
; o" l& b8 J* g( D. k+ {9 @! _    string str;
) K+ Z$ H, t* c% x    for (size_t i = 0; i < size; ++i) {
$ O4 q" ?3 t7 U4 F) B        int t = in[i]; ' Q2 f" v% Z1 S6 k7 W2 e" y' U
        int a = t / 16; 7 H9 h) p7 l# B7 w5 I7 y
        int b = t % 16; 4 o3 ~$ R1 ~" }; B4 w; e- V" U( `* N
        str.append(1, intToHexChar(a));
9 j# c; u. }6 p: B! R- ^; \        str.append(1, intToHexChar(b));
5 |8 n" _  b" q% T        if (i != size - 1) 1 |4 V2 }6 h& F& u. k# j
            str.append(1, ' ');
" V7 A3 N' r5 V: F% o$ B    }
' W% Z# m- N. V" R  t9 U, V    return str; ' b* M8 q5 T$ L
} 0 H& Y) \9 W7 K

+ i7 [1 Q: l' dsize_t hexStringToBytes(const string &str, byte *out) {
5 c' `* h+ z3 x; Z 6 _* z- O6 w! q9 ]8 z
    vector<string> vec; . R& n8 R# w# G* A3 z
    string::size_type currPos = 0, prevPos = 0; 4 W8 b0 e2 I8 H+ H/ ]4 V# d& w- A+ V
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 0 @# ~7 O  {. K
        string b(str.substr(prevPos, currPos - prevPos));
& G; R4 x/ \1 f, m2 K        vec.push_back(b); 7 ~# N% j4 Q5 ]! x' W8 U
        prevPos = currPos + 1; + Q# T# M- p# |) k
    }
$ J3 c/ ]3 y. z! F+ C% W    if (prevPos < str.size()) {
5 c3 L5 F. q2 Z  |( H        string b(str.substr(prevPos));
' e2 |* Q' M- N2 h, e        vec.push_back(b); . h! j+ }4 A9 b- j1 f
    } + G0 x; b7 y5 m1 z7 Y$ k. p, g& ?
    typedef vector<string>::size_type sz_type; : Y6 Z/ _: ^  T6 @, ^$ G
    sz_type size = vec.size();
5 k- v$ }* b! p0 D! p    for (sz_type i = 0; i < size; ++i) {   f$ U7 y3 v5 U  m7 a( J2 h- r
        int a = hexCharToInt(vec[i][0]);
2 ~' u: }1 N! Z# A6 P2 \( g6 h9 Y' l        int b = hexCharToInt(vec[i][1]); 0 V3 D$ T& t$ _0 D5 m. y5 ~) C
        out[i] = a * 16 + b;   Z0 Y$ u- m/ }) k
    }
, s' y$ e+ ?* q    return size; : P  K( D/ W# p5 ^# u5 t
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H + P8 d' M1 k: v9 e
#define TEA_H ( s3 x8 h3 x' a/ E

1 L% Y9 W& R- ^) l- m5 P4 u; ?/*
1 a  [- h$ J. S*for htonl,htonl - o, N( O' |$ P6 Y- j
*do remember link "ws2_32.lib"
7 {! Z- v2 {& z7 ^7 E2 A* S*/ : `/ o- i7 ^6 z1 U8 U1 q
#include <winsock2.h>
5 U6 Q% |$ G( P& N2 O#include "util.h" ) u: w- D! U+ ]& J0 v
8 _3 @1 }% l2 o' c5 C& z% N% r
class TEA { ' s: e) s( v5 j. b( a' \
public: ; b% ~0 P4 T4 |3 n# J6 j
    TEA(const byte *key, int round = 32, bool isNetByte = false); : n2 I' \  R) T8 V2 ~3 q% b  d
    TEA(const TEA &rhs);
: @. u2 z+ m% A    TEA& operator=(const TEA &rhs);
8 n' r) X1 Z6 Q" q, }. M* q0 j, q    void encrypt(const byte *in, byte *out);
7 I: ?; K/ P( E# ^+ f- t, B1 i. v    void decrypt(const byte *in, byte *out);
" v: ]! z- X8 b- ?/ k$ v: Oprivate: ) ^1 ~7 D" ^- w0 u  M" V
    void encrypt(const ulong *in, ulong *out);   Z* X5 D" a1 S" W6 ^& H7 a
    void decrypt(const ulong *in, ulong *out);
* @9 _4 T$ ^. R" c0 U    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }   V% `; Q& L1 ^' p/ Z
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
( F# Z' w8 x$ P& j* U, Mprivate: : A7 s, w! _& l' o
    int _round; //iteration round to encrypt or decrypt / U* @: }) {/ l1 k5 N
    bool _isNetByte; //whether input bytes come from network ( b( X4 x9 j* _( w# L3 D
    byte _key[16]; //encrypt or decrypt key
: M3 Q& N* D+ i! k}; ! q8 w* F) }! R* p. Y3 O+ u
) t" {2 h/ `' k) S; F
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
5 X: b- x1 X' \6 u# b0 L% z7 n 2 #include <cstring> //for memcpy,memset
6 r2 q9 T+ i3 R$ o$ v; ~+ v' ] 3  
  @; M$ B3 ~2 J0 N9 O6 Y; M' d 4 using namespace std; % d) a: P( q# z  z0 S
5  
" c, q3 y3 j5 i: I( | 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
# M% {. P' m7 I+ ~8 e6 J/ ` 7 :_round(round)
5 \- ?/ T; z- _ 8 ,_isNetByte(isNetByte) {
5 W- U" S+ `( Q/ h- ~ 9     if (key != 0)
) R, D. F8 W1 [10         memcpy(_key, key, 16);
6 [5 d6 g+ l" j* Z4 m11     else 0 M( O7 h$ h  c  s9 f5 n& p
12         memset(_key, 0, 16);
& R) ?6 j% G6 w; J0 t; m& z13 } $ ^3 S5 g2 P3 y" T3 O) `
14  
  r4 q# a: e* J7 y15 TEA::TEA(const TEA &rhs) / F2 V8 y7 k( T* ?7 A+ u* E
16 :_round(rhs._round) 8 P6 ?2 R& J  ]& {, J! Z7 h) A
17 ,_isNetByte(rhs._isNetByte) {
" N2 ^! s9 v; S8 L2 k6 R18     memcpy(_key, rhs._key, 16);
) x* ^( u" ~) R+ h( P0 @19 }
- W% w+ s" r1 L2 q) d! }20  
9 B" K* ~( l9 s7 ?, S; M; M21 TEA& TEA::operator=(const TEA &rhs) { 3 [7 ]5 T& [8 R
22     if (&rhs != this) { . I5 O, u' a5 U/ t4 i! l
23         _round = rhs._round; # |+ H& i5 s  R7 O/ c
24         _isNetByte = rhs._isNetByte;   {& [3 x) f6 h: P$ ]- X2 r1 Z6 O
25         memcpy(_key, rhs._key, 16);
1 l& }7 O3 n- R* i4 u3 [26     } 7 l6 p3 Q; k+ J" |: G
27     return *this; ) d$ q+ O  \0 y3 s. ~
28 } 1 ?1 y$ K2 B: c( x
29  - H8 K% {0 Z# o1 `( U. M7 d
30 void TEA::encrypt(const byte *in, byte *out) { ! l" ]/ {% |5 Y+ L0 ?5 X9 {" }
31     encrypt((const ulong*)in, (ulong*)out);
4 _, V7 _  Y; z32 } 9 A& U1 W3 q) R) w& H
33  2 r* {% X; L" g- E6 D
34 void TEA::decrypt(const byte *in, byte *out) { ( l+ A( o3 X& s. p* z! F% Z! a; D
35     decrypt((const ulong*)in, (ulong*)out); 0 d  g! |' U# k( Z. a
36 }
0 P- P+ d+ t/ e/ e! u8 g# A/ h37  
' H& s3 K% x- w& m) M- ^5 j: M38 void TEA::encrypt(const ulong *in, ulong *out) {
" v$ c; C9 V) X39  
! x8 Z( b* m! h: F40     ulong *k = (ulong*)_key;
# W# Y  Q( B7 T) w4 @0 `' \7 L41     register ulong y = ntoh(in[0]);
9 G* {: H$ y6 ~42     register ulong z = ntoh(in[1]); 3 @& y) [  |) ]+ }5 M
43     register ulong a = ntoh(k[0]); 0 g( k( w, [7 G( j( B) E
44     register ulong b = ntoh(k[1]);
& p: T0 i6 ?/ \: b; `  w45     register ulong c = ntoh(k[2]);
; v) [0 g- c% h4 b+ e3 m; H( K' j5 k1 y46     register ulong d = ntoh(k[3]); $ S! y5 `* i: z$ x
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
% D' K: B% j" d# O( d9 x48     register int round = _round; 5 H6 d2 z9 v( g2 [% K0 v7 x" G. H
49     register ulong sum = 0;
' n% [, ?! V+ z9 {- r0 b) t3 N50    g: U2 I2 p3 m$ R
51     while (round--) {    /* basic cycle start */ : x) k8 G8 x; R' X
52         sum += delta; " s& x7 \/ B+ \$ ^: f  L
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
7 M# U5 i( X* N8 h% m54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); / w0 Q/ `- J1 U/ v; s) p  a6 |+ ?) ^
55     }    /* end cycle */ * [: u  g7 D* \4 L3 |+ E
56     out[0] = ntoh(y);
2 j! _% n/ R, D! I$ |57     out[1] = ntoh(z);
2 c& U; v% Q5 @7 R58 } : c7 w: A# G  [% w! u4 }: `. H4 v
59  ( Z- W9 @( H- V4 ]; o" ?; B
60 void TEA::decrypt(const ulong *in, ulong *out) { 0 s5 M6 _2 \" Y$ g; v7 w
61  0 D7 `+ X/ e# \2 M) \5 {9 J/ S: I
62     ulong *k = (ulong*)_key; 1 C% N- C/ }/ w; K' z# c" {2 G! R
63     register ulong y = ntoh(in[0]); 1 C+ Q( Q7 P2 ]
64     register ulong z = ntoh(in[1]); 1 e0 P, z, p& L9 _  ~
65     register ulong a = ntoh(k[0]);
; q& u$ s5 n3 O2 Z1 K- h66     register ulong b = ntoh(k[1]);
; h6 \& I5 J. L1 k+ A) Z67     register ulong c = ntoh(k[2]);
8 F- m5 A& R+ h2 x- K2 s% @68     register ulong d = ntoh(k[3]); 8 c7 I2 ]9 z& Q- K2 o
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ . V6 \$ H5 {; y* \2 s. L, ~% _
70     register int round = _round; # P; m1 a4 R. q/ Y0 w7 r# b# \
71     register ulong sum = 0;
9 w5 [1 E8 k# M2 ~7 D7 k4 q% x& y72  
) \; q" D" u6 w' D3 A/ r73     if (round == 32) & k: [( s  ~6 u& O+ u
74         sum = 0xC6EF3720; /* delta << 5*/
& {, M- u# P7 b' r6 y75     else if (round == 16)
* u: D0 H5 j- A# c1 |3 ^76         sum = 0xE3779B90; /* delta << 4*/
# u: M4 G7 q  b5 m1 Y* d. W$ H77     else 7 f* X: q# N' m' F& U% Y3 a
78         sum = delta << static_cast<int>(logbase(2, round));
! X( L; V+ B7 k0 T$ q! M% \79  
% c4 `; B! l1 O( h% V; _80     while (round--) {    /* basic cycle start */ % Q# {8 Y& |% F7 q0 a$ ^4 H
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ; H! ], i, D6 f8 o0 s' o
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); " ^  J5 R7 @2 u( |% R' @1 o
83         sum -= delta; ! X* W9 O1 k' @  k3 K( P& \5 I
84     }    /* end cycle */ ; T  w# W" A. t; ?5 X! p; Y, x
85     out[0] = ntoh(y);
1 }) H" r$ r2 r; B+ |3 F4 g86     out[1] = ntoh(z); + c& [' O' s: v% O  R" o) N" _0 N
87 }
5 {" z0 @6 |7 F. |/ u/ f3 L) f& D) R& u2 G9 y' \/ D/ Q1 X
需要说明的是TEA的构造函数: " y  O) R- x! [$ j7 M
TEA(const byte *key, int round = 32, bool isNetByte = false); " b( c5 N2 T  |) Y! X" ]1 \
1.key - 加密或解密用的128-bit(16byte)密钥。 : a2 u* i7 o4 |
2.round - 加密或解密的轮数,常用的有64,32,16。 - O' ?5 G! q3 D, f, S+ S1 ]
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! . G1 |: ~6 x6 P8 s' h2 C

* r, U+ `3 P3 x: I$ m" `* N最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
$ c5 v8 K# ?/ j6 p! z# N* ~- v 2 #include "util.h" 9 _8 F) `9 L8 o( Q* j( l3 e# P
3 #include <iostream> ' Z3 |/ b4 B4 w$ R8 K) e7 f
4  + P2 ]7 L: r2 T2 ^: a! _. G; Q
5 using namespace std;
1 B" [& z2 }6 R7 h6 B% V- k6 {4 H2 h 6  % H# s% r3 y! t
7 int main() { & X( P4 t! y. C7 h
8  
! h! `+ G! F# P% k& J5 c; a) s 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
( u0 W3 O, K1 I0 S' b# T5 F8 U+ F10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); % k# A( I$ l2 a. X7 J
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
7 r' P$ E# a( a7 r12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
# K9 U- y7 T0 a5 k0 c5 A6 }5 A/ Q13    U  N" R1 [% n: i* `
14     size_t size_in = hexStringToBytes(plainStr, plain); & v4 d- d+ R: k. b( \. I3 v! n! F+ L
15     size_t size_key = hexStringToBytes(keyStr, key); # v: ^" j7 j% S; ~. C/ R1 z
16  3 R7 x7 {1 P* l3 A5 a
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ' b4 i0 n4 i  e9 h9 F4 s# b3 |' }
18         return -1;
& E  |: b! E! w$ G  W9 v19  $ i4 Y! u# r" e& a7 ]
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; , b- q4 q/ }/ E( i0 ?6 M
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ; M% Y( m% q5 c! K9 s
22  6 Q. G9 P, D( t9 v
23     TEA tea(key, 16, true); & i  K  v  ]) Q
24     tea.encrypt(plain, crypt); . Y* [3 t/ K- b2 P1 K" |
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
) K0 ~3 k3 k' ~# F0 L26  , y2 k* v2 E( v( H
27     tea.decrypt(crypt, plain);
+ ?0 r: l& E& |$ O  ]28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; % K( ~( @* l) y) h) H0 ~
29     return 0;
1 F( O6 c" _! b& X30 }
$ c4 A% l1 j$ j2 m$ }! _2 j1 J% _! c0 @" B8 z
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
; L, f. p6 _$ g( T% U运行结果:
0 T; ], {6 A* U; P" R% wPlain: AD DE E2 DB B3 E2 DB B3
7 r3 `) _* h  xKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
" R5 d3 [& k( g! F8 ?( rCrypt: 3B 3B 4D 8C 24 3A FD F2 0 ~5 q' Z: M# e$ R
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 20:36 , Processed in 0.020024 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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