找回密码
 注册
搜索
查看: 37799|回复: 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轮):0 c1 m9 _, h% x* S
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
; G9 }+ j$ v7 l/ l& L2 bTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
5 }' V) o/ @6 z- \5 C之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ) V, h9 P. Q7 y' V
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
7 M9 _4 O2 x6 q( e  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. 4 K. h& `/ U' T8 Q( n4 z9 ~7 |
  2. void encrypt(unsigned long *v, unsigned long *k) { 1 h; A8 d: J; X! Y& l
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ & E+ t' r' a' W3 U- H
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ + a5 x: r' b1 C* L
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ' v$ p2 u2 L6 `' Q  ]; M. x6 W
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 0 c; {* A/ A, R
  7.          sum += delta; ' O3 I, }7 l( R& v% o
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ) w" ~) x- n* W" ?  B
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ( P% O- `& u+ V8 R" j, D1 m
  10.      }
    + X; \8 m: p4 y# {: `+ N
  11.      v[0]=y; ) |7 O; l+ p7 P
  12.      v[1]=z; & W1 |: Y  f% ~
  13. } / f0 z" L2 ]/ H7 R9 d
  14.   
    # @, r# Q/ E: b8 k$ W9 V! C
  15. void decrypt(unsigned long *v, unsigned long *k) { . z) z) G. _+ i5 [" E
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ $ [7 Q$ W9 z7 `2 b1 r
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 2 G+ ]7 q1 \+ k
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    + U4 t+ Z+ W0 X, J
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    9 z! E% i" i% r' u
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
      f( v* D6 _* I3 N  ~8 H3 ]# }
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    3 [$ S$ m5 j& a8 S0 g% z
  22.          sum -= delta;                                /* end cycle */
    3 B3 v" W6 o7 i' }8 F! G
  23.      } 1 ~3 W8 O' j: _6 O% }* b
  24.      v[0]=y; % Z- w  Q8 [$ M; i( j
  25.      v[1]=z;
    2 F4 R/ a& f4 T6 ?
  26. }
      O2 L. ~4 ~) ~: y0 D8 g
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H - f8 S( V0 x4 r5 Z" q
#define UTIL_H
" f7 |  J, U: o9 v" C; W
7 y' M6 m8 P$ l" f  D1 P" {3 w7 k" J: w#include <string> 8 {# p( D' d- U
#include <cmath>
: K  e0 e" q- @- `3 v* \#include <cstdlib> 0 T* n& x% D  e1 M
7 V, I1 n1 i- o( u8 f  u! n
typedef unsigned char byte; $ h: j* ]: B# L
typedef unsigned long ulong; * e2 X. L/ {: Y

( h" U5 q+ ^4 m% W3 Z$ H9 L* D7 L( sinline double logbase(double base, double x) {
* i+ v  D" t6 [/ F- R5 X+ W    return log(x)/log(base); * Q) k# D5 X9 r& u4 W6 `
} 5 ?8 \" m4 C' C( L

; U$ i! s. h' n  b, Y2 X/*
" e" _4 E( S6 @$ u7 {# k0 E*convert int to hex char. $ Z  I$ O4 D+ U! D; X4 o, z
*example:10 -> 'A',15 -> 'F'
6 n$ e6 u% t% q5 ~) x1 b6 N- N, A*/ 0 F, j+ M6 v' W, C% l
char intToHexChar(int x);
/ W: r: y7 [0 F' Q, P1 x  F* r 1 L0 q0 \1 i- h- `- I5 L! p
/* $ `9 O! a) Y- e4 v7 g' R+ p; S/ k
*convert hex char to int.
& i' H# k+ s7 b$ A*example:'A' -> 10,'F' -> 15 5 {- _, s# q2 ]! m9 r8 Y
*/
9 d0 m0 ~& z4 R% ]1 r9 i( |int hexCharToInt(char hex);
! M: l3 U, I& |/ \
; i, H7 ^  t' ^( w1 `! vusing std::string; / \1 ^1 T1 L- q: _
/*
" b, b0 G% E) i*convert a byte array to hex string.
; _) c  O3 m' l6 [0 l*hex string format example:"AF B0 80 7D"
/ x2 h3 v: U: z5 v3 ?*/ 0 E- P$ |7 a3 Z0 ^7 \
string bytesToHexString(const byte *in, size_t size);
9 C/ S. X" ]: R4 q& N
- o9 R& P, J1 l/* 2 j$ B8 V/ q4 W9 q
*convert a hex string to a byte array.
  H+ k. C. I4 a  A*hex string format example:"AF B0 80 7D" / q: m  D3 j6 G. M* ?8 r
*/
2 [  y7 ^) N* |& Asize_t hexStringToBytes(const string &str, byte *out); & Q0 H, h0 _& s

1 j+ p* A9 ]) @4 p) v9 |; Y5 p#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" * m; t/ U4 _1 G1 R3 S
#include <vector>
2 u" _0 g) q. n: b3 ^" q& k+ S+ Z9 q
0 {6 ^: M' E: R, d- i& J: Husing namespace std; 4 l4 |$ S' G- i3 u% _' V. y

/ i' N+ f. R& a2 E8 [/ |. B! T) B9 xchar intToHexChar(int x) {
( S  C9 r" u5 w6 g    static const char HEX[16] = { : M, ^4 E! G0 {1 K( h
        '0', '1', '2', '3', 0 A3 e$ g8 k0 ?
        '4', '5', '6', '7',
$ p3 u4 [) ?: R& U# v3 J5 M        '8', '9', 'A', 'B',
. h$ \0 c# s0 |" U        'C', 'D', 'E', 'F'
- w& d, Y- `" ]; T0 {    }; # h8 r/ g; t2 E9 a7 ]1 ^% b( u
    return HEX[x]; & v1 [6 n0 u! k% S! i( `4 _( T
}
. i" e) C. [0 d
) w4 a- g" Z6 E1 \* e0 C5 Jint hexCharToInt(char hex) { 3 R, p) \, f5 q& Z
    hex = toupper(hex); $ N' B  z' R4 k5 j+ _3 H
    if (isdigit(hex))
- K3 [1 x( h. o) k8 C4 z- E+ _        return (hex - '0'); 4 m4 C" B" m# ^5 |# X
    if (isalpha(hex))
- o* D5 d' T: L/ I1 s7 m        return (hex - 'A' + 10); * _! t4 W# P; L
    return 0;
% i- T& O7 K- H# H" H2 E5 r} # u+ k2 T, k- U7 {- i  X7 @
6 H! q/ o6 R, B3 K
string bytesToHexString(const byte *in, size_t size) { 6 R5 b0 d4 i. N8 A- w
    string str;
' D* G- n4 I  ?' A3 `4 |7 v9 }' S    for (size_t i = 0; i < size; ++i) { 5 O. F  l& w6 y
        int t = in[i];   ^" n/ [$ b! V: X, r$ ~4 F& T. h
        int a = t / 16;
2 ?. w2 g4 C/ G6 i3 Q        int b = t % 16;
  @, p# D! ~: \& d  ?7 w0 d$ ?# ]. ?; }        str.append(1, intToHexChar(a)); % c; P$ X0 v# Y1 I# _/ U6 ]
        str.append(1, intToHexChar(b));
' n* ~8 I& Y0 @, }. J: H( u( x        if (i != size - 1) # o. c' a+ v& ]3 ]
            str.append(1, ' '); 7 y0 }; s# `! F+ y/ G) @
    } 9 x* n) x/ |/ E/ @* }
    return str; " U9 i0 B( _$ m5 |1 @
}
! H. @5 \, U6 q! M# e; _
! Q5 J+ U/ H/ J& R  I+ A" v& isize_t hexStringToBytes(const string &str, byte *out) {
( ?2 n5 O/ p% C
; v: x8 Y# `# u2 o2 F9 S6 w' t    vector<string> vec; : e- }: Z, W/ ~/ B
    string::size_type currPos = 0, prevPos = 0;
1 n) k0 }- P$ }    while ((currPos = str.find(' ', prevPos)) != string::npos) { 7 `  C/ r4 W$ X
        string b(str.substr(prevPos, currPos - prevPos));
1 y! v1 b) V# _, _. V9 F9 P" ~- p        vec.push_back(b); " j$ m0 N/ a  G# w
        prevPos = currPos + 1; : Y" ], M$ f: c5 Q7 Q7 o3 c
    }
1 Y) O5 U" q% J4 P1 k  ]8 R    if (prevPos < str.size()) {
+ n; m6 K3 ^2 C$ \  ?' ?        string b(str.substr(prevPos));
' m& k0 F& O) m        vec.push_back(b); , e) Q/ @/ H: S
    } & Z$ k6 f% g$ P; b& o
    typedef vector<string>::size_type sz_type; : |. Q8 n2 c% ^5 o: t) E+ D
    sz_type size = vec.size(); , K9 B) k0 Z6 _2 X
    for (sz_type i = 0; i < size; ++i) { * G. ?4 I) Z2 e! s/ v
        int a = hexCharToInt(vec[i][0]); " Q; i. o+ _: t' @- C$ h4 x* ]
        int b = hexCharToInt(vec[i][1]); - o8 u- Q2 R; D/ |! o
        out[i] = a * 16 + b;
# @& Q/ C& `0 [( O6 V    } # X6 w6 z' C# t& s! {/ t+ L0 }% R
    return size; & V* u# i' i. l7 _' F5 ^8 I" y
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 0 C) B5 O, q" z2 g4 y2 s
#define TEA_H : m0 l1 Y6 {! ~5 g. [9 L
& d& q9 R7 l. N0 d$ {3 F, ]
/*
) @9 t1 S8 r6 ^3 m*for htonl,htonl
2 J$ ?1 i. \) k+ ^8 S, o) Y*do remember link "ws2_32.lib" + Z! V) @( X& `
*/ ' i. j* c5 ]4 t. G+ w: ]2 y
#include <winsock2.h> 3 J  y' l  f5 J' w/ a
#include "util.h"
- L# \' l/ L9 R# G# g. x
( g9 x* A& B  k; |% ]7 bclass TEA { 0 X* g' c8 l  b4 x7 I
public:
8 h, d9 L+ r" @- ~    TEA(const byte *key, int round = 32, bool isNetByte = false); . {, m9 f9 E) G: E
    TEA(const TEA &rhs); ! c* d) r; ?1 @. `" A4 l
    TEA& operator=(const TEA &rhs); ! K9 v) v! V8 r+ e/ B% P6 Y& N$ f
    void encrypt(const byte *in, byte *out); 3 r# j0 _: v0 |
    void decrypt(const byte *in, byte *out); 0 M! p4 c6 ]8 T0 n( J, v, s
private:
* E  {  s+ v# j3 J5 ?! O$ U    void encrypt(const ulong *in, ulong *out); % H5 o) c3 [% j
    void decrypt(const ulong *in, ulong *out); ) I6 i  ~* M/ k: P5 Q
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 0 O) ^" p; x8 j# _
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
0 I6 Q3 f9 p( q; d) D$ }' Q) kprivate: 5 Z; z' g# M; }( @4 _
    int _round; //iteration round to encrypt or decrypt 2 w& Z3 B2 _* g2 }$ P
    bool _isNetByte; //whether input bytes come from network ' d6 }! w, y- r5 Y7 Q
    byte _key[16]; //encrypt or decrypt key
7 Y/ f/ B) g  f3 c) J5 ?" z/ P};
; U7 }/ z  o" f) Q4 \ 2 X9 V) Y9 U, h. Y3 }
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
' ?/ k1 w( G9 O- X, i4 w 2 #include <cstring> //for memcpy,memset / k- N% Z# }9 s+ u
3  9 w2 |" k2 o& O
4 using namespace std; 2 h" y* v9 W6 m0 G- a6 s0 Q/ O
5  
8 B, }, y* l  O$ ~  X; t( Q; u 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
- @! o' j5 z! B3 c' s" \% A 7 :_round(round) " q0 V: s! g1 p9 W8 p& X$ F
8 ,_isNetByte(isNetByte) { 0 R& _1 K/ b# J! Q
9     if (key != 0)
0 w! r( B9 E+ D10         memcpy(_key, key, 16);
7 ^0 U: q( |4 F. U+ l11     else
! n$ k. M2 B4 d: i& G( ]12         memset(_key, 0, 16); % G" R6 ~# h" X8 R5 [) y; N
13 }
$ E3 ^( n# [: @4 M, {* U6 x14  
* ^; m  g& k, p7 |) `15 TEA::TEA(const TEA &rhs)
6 i# k! u/ C/ Q# K+ O8 [. f6 |16 :_round(rhs._round) # J7 [& C2 ]9 Q; W; w% z4 {* y
17 ,_isNetByte(rhs._isNetByte) { $ j" g% u! t1 J/ S) \9 q. L
18     memcpy(_key, rhs._key, 16);
: R" O* l9 I( Q  u% v$ W4 d8 D19 } 7 p' d4 e" {: b: X
20  
% i* ^% m; [9 _/ v) J0 a21 TEA& TEA::operator=(const TEA &rhs) {
& |* }  X8 J' h! h8 M' v22     if (&rhs != this) {
# q4 s, f, p% x; y23         _round = rhs._round; 1 K1 A: }4 a( e) e: b, q/ a
24         _isNetByte = rhs._isNetByte;   [7 F# M( E/ s& d2 d
25         memcpy(_key, rhs._key, 16);
- X- N0 _: j/ p* g0 m9 Y0 N26     }
; x" \- y) L7 b* _; L- w27     return *this;
! k' A5 a5 u  f+ l& N28 }
8 E" i' ^# {! S. A: ~5 m& x( s  i29  
5 K5 m' ?  [/ C: P+ k% s30 void TEA::encrypt(const byte *in, byte *out) { : r% e/ Q5 v1 g, Q  _) Q" P
31     encrypt((const ulong*)in, (ulong*)out);
; X3 i5 V. U5 p1 p$ }  r' O32 } 0 A0 k2 p! \' G6 E* P% r7 W
33  
, d# s; B% w" N( b; D* Y34 void TEA::decrypt(const byte *in, byte *out) {
3 c3 O# F3 f4 R/ Z, |- \4 j" ~35     decrypt((const ulong*)in, (ulong*)out); 7 R  S( |+ I. D1 s7 v( ~3 g
36 } ' _( B9 t# m1 [# w( N4 i
37  
, D8 c" w0 g7 A38 void TEA::encrypt(const ulong *in, ulong *out) {
, y( c# n% i( Y4 F4 J39  
2 a) y3 h9 p4 H! z( M4 E' M40     ulong *k = (ulong*)_key;
4 p+ C9 r' X( v& [$ d8 e( B3 l. t41     register ulong y = ntoh(in[0]);
' }" P; P( q' T: Q42     register ulong z = ntoh(in[1]);
! X* _+ {$ H' p43     register ulong a = ntoh(k[0]);
, `, Y; [! n- ]( y44     register ulong b = ntoh(k[1]);
$ `6 d3 _( s& X  w% H45     register ulong c = ntoh(k[2]); ) y" F2 J1 q( @" Y$ L
46     register ulong d = ntoh(k[3]);
+ G6 Q( o, G0 o47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ % Q; M' v9 A% t  ~# x
48     register int round = _round;
3 l9 w; g; a) _8 i+ H49     register ulong sum = 0; 8 K0 V3 w4 Q: U! F; [) I( v; ^$ i
50  6 f& M6 N! G9 T8 h
51     while (round--) {    /* basic cycle start */ 8 b% n7 z& P+ S$ m  }
52         sum += delta;
" K* l: i* y' R53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( m- t& `- ^$ |! g6 w54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
' F6 I" e. M. O$ V55     }    /* end cycle */ + m2 Z; d0 }* H0 P6 G! f$ y% U
56     out[0] = ntoh(y);
; b& ^: f1 \; \& m1 K* M57     out[1] = ntoh(z); - q5 j+ s9 V6 z+ s, F8 {0 ]
58 } : w+ A! B5 k) v/ _
59  
. m" r- r$ M1 a, R0 w60 void TEA::decrypt(const ulong *in, ulong *out) { $ B" t  o7 m, H" m) c
61  # |+ d7 i4 m* j: ?; F6 d& T
62     ulong *k = (ulong*)_key; : ]4 v2 [( t2 C  f) J. q
63     register ulong y = ntoh(in[0]);
/ ?% M: l, t7 C8 e, E64     register ulong z = ntoh(in[1]);
2 `  {+ K) e/ s: G65     register ulong a = ntoh(k[0]);
# t6 g7 y; w0 |" }" C66     register ulong b = ntoh(k[1]);
6 F8 D: z$ B7 X4 \5 l* r. Q9 X67     register ulong c = ntoh(k[2]); % D. u0 d+ a0 d" o% S6 `" l
68     register ulong d = ntoh(k[3]);
  }4 g5 n; p$ \0 z( d8 E& H: O  l69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 5 t0 m) a' W  O% ?1 I
70     register int round = _round; 7 |1 l3 W9 J& B
71     register ulong sum = 0; ; m$ F: J; s2 i% Q+ @( S8 ]2 X
72  1 Q* C/ o4 l4 N- n9 }# t
73     if (round == 32)
( [, q* v9 K  V7 o( {74         sum = 0xC6EF3720; /* delta << 5*/ . n" q$ c1 b  w6 }
75     else if (round == 16)
3 v5 W( y& N7 }: Z" |76         sum = 0xE3779B90; /* delta << 4*/
; ?* j3 ?1 O& z$ @: g77     else 4 ?4 k8 e0 h( z5 N- b4 p
78         sum = delta << static_cast<int>(logbase(2, round));
: N6 F4 }5 o1 O  A3 G$ D( L79  + y4 M: R! f* _
80     while (round--) {    /* basic cycle start */
5 p8 ?5 f  w% w81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , o& L2 X1 h3 S6 A- F
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); $ L% C! \6 ]& k7 J  ~- W
83         sum -= delta;
2 Y% c  C9 g( |" K0 A84     }    /* end cycle */
5 ^. n, E) q. {  e6 L( k85     out[0] = ntoh(y); ! J  q) O1 O! Z  T& @
86     out[1] = ntoh(z);
7 n, T2 u  k# ^+ J! E8 r% ]8 c87 }
  A$ S# O. i# @: J6 N. ^- ?7 m
* W) X7 n0 S  y2 i6 v+ ~# Y" W需要说明的是TEA的构造函数: & X9 Y; _: ^( W, ]/ x$ v  ]
TEA(const byte *key, int round = 32, bool isNetByte = false); - |1 M5 `( Q5 w% M
1.key - 加密或解密用的128-bit(16byte)密钥。
4 i7 h$ @) U: x7 j; n2.round - 加密或解密的轮数,常用的有64,32,16。
6 x! ^2 O, o2 e2 u6 u3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ' l9 d& z) c6 z0 M/ L1 P
- k1 s( B6 L' T
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 6 V7 Z6 O: t# \; W! l; ]1 C
2 #include "util.h"
: U; B. \# G2 l2 N% x$ {, ? 3 #include <iostream>
5 h7 X- m5 D( t 4  
( _6 C4 C, u: X" d/ q# D 5 using namespace std; 6 v' D: u) ^3 Y2 S' C
6  
% Z' y  }& J( S) f0 @) f$ D 7 int main() {
# t5 X& w, f2 W8 B0 p7 m. s 8  
- a; f' q2 {9 ^1 J 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
" c' b, b1 e/ ]10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
/ S  E5 Q# d, n; t11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;   o6 j7 F" R& @* _- r
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ; m+ q7 B/ n; e2 u# e
13  5 s, f& e* I6 X' q
14     size_t size_in = hexStringToBytes(plainStr, plain);
5 r; M# f- r7 v) ^15     size_t size_key = hexStringToBytes(keyStr, key);
" U8 A0 b& Y  Z16  
: G- p4 @5 l& v9 c! y7 r6 \) `17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
5 z: R2 b6 d5 C. R18         return -1; 2 k! ?. }9 _9 H7 N
19  
+ u) R2 K; V# a0 _' A20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; $ o( w2 e, `) F, A! _& x1 b, h( U
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; . G1 y/ p% ?) F8 I. P% Y; @
22  ! @, q7 ]& {% \( q' l) L; ]
23     TEA tea(key, 16, true);
6 t' t0 _! R& f6 p( Q, y* o24     tea.encrypt(plain, crypt);
# O; O+ r$ s0 m4 o% H; p; ~25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
* e: }% m3 U9 e4 a26  
- ]: t% ?+ p8 C% G27     tea.decrypt(crypt, plain);
" K# B3 ~9 t% v28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 2 U5 j0 `! q3 J/ Q% s% ^8 Y( a
29     return 0; , D1 _5 [$ B- X
30 }
+ d( u! O0 o* u! o, {
# y: I7 B3 h$ t$ k6 Y本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx  d6 [+ B- e6 H3 F
运行结果:
. l- y4 J3 v1 H2 i3 g0 c( `Plain: AD DE E2 DB B3 E2 DB B3 % v  X/ x( L. X" L( D$ p2 \
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
- Q: \" h" O% A$ U5 J/ e9 j% CCrypt: 3B 3B 4D 8C 24 3A FD F2
( h) I4 Q; }3 k+ K' V( \0 ZPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-26 19:19 , Processed in 0.018385 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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