找回密码
 注册
搜索
查看: 37374|回复: 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 W! h7 N- e! i, A
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
" S9 ^! h1 V! Z" R* e) @% F# qTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
  _+ W9 O9 r" X; o+ e6 m. P# Q之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
3 T8 X0 z) }! x* l7 q8 T! a% Z9 m" Q在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
* l" f# {. C6 k( T1 x. O在 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 g/ \9 z6 a/ P' s
  2. void encrypt(unsigned long *v, unsigned long *k) { . O8 j/ \/ @7 P+ Z1 f' V- t
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    , E; K0 x( N: u2 z
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    : t  z9 x" j! n$ D' W3 m
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ( c5 o' `' J# F+ n2 |$ x9 p2 S
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 2 `0 W1 c' R$ N
  7.          sum += delta; ! h, l# W8 L3 ]6 j5 v
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    0 e1 B) E- O1 z
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ + C& _: P0 `8 c3 w& @
  10.      } ' H- o7 H! Z3 U  }' W! q
  11.      v[0]=y;
    3 d# J, `3 q3 [0 |$ Y8 `5 c  O
  12.      v[1]=z;
    ' m9 I8 h$ m0 e0 ]9 P6 i
  13. }
    5 Q! q. `  Y, _6 R& W$ m
  14.   
    . }& B. N& _% G; E) d
  15. void decrypt(unsigned long *v, unsigned long *k) { 2 y& c, j. G1 z; f- h
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ & e% @' t' \# {0 q7 R5 j" `
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 3 r  h5 H3 k* h$ `6 S1 h) U
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    " `! ~  f( W# m- H
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ + f5 P4 g$ U! r3 U% ^7 {
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); / L& k4 P, Q+ p$ p" L9 ?6 |
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ( S6 ]& v; Z/ ^0 H
  22.          sum -= delta;                                /* end cycle */ . S) M6 G/ p" T3 A' n: }" Z
  23.      }
    ( Q  a' W; _' s7 V* n
  24.      v[0]=y;
    $ S8 X$ ]. C( g& ?+ i# F
  25.      v[1]=z;
    " C- a# [! n; p" H$ h1 v6 `
  26. }
    , j- a- ~. B/ a# U1 J
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
, L' O9 J# W1 m, e# d6 T& E; D# v#define UTIL_H
' w4 x5 ]9 ^$ U0 K5 m+ b7 q2 x
3 S( O. a/ j& d- F- f1 y7 G#include <string>
: d% m$ b9 j! u9 c/ b# `% W" b#include <cmath>
4 N# C4 w- ^/ t; ?#include <cstdlib> 0 o2 t9 T# Q0 D0 i
( O( [9 s7 ~7 \5 b5 R
typedef unsigned char byte; ' E, r9 Y. L* J6 K! N6 F
typedef unsigned long ulong;
' X  [5 X& G9 Y8 t5 H3 J4 z
( q) l; D1 D5 P0 M3 e& Kinline double logbase(double base, double x) { 3 t) ]6 x9 n  F4 ]: {4 M) ]
    return log(x)/log(base);
! R, n4 l! O* d}
7 B0 q% y; F2 k! g0 }( D
  d: A4 X" Z* R7 X" g/*
. I: ~+ ?# F+ x*convert int to hex char. ' h; E1 d# I- j* f4 J8 s
*example:10 -> 'A',15 -> 'F'
' ~5 ]' x7 G  A9 l& B( F: }6 Z3 A  x*/ ' ~+ n3 c7 z9 W6 J: t& e3 N/ s
char intToHexChar(int x);
0 k) P4 v/ C" ~# i! m7 ?
# _1 ]- w( D3 G* X( x8 D  [/* , Y1 W/ z' C. }  p) U7 m
*convert hex char to int.
6 z; S& c" b. C*example:'A' -> 10,'F' -> 15
' I' }0 D& m) Z! d' h/ n/ V# T/ G*/ ( U. `" _: E: @! d4 H
int hexCharToInt(char hex); - J6 ^" W( s( O4 T6 I

! q1 B' O- u) K3 `( m. u  Z" y, Zusing std::string;
2 f( U! K1 s  @/*
1 ?7 T# ~+ |/ q" w9 q6 Y; M2 n* A*convert a byte array to hex string.
$ Q! S) }1 _  l1 I( R: m*hex string format example:"AF B0 80 7D" % R, R. b! t, F' }: w, {- {- t
*/   X/ z: a+ i" }
string bytesToHexString(const byte *in, size_t size); 3 {7 u  r  P( H+ C

1 s* E! W( O6 \. z, P2 V1 h/ {/* ! B& F: f# W. p+ `  A
*convert a hex string to a byte array.
0 w% q4 k2 o2 V0 l*hex string format example:"AF B0 80 7D"
( M/ t/ K3 K% N, O*/
/ p" P( v# D) E# l; k6 Rsize_t hexStringToBytes(const string &str, byte *out); # E& L2 ]% t# w1 N

0 b% U  I1 L  o* d) }#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
) @' S4 @- @/ N9 V3 W: I) W#include <vector> " V7 @' v, N: {$ [# n5 l

9 b. B7 N5 Y5 c3 ^! s3 busing namespace std;
* I4 g4 v" X* [$ H9 l6 b9 n
0 C7 g; P' A1 d- h1 [( Cchar intToHexChar(int x) { 2 S4 }; _4 |4 I% n" W$ L7 N& {9 i& Q
    static const char HEX[16] = {
+ _7 t4 f" @8 f; v" a        '0', '1', '2', '3', 3 ]$ ^' Q  j2 \( A: }
        '4', '5', '6', '7', 4 l. r' x" {6 A( `2 ^$ G
        '8', '9', 'A', 'B', 8 G3 v1 Z: r9 B* W
        'C', 'D', 'E', 'F' 9 d" p; S9 M9 ~: s/ O
    }; : w9 \$ {4 M2 T8 K3 L, z/ I
    return HEX[x]; : W2 {% E3 I5 }: |* k% m* j6 ~
}
- {( r7 w$ K( a( R* E  A . L# T2 F/ d9 h  N2 {
int hexCharToInt(char hex) {
' g9 e! |. `6 g3 G9 s    hex = toupper(hex); 2 c. F/ o. n5 q& k
    if (isdigit(hex))
% j7 ]* x; P  O        return (hex - '0');
* q3 r4 r. D$ a& O    if (isalpha(hex))
0 A- `: v/ {) R* P$ z" e        return (hex - 'A' + 10); 9 O' H9 j3 S2 ~* o
    return 0; # u' l2 W4 X  ^5 f7 G
} - W4 W: d& q( A# a! A$ P+ Y$ Q) x

. M; S  E& i  [+ d8 Vstring bytesToHexString(const byte *in, size_t size) { # D( \; x/ ~6 e
    string str;
( N9 h# W: q0 R, i0 E    for (size_t i = 0; i < size; ++i) { 1 |4 v+ Y' [  ]* Z1 a1 w
        int t = in[i];
, e7 R6 d, }. b' N3 m) \/ }2 ]  `% b        int a = t / 16; 1 z! c5 h( ~$ U; D& i
        int b = t % 16;
6 W; Q' V" @: H, E5 _( P% A        str.append(1, intToHexChar(a)); / t, C" Y* x9 {+ M
        str.append(1, intToHexChar(b)); 8 Q4 |# T2 {% g. Q+ C
        if (i != size - 1)   t: K0 P6 q/ @: e' a; a3 F; \
            str.append(1, ' '); & L$ J4 T1 l3 P( g1 d
    }
* [) S$ W$ t3 j    return str; ; `, y( v9 S3 N8 z1 Y! L* J$ ?7 v1 l
}
  j1 x9 V" b7 L3 t: m3 D 4 \. E3 @7 t" s
size_t hexStringToBytes(const string &str, byte *out) { $ I) [6 g* Q5 R2 j, [$ r5 \

/ b! [0 g+ c9 X* M. E/ I    vector<string> vec; . ~. N$ W5 D, N" Z( D( \2 i
    string::size_type currPos = 0, prevPos = 0; ' c, Q4 X  U" Y7 v8 _+ O4 F: g
    while ((currPos = str.find(' ', prevPos)) != string::npos) { # E% b0 [0 M: y: v( G: g
        string b(str.substr(prevPos, currPos - prevPos));
5 ]. T8 W+ _& p! z        vec.push_back(b);
5 H, A2 B9 h4 F+ E        prevPos = currPos + 1;
& S% w5 z7 h) K    }
7 E: q) z( b( E* q    if (prevPos < str.size()) {
1 q! Y- n+ t2 F5 G* ^# _9 q" b        string b(str.substr(prevPos)); 6 Z: [5 g* a- U9 R% x" F' _
        vec.push_back(b);
1 \" O7 C  [8 v" X5 G3 a    }
% `) ]* q8 Y0 [    typedef vector<string>::size_type sz_type; ! N3 y' Q  z6 }
    sz_type size = vec.size();
9 b9 Y5 [# x2 l" z& O+ D    for (sz_type i = 0; i < size; ++i) { + s- ^' A$ H' b$ f
        int a = hexCharToInt(vec[i][0]);
. o) e) o' B  h& L. b        int b = hexCharToInt(vec[i][1]); 8 N" J* Z$ D- `4 T  R
        out[i] = a * 16 + b;
+ I0 q. t3 f2 V2 a' t% v    } 2 {5 U* h. c( \# @: x2 g- x+ l: |' f/ q
    return size; $ R4 j+ L" [- Y! q9 m! F2 f, u
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H # }$ B! Q9 A; s" W+ j8 n/ N$ D
#define TEA_H * L+ E( s$ K) s+ U  e
; `% L' `2 f& l9 Y1 }6 W
/*
* P" `) S  d- W9 K*for htonl,htonl 3 c$ U9 b* h; I
*do remember link "ws2_32.lib" " I" r" G4 b! {: t8 W
*/ ' Z2 w. r7 T5 I* h+ P1 a
#include <winsock2.h>   r2 ^8 d7 b7 g3 j& G% A( V. V
#include "util.h"
9 x: E# x. _6 j0 G
/ ^- e- x6 c) {9 l5 Z7 z! K1 bclass TEA { , I" x9 S  b% K
public: 9 i% ?" o# |: b5 [0 E/ }6 D9 X
    TEA(const byte *key, int round = 32, bool isNetByte = false);
7 b: L7 G5 g0 L" s+ w    TEA(const TEA &rhs);
$ N" e! }$ g' n3 }8 [3 H    TEA& operator=(const TEA &rhs);
$ y0 B0 V; `6 J# `- l1 R( W( Y    void encrypt(const byte *in, byte *out);
' _8 t3 N: T; [' E  h    void decrypt(const byte *in, byte *out);
# `% F" f4 x7 O, [4 m9 Aprivate:
& B3 ^0 G* `0 l8 \* B0 q, S8 X% l    void encrypt(const ulong *in, ulong *out);
9 i5 f! H) T/ ~& h; o    void decrypt(const ulong *in, ulong *out);
' A; Y3 }6 A2 C: d    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
; h, t# h, |! h3 u    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
" {0 r' }- T: }8 _0 C) s' bprivate:
3 w8 w1 ?/ E( L' `, D9 n" ^# N    int _round; //iteration round to encrypt or decrypt . L5 c% Y( I+ `5 x" j
    bool _isNetByte; //whether input bytes come from network
, W9 S# b" p) F6 V# _- ~) y    byte _key[16]; //encrypt or decrypt key 2 ^# E+ o+ y: m% o. p2 T) W# d  D* I4 ?
}; 6 G" z+ T* i' J" O
4 U7 H7 a" s, B+ S( y! e
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
6 h. F8 ?3 D5 k' P 2 #include <cstring> //for memcpy,memset * K0 G5 n3 T6 t9 i6 r2 E
3  
8 o# {# \' k2 I  p 4 using namespace std;
8 k6 o  [9 u; r3 I$ f 5  
/ m3 d" w% d' w$ }1 Q 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) / G& _( B$ L4 T0 ]- _
7 :_round(round)
7 e9 {) S7 H, Q 8 ,_isNetByte(isNetByte) { % b  O% p" L' l! J* P5 F$ O; a' ?
9     if (key != 0)
5 e( z( |$ Q! W; \7 Q. K4 G10         memcpy(_key, key, 16);
! b6 |+ S9 M7 L, ^5 U9 n# \, J11     else & {: D% n0 M; e" Z4 D  p
12         memset(_key, 0, 16);
& J" q; Y' U0 A; m13 } 7 A' c! \% I4 N  f. u' ]
14  . y1 z- q) E, v
15 TEA::TEA(const TEA &rhs) 2 m  H4 ^9 t8 F5 d# z
16 :_round(rhs._round) 5 Z- z8 j0 l1 S3 m0 J, U1 U/ x3 b
17 ,_isNetByte(rhs._isNetByte) {
% y; d8 k7 m) b: I18     memcpy(_key, rhs._key, 16); ! e. J  F0 v+ M2 T, C
19 }   ^" n3 v4 V3 e7 F1 O  L
20  
$ A6 w. S- R, `8 S  x' ]21 TEA& TEA::operator=(const TEA &rhs) {
* F/ Y, I9 q5 M/ ^6 a5 `. ]3 K5 z22     if (&rhs != this) { " c% v' e1 F& o, ~$ l; t
23         _round = rhs._round;
9 K0 F' h& J4 |- R/ k+ g) w24         _isNetByte = rhs._isNetByte; 8 B6 }2 @# q& ?" A0 Y$ d
25         memcpy(_key, rhs._key, 16);
5 ~: |4 Y) D- U+ F* H+ c! ~26     }
, ?, e- h/ i2 e$ @$ w27     return *this;
! ^% `( [) l) e1 j2 W( p, E& L* Z28 }
: W' \# ]4 H  x* p0 W0 n& s, \29  $ {9 W: j# P, |9 H# O) u
30 void TEA::encrypt(const byte *in, byte *out) {
( a+ }  ]5 l. {) s' {' A31     encrypt((const ulong*)in, (ulong*)out); / b) W. F* J( _; K. ^# F
32 } ' K; ]8 G! D. |/ @: s* F; X
33  
" e+ y! h5 {; a  S4 U34 void TEA::decrypt(const byte *in, byte *out) { " A6 J+ }) s. Y
35     decrypt((const ulong*)in, (ulong*)out);
* p4 I/ H9 M" A" W36 } 6 I8 L% v6 o3 y* S! R& k! T! P
37  * P* s: K) @! H3 b
38 void TEA::encrypt(const ulong *in, ulong *out) {
) f  ~7 k% t% F) b, i39  
1 R5 U8 t8 d1 D* t40     ulong *k = (ulong*)_key;
" i& q+ N( B' Q/ o9 t' S9 C6 {/ c41     register ulong y = ntoh(in[0]);   G  o, [( Y  y2 v1 {. w
42     register ulong z = ntoh(in[1]); 7 X+ b0 e' v. M* p& ^3 W
43     register ulong a = ntoh(k[0]);
1 f3 Y& G1 ~- w" T- b/ s44     register ulong b = ntoh(k[1]);
4 c/ }4 [3 R; ?  F5 Z7 U. p45     register ulong c = ntoh(k[2]); 6 }1 ?: m% y. c5 g% \
46     register ulong d = ntoh(k[3]); % w5 P% U+ h- d7 R( d
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
$ S' J# x) v% R' M& s( r. |48     register int round = _round; - S( m. r" V' a8 z/ U/ _( ?  G& a
49     register ulong sum = 0; . l1 N& X/ |* E6 F  |
50  - y/ a+ @. V0 }/ _9 p1 m
51     while (round--) {    /* basic cycle start */
* b. O) P, N$ J6 }* r0 I8 @52         sum += delta; $ V. p* w  ]" S' o. C" k& J
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); . v4 O" t: y9 |$ d; @0 w
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
1 d- t( [% q+ B1 f1 \9 J; m55     }    /* end cycle */ 9 N& f, V9 v+ x  R- U0 |. a
56     out[0] = ntoh(y);
# D; }5 [$ T3 h( B) B57     out[1] = ntoh(z);
9 F/ c$ ^) F. m% a" g6 y58 } ! f8 l5 o( w( r/ v9 E' O
59  7 o, u8 {( v  a/ H/ I- w  e6 @
60 void TEA::decrypt(const ulong *in, ulong *out) {
2 M2 y3 j, l- N1 _# Y61  ' V* M5 V8 g5 T+ D
62     ulong *k = (ulong*)_key;
! M) H. }4 `7 w! w* _7 m63     register ulong y = ntoh(in[0]);
! s  m0 s$ g. Y; e64     register ulong z = ntoh(in[1]); 8 ]5 C( x' E, k0 |; t; P
65     register ulong a = ntoh(k[0]);
$ t4 c* c, X! z0 k! }66     register ulong b = ntoh(k[1]);
8 A8 n4 J! O& i7 O8 {67     register ulong c = ntoh(k[2]); ! k7 l: y( c4 a" Z6 h" [
68     register ulong d = ntoh(k[3]); ; J) _; B8 e/ O' v( [8 c3 E4 U
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
% M. k2 ^) C. D- D/ D7 o70     register int round = _round; ) B6 K3 B' T9 o0 i, I
71     register ulong sum = 0;
- V) _% m, r9 K6 @( ~+ y72  
" w2 F" k1 M1 M: e9 d. a- `73     if (round == 32) & u. T& H# r6 p8 O2 ~
74         sum = 0xC6EF3720; /* delta << 5*/
. D7 N2 S0 v1 `1 H* B9 q) g. {4 e75     else if (round == 16)
) M. s' C# `4 Z4 E0 n$ t4 p6 E5 Y76         sum = 0xE3779B90; /* delta << 4*/ 1 G" Q/ Z  e: C9 y1 y6 {
77     else 9 t  ]: `& w' Y% v) r
78         sum = delta << static_cast<int>(logbase(2, round)); ( U: w5 n$ |, n2 J, T# }. m( j
79  
: }1 N  h- ]) ~( U4 g2 [80     while (round--) {    /* basic cycle start */ ; D4 y3 x+ s' y. u
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
# ~% g: t! p% |/ |6 v- \82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
' z* V  k6 X" G9 o  x5 J+ w83         sum -= delta;
1 R" @& w: K3 _  w9 h2 a84     }    /* end cycle */
. Y+ _( Y' m4 h0 S/ ^85     out[0] = ntoh(y);
$ U- G+ [5 W+ G  H8 {0 r86     out[1] = ntoh(z); : g( W7 J" O+ c
87 }; v6 y0 Z9 ?2 z% S5 |. E$ R
" J' V9 U, K/ p5 o4 h
需要说明的是TEA的构造函数:
( D7 T/ {) f2 cTEA(const byte *key, int round = 32, bool isNetByte = false);
6 D" T2 {9 o3 t) U6 s) Z% V2 f( K1.key - 加密或解密用的128-bit(16byte)密钥。
8 @# O! h8 f7 e0 R$ I8 _2.round - 加密或解密的轮数,常用的有64,32,16。 ) M* D- W+ M. q7 G
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
9 [0 j0 d; x  y
( f0 R: P1 t( W# _, \, A最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
0 L" M( |% S) ^, I  j- Z7 s 2 #include "util.h"
6 O: E. z/ v. d- \  \' u 3 #include <iostream>
3 s1 i) q* _5 f% { 4  % h; L" O6 g( J3 k$ F; U( v' K3 G
5 using namespace std;
( J2 E) A1 A. s' o 6  7 z, a5 v* s* i1 n1 X
7 int main() {
+ o  O: G5 N) G5 S0 S# C$ O 8  
2 L! Q7 {" l% M  V# O( |, c0 W& _ 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
; ?' F, j+ g! G* l8 N/ ^; V10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 2 [% C1 x6 H7 J
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
$ X. A3 y& g5 ]" k7 _6 [& J/ t12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; * k5 P( F9 o$ U5 \! X1 a; y
13  
0 M8 k$ p& X" w  h6 z14     size_t size_in = hexStringToBytes(plainStr, plain); 2 ]2 j2 Q2 a" X& b0 D, M4 v
15     size_t size_key = hexStringToBytes(keyStr, key); 9 m/ p% R% B, K5 |9 x- w+ N
16  5 f: b# u! F; T, j8 K  q1 Y
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
0 |+ f/ O" E9 x. z9 a3 S2 B18         return -1; $ k5 R' _% O7 e% e0 K! p
19  
. ^/ l5 B  d% ]8 _20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
, C: H, m4 k3 `; v21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 5 G. S3 i( v, U5 a3 L1 V  ~, ^
22  
1 r5 N$ |1 B+ O23     TEA tea(key, 16, true); 6 {6 j4 g7 H# D. |
24     tea.encrypt(plain, crypt); ! z5 X+ ?8 {8 I, L! e" o8 A
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; / a. I9 }/ c+ `' {& F# h5 v. q; T4 `
26  0 x; ~" P" X; U+ i9 O) ?" w
27     tea.decrypt(crypt, plain); 5 e% l1 k2 C& U1 g! X/ F
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
/ G. r* T) n+ G' ~& I& J) v29     return 0; " n1 H' V: h& f$ ]# }
30 }2 B. {1 ?7 R# t" j: d) J
" @- a$ F. q4 {% E! l
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx1 q8 E+ E3 d5 }6 K* _4 X8 O) }
运行结果:
4 i9 {7 t7 h" w. g, S$ hPlain: AD DE E2 DB B3 E2 DB B3
' N& P; r/ N1 `7 I  Y; qKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
, L/ ]) V9 q& I1 x# C+ TCrypt: 3B 3B 4D 8C 24 3A FD F2
* j& g( W: Y. {4 G7 R# D& f. f& SPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 10:52 , Processed in 0.020561 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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