找回密码
 注册
搜索
查看: 37350|回复: 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: E3 K2 k$ O微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 0 |9 k& P. N  H  U: C3 ]) }% H/ B- s
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 0 q8 P( v9 E7 _; a
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
# ]4 v2 m( ?% B2 h在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - A: g% V+ E2 L' o* I. Z: 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. 9 \4 X) b1 l0 i9 Q. [9 Z8 a3 [
  2. void encrypt(unsigned long *v, unsigned long *k) {
    $ x* r, [+ e  N' ^! V# F' K
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ + J3 Q, Z. q' e: D; \# M. K
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    % h6 c6 l- H+ q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 6 o. K1 h( Z1 t$ x/ y! p
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    5 V0 ^* ~; L$ g
  7.          sum += delta; : N0 [6 Z" m3 d
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ; a1 L* Y& Y. u
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ - p, u* G7 _1 U& y* }( P6 G
  10.      }
    * q$ K3 G$ Z2 j6 \! l4 B" h
  11.      v[0]=y; . V" q7 n- k0 v* }9 u8 a1 M
  12.      v[1]=z;
    # A: ~) o( z7 Y3 F# l! t' [
  13. } ' g3 l5 o7 J9 A4 t5 B% M) R
  14.   
    4 V* O5 P7 ]  v
  15. void decrypt(unsigned long *v, unsigned long *k) { 7 s# o( \% W+ U: z
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ % \8 t# ^: k- T( l
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 3 ~; J9 W: i- p% }: `$ `
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 6 j5 E0 r; s5 W' Z8 p
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    + o  U4 U6 v; L7 h) m( s" T
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 3 V, \$ x) I0 A3 |; W
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    : Q" S2 ^1 x( u- H
  22.          sum -= delta;                                /* end cycle */
    7 r; ^+ B# S, M6 x0 m( r/ w
  23.      } ) N1 y  |; `3 M
  24.      v[0]=y; % e5 W/ k5 M( l0 |" p6 p
  25.      v[1]=z; % [% k: V" |" X, [6 [; }  D; Y
  26. }! B6 B9 t4 L1 L5 d
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
9 W' R# _  T# @* D: _% t#define UTIL_H ( S5 F0 m- a- W$ k9 D

5 q) I8 h7 v- d* Y& v#include <string>
6 ]7 }2 \8 ^4 C2 Z#include <cmath>
, M6 L1 A; m0 |+ M  u" `#include <cstdlib> 9 r; Q8 n" R: Z$ ^  G, c# @

. e$ N1 m. C4 @% ^: @typedef unsigned char byte; 5 ^0 v" ?8 ^# t1 f
typedef unsigned long ulong; ) [: K+ B+ _6 v/ s, J

  }- E: n# _' A& f$ w& Y& P, V2 ]inline double logbase(double base, double x) {
) m  C' Q, h9 x0 O. l* q, f& R( e    return log(x)/log(base); - z0 s, h! ~$ c# Z3 ]( T
} , J+ O6 ~. c" i# \& `" K+ S4 v
: R! w" W" S% `
/*
+ W& w' z, R# l& h: G4 Y! P*convert int to hex char.
+ D. t( u7 [' r0 `*example:10 -> 'A',15 -> 'F'
. ?' |8 s, b2 p; D! d# ?* h. B*/ ( U; Y* u+ S+ X* U5 J  {6 R
char intToHexChar(int x);
. U) V' u% \5 f. Z- e
8 p5 P& Y; b1 Y: l: |/* " f; E0 Q* `" ]7 @, |  s- q3 Q
*convert hex char to int.
1 x% v& |, P5 V) o# v+ k*example:'A' -> 10,'F' -> 15 # H) Z" A7 u* k+ M0 c+ b: M
*/
; z% R9 R* P2 w  j) w: T, v# nint hexCharToInt(char hex);
9 ^3 G( ~. }  _9 c; N6 q 2 q8 q% D0 b4 ?( s: a/ G/ k
using std::string;
$ I- {: n2 A7 y7 a/* ' _6 N$ b0 {4 n, h5 r; w' F
*convert a byte array to hex string. + \: A6 f2 W9 N  S% i- u
*hex string format example:"AF B0 80 7D"
; h& ^8 t: p" Y! u% p! Y*/ $ m8 s$ ^! n( @
string bytesToHexString(const byte *in, size_t size);
" t7 K8 s( F9 ]" t, F5 a3 X ) C) }1 Y/ j/ ^5 i+ [
/* 6 Q/ L  R! p4 Y) W# U9 t
*convert a hex string to a byte array.
5 G$ a' Q& Q1 C* S0 w*hex string format example:"AF B0 80 7D" 4 M2 A  B5 ?3 t2 d9 u
*/
  X& M$ o5 i* m# c4 R% a8 xsize_t hexStringToBytes(const string &str, byte *out);
+ o( x* ^- U+ ^( D* b3 U8 ~ " T1 j4 G$ d: r: A0 u0 ]
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
! X+ \# ~% ], j#include <vector>
- q/ s3 N" q$ r( E, [
3 t+ K5 T$ U2 E! }5 ]. M( ^& G3 nusing namespace std;
$ c1 ?+ g9 Z1 ?7 i3 @% a
* K& g2 l: u' k& fchar intToHexChar(int x) { # O0 E6 L4 v0 a# ?
    static const char HEX[16] = {
1 y) v5 w! r" B" X. o- {        '0', '1', '2', '3',
' ^! ~! a' F( t/ r3 x7 r        '4', '5', '6', '7', . v4 M  k# @2 n+ h' p; r
        '8', '9', 'A', 'B',
$ A  v5 v# S& g3 S& i9 }% Q3 _8 J, o8 T- ?        'C', 'D', 'E', 'F' # E$ _& x  H' z. M. P0 L
    }; ; c. Q* ?+ |7 ]* q. v4 H" ^
    return HEX[x];
! b) E: m- |& l2 }! `, z8 T}
7 @+ j4 Z# E8 d' Z2 i0 e7 |5 l 2 i1 o1 z5 p8 c! J; G  q2 U7 e2 Y
int hexCharToInt(char hex) {
2 G* g: Q2 l1 K4 W    hex = toupper(hex); # y5 ~  D; q7 \! V. Q
    if (isdigit(hex)) 2 I7 {2 w$ p  ^- j7 e# g$ ^. ]
        return (hex - '0');
& p. l  M. T  e# N& r9 E    if (isalpha(hex))
, h* A8 S, r1 L7 b) V- V        return (hex - 'A' + 10);
. |( R. `5 b5 I$ s7 d    return 0; ) [7 ^& M3 f' W7 i$ X) D1 J  s
} ; L  X0 c* X/ J2 D- C0 s2 G8 x1 e3 S
0 {# ^8 }; P  D5 v$ _$ `
string bytesToHexString(const byte *in, size_t size) { . A6 a6 J* V8 y* ?' U# Q# o
    string str;
9 ]) r7 x. b& {( j    for (size_t i = 0; i < size; ++i) { ) k0 \& o. q* R# R, Q
        int t = in[i]; 5 Z+ @. T/ s5 ]: k' o4 l
        int a = t / 16;
  P# K) |8 f# V" j9 K, O        int b = t % 16; 5 J  F+ o5 }0 Q$ C6 U% ]
        str.append(1, intToHexChar(a));
2 S2 T7 {9 N0 i' h/ \2 H        str.append(1, intToHexChar(b)); / f' s5 ^* E$ ~0 h9 g9 J5 g
        if (i != size - 1) ( Q1 P  A# ~( w1 i$ G1 \
            str.append(1, ' '); ' q& O3 y: @% k! r' P7 h
    }
$ x% W' E, n$ F) U/ A* D3 L$ ^    return str; $ n. S; e, N3 v% P6 K/ H
} ) j: x3 u5 G! Q- s
% w* H' o7 l' |% g- s  N
size_t hexStringToBytes(const string &str, byte *out) { % Z1 c) c% W8 r' h' l% ]4 V0 K- F
- t4 a) n2 s1 r: a* s  K! L
    vector<string> vec;
" C8 H7 K5 F: q* Y; W    string::size_type currPos = 0, prevPos = 0;
* _  \- D" N4 |* Z    while ((currPos = str.find(' ', prevPos)) != string::npos) {
! t4 B4 l% e4 g4 k0 l' ^3 I        string b(str.substr(prevPos, currPos - prevPos)); ! ~# D( u/ {( B. y, U
        vec.push_back(b);
9 |8 e* q" ^3 V/ i2 m) }: T, J0 J        prevPos = currPos + 1;
9 ~- C# I3 _: ]# d" }% m    }
5 k9 L% r9 ?& V: |$ n    if (prevPos < str.size()) {
  @# F( Y  s! j* n        string b(str.substr(prevPos));
8 k* a' i( p/ G; l: S3 {$ O+ w        vec.push_back(b);
" x6 T7 z1 _8 r    } # t, B. d9 {! k, J
    typedef vector<string>::size_type sz_type;
. N, Q1 V; H1 G4 {    sz_type size = vec.size();
$ x- z/ W+ C# R" F. E3 k    for (sz_type i = 0; i < size; ++i) { / C/ h2 H2 W# ]* {- p8 p% y
        int a = hexCharToInt(vec[i][0]); : U9 b  K& g2 ~8 Q# L# I
        int b = hexCharToInt(vec[i][1]); . @4 W# {+ E0 ]
        out[i] = a * 16 + b;
+ a- u4 z8 n  o# z9 M( S    } 5 a8 }1 _# Z9 l* B3 a8 @, s! p
    return size;
1 ?8 b# F+ G- [. r}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
% @0 p4 z0 O0 {! u" e: n; f! k#define TEA_H
. X$ I5 X. T6 U6 ] * f9 y! }( ^, |3 u& D0 r' F2 q
/*
7 Z4 I  n7 k1 v' V# Q) K: T*for htonl,htonl
8 c" k) S; r7 @8 d*do remember link "ws2_32.lib"
2 T4 {! P" s8 e*/
1 J  I% u0 B2 Q- m#include <winsock2.h>
' l$ W( q/ U. Q1 Y6 r8 W#include "util.h" ; v1 @; w% K$ N! q5 ]5 i

! B0 w9 f) A6 D6 v% Oclass TEA { 3 X7 A) H3 {2 P) ~$ V
public: " j/ ~: K4 r+ g
    TEA(const byte *key, int round = 32, bool isNetByte = false);
) {5 v; i/ e5 d( r* v    TEA(const TEA &rhs);   M2 H' f2 `' w) _0 n
    TEA& operator=(const TEA &rhs); 9 c% K; }+ }0 `9 Q+ N6 w2 E5 U
    void encrypt(const byte *in, byte *out); ' j) }+ V& u1 Q6 `/ C# C4 N1 A
    void decrypt(const byte *in, byte *out);
- s# Q4 I# L$ S: J8 z* e- j6 }private:
- g; p. ^2 T: H    void encrypt(const ulong *in, ulong *out); ) Z+ c& P4 I1 ^' ?; m- J
    void decrypt(const ulong *in, ulong *out); ; T& A, C; \+ W0 J  e% L$ v( e' B
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
& ~) |7 ~% w: z3 l$ w2 \    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } & w# v% ?4 T- z2 {$ x
private:
7 N& q: W- C! Y. s7 ~7 [8 i    int _round; //iteration round to encrypt or decrypt : }2 u+ J( b; M$ X
    bool _isNetByte; //whether input bytes come from network
! Z9 r( |  U% k- L1 D    byte _key[16]; //encrypt or decrypt key , }+ ~" J6 ^' y1 L
};
- Z2 t3 ^5 w& e( X7 w
" Q- s0 X3 U" _. C$ D# p; [#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" : `0 P/ c+ Z! M& K7 U" c2 A8 H
2 #include <cstring> //for memcpy,memset
' a: \) a8 B" q1 s5 {* ? 3  2 I- i6 x9 r( m7 S7 K. S$ _
4 using namespace std;
/ t' B( M. B: {8 o 5  * x9 `7 ]9 D* P: |
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
0 n) ]1 K% Q- Z/ z9 b! L 7 :_round(round)
5 q" R8 E# a( {# i8 t6 ] 8 ,_isNetByte(isNetByte) {
+ W# ^  c4 E! S; p 9     if (key != 0)
. C7 a- L3 }2 x0 l" U# ~+ P; G$ M10         memcpy(_key, key, 16); 6 j7 k) ~. o( b. Q" ^8 A- B
11     else
8 y; {7 t0 V. L12         memset(_key, 0, 16);
2 j' ~) ~7 U  Y" Q& x13 } 2 R3 ?; s: S* o
14  
" v* l. Q6 h; ~$ N15 TEA::TEA(const TEA &rhs)
% u+ ^4 |1 v# n+ f16 :_round(rhs._round)
: [, m/ {) D# B1 E17 ,_isNetByte(rhs._isNetByte) { 1 B; e8 J! Q2 y5 {9 Y% i
18     memcpy(_key, rhs._key, 16);
; b1 f1 k; ]. c+ t19 } 1 O+ X& ?' c" g+ L  @. @$ `' b
20  
% s2 F! l# u8 Q" r$ s$ \! J% v( p21 TEA& TEA::operator=(const TEA &rhs) {
- y8 S7 a1 L. x+ d22     if (&rhs != this) {
7 @( [9 G% W4 o23         _round = rhs._round; , U: X: K  N# b; }
24         _isNetByte = rhs._isNetByte;
* z  @- _# h" _, s) `9 X( o; ?: ^25         memcpy(_key, rhs._key, 16);
# T5 @8 K9 W6 u- W' K* p26     } ; V) V5 L: r' x# ~$ G8 ]# N
27     return *this; 4 T3 @" p! Z- ~
28 }
2 Q. L& D& C2 E; Z: z29  
9 Z6 u* a2 d! W) P9 W# _& k5 b& _30 void TEA::encrypt(const byte *in, byte *out) {
% s$ q7 z' b  G: K9 k) F3 F/ H8 s31     encrypt((const ulong*)in, (ulong*)out); ( q/ a' A9 z) R' I7 T4 V
32 }   o% d( r) y0 w  u8 b/ n
33  
0 S8 k3 Q4 Z, A: B3 R, d34 void TEA::decrypt(const byte *in, byte *out) { 6 N1 s: x( W( u/ T
35     decrypt((const ulong*)in, (ulong*)out); ( u" u, S1 s3 m5 v* Q' s2 ~
36 }
7 H; J! K4 Y  x1 C. L37  ! `) O7 X4 s/ M( Y( e( U& z, B
38 void TEA::encrypt(const ulong *in, ulong *out) {
( L# {1 w; w' n6 `* S. p+ f" S9 t39  " w; ~* p# K! ^
40     ulong *k = (ulong*)_key; ( p/ w. f, p7 @$ T3 w' _1 l
41     register ulong y = ntoh(in[0]);   n; v. `* E  @
42     register ulong z = ntoh(in[1]); # g9 d7 i2 T# L/ J
43     register ulong a = ntoh(k[0]); 5 K% b" Q; x$ L( R9 c( F
44     register ulong b = ntoh(k[1]); 3 k& I. g, a* ^( m! e# y
45     register ulong c = ntoh(k[2]);
' M. x+ X! d1 b" U/ S% _  {46     register ulong d = ntoh(k[3]);
3 P( }- \( m  {: K5 u# u2 i4 s8 C47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
# o1 N; H: B. }: ~+ c48     register int round = _round;
2 H. v! i$ _& H49     register ulong sum = 0;
; a2 F5 X* i( J7 f; n/ Q4 T: ^  u- z- q& K50  7 m/ o; r" }+ Y) M2 C: D' I
51     while (round--) {    /* basic cycle start */
. e; j# ?2 b0 V52         sum += delta; ( C7 }9 n. w& C" i7 e  e1 S( y. j
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); , `; ^  x! F0 \, z
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
' R9 s1 W' D& |; F6 R55     }    /* end cycle */
8 W9 H; \/ f6 ]0 z. X9 M3 T56     out[0] = ntoh(y); 5 q$ C# `5 q6 q! F& e2 j8 i- |
57     out[1] = ntoh(z); : V/ b( Z, ~7 t! r! _
58 } 8 w9 E# D& ^+ Q2 a5 H( Q9 W
59  0 \  M  g  J$ x3 p7 E0 P* N
60 void TEA::decrypt(const ulong *in, ulong *out) {
9 I' Y: K  Q9 @- l4 D& u61  6 @5 v& G- Q+ |9 G
62     ulong *k = (ulong*)_key; & {( c4 F' ~0 G" b7 i: m
63     register ulong y = ntoh(in[0]);
# N' o0 d; E" J" m64     register ulong z = ntoh(in[1]); , I8 H! l% d4 i8 d
65     register ulong a = ntoh(k[0]);
' i; m' l+ D5 R66     register ulong b = ntoh(k[1]);
& H5 C9 }( t- Z$ q# `4 H- J67     register ulong c = ntoh(k[2]);
6 q- {9 o5 W8 Z8 g68     register ulong d = ntoh(k[3]); / g7 C% L0 L3 k
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 0 F9 G0 t# {! V3 k) z% ^
70     register int round = _round;
; G; p; C* y' V) k0 a2 J7 ~/ y& V6 Y71     register ulong sum = 0;
8 R$ e- D- \2 S5 K2 u4 }72  
2 `1 o8 {& o  o0 M1 L' ?3 m73     if (round == 32) 1 @5 N# @( T# I, x' l! O
74         sum = 0xC6EF3720; /* delta << 5*/
' D% q/ _0 c4 \& P75     else if (round == 16) 7 \+ e) m# V; `5 c: B6 s+ `; Q% D
76         sum = 0xE3779B90; /* delta << 4*/
/ q2 C5 i: b7 m. G# L77     else $ U) U6 ]. R5 r! H( V8 f+ m
78         sum = delta << static_cast<int>(logbase(2, round)); - q3 g9 @, U" y
79  
% D, }: c- Q: P8 o5 U) t7 [80     while (round--) {    /* basic cycle start */
4 i1 x9 G' ?; r' ?) p$ z81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ O2 Z; y7 n% K. [4 G82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); # Z; d0 |7 A) O; ?6 m. d7 ^" _
83         sum -= delta;
# Y5 K4 `* t7 j' b, ]% ^84     }    /* end cycle */   ^$ ~: @( e$ I) t" q. ?& U
85     out[0] = ntoh(y);
5 y7 X" ?/ ]! o3 z' q0 Q# K' N86     out[1] = ntoh(z);
* D) g* }% q1 s% W' Z87 }$ F, v5 e5 g9 Y0 J( r
! n4 G, C% t! C8 S: K2 U) X
需要说明的是TEA的构造函数:
0 n1 ]9 W$ t% X' _TEA(const byte *key, int round = 32, bool isNetByte = false); ' A$ _0 n% R4 T
1.key - 加密或解密用的128-bit(16byte)密钥。 # T7 Y9 d  q' {# C1 E3 s+ v
2.round - 加密或解密的轮数,常用的有64,32,16。 ! ?/ M, x$ c; W4 l. S
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
% E0 f+ h1 J" v! d/ d$ v( K, b( O+ t0 O4 s6 `( h1 g3 }" {
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 3 q7 n7 k3 i- }5 e2 d
2 #include "util.h" 3 S* w0 z. q0 Z3 ~
3 #include <iostream>
2 R: _: e, M: w8 U6 }- i/ S+ j9 Q 4  
9 L( G! i5 C' e3 ]6 w  `0 H 5 using namespace std; 7 B' d+ v7 D* F8 t5 m1 M  p2 `
6  
7 _7 U. |4 v3 e/ L" u 7 int main() { * Z7 |1 \% q$ u
8  
  W/ I+ K! j% Z1 A 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
4 B) u3 K9 I. K. K2 B" R10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ! U: G1 R1 B2 D0 C, X5 w; u
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
/ d. E+ j7 B- N% M1 \& D, U: P12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
% {" P$ |8 v. v$ C$ F13  
8 b4 J0 Y7 Y" M$ V, Z0 S) H9 u. C14     size_t size_in = hexStringToBytes(plainStr, plain); ( ?. l6 W. z8 Y
15     size_t size_key = hexStringToBytes(keyStr, key); 6 _5 K' n9 {# d) n8 O3 z
16  ! c  c9 ]% i9 f2 O. B7 p0 H, c% e- `
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) / y; y; Z, w! x% ^
18         return -1; 8 E: W, u1 @9 r1 A* k/ k6 J6 a
19  # c- g( f: c. N5 t1 O
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; , g% g  K! s7 A9 p9 m
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ( c. s  h  u# I1 z; _
22  6 s5 v1 O8 p' W( b
23     TEA tea(key, 16, true);
9 ]( i* ~) [+ }: @9 C24     tea.encrypt(plain, crypt); # p1 q" Y+ \! T, X" Y% @( B
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; . U, g# W& T8 C9 [% T
26  7 H9 L  l: ^  n( s/ j% G1 P# K7 {
27     tea.decrypt(crypt, plain);   d: f' c, Q7 ~" m! v+ b0 y
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
8 d3 K: z9 s! X" E4 _+ }29     return 0;
& ]9 v& [1 K+ o  y( ^( b30 }8 w7 S! X) {6 A# s
! v0 x" G4 u5 n0 o8 L; c0 `8 y. _; l
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
1 }9 J) o; A. |4 k" C运行结果:
' v: Z- e' C! t! [Plain: AD DE E2 DB B3 E2 DB B3   e! A5 d. p+ D" t$ {
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
8 `6 V: P6 I5 d# B: t- ]Crypt: 3B 3B 4D 8C 24 3A FD F2   r# c1 V7 e; t3 r+ R. N
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 06:44 , Processed in 0.018760 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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