找回密码
 注册
搜索
查看: 37392|回复: 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轮):
% C% x( m% @  b% A" m! Z微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
  f& k# P1 ]) k: v- STEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
( ^1 \# h2 \+ b! M: I0 |之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
6 C% ~# f( Q! N% ~+ i- d) i在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ) H4 ?+ S2 d$ D! F6 c, n9 H9 s7 a
在 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. / o- G5 G9 n! J: ^  p: V! \
  2. void encrypt(unsigned long *v, unsigned long *k) {
    8 U, p8 u- ]2 B$ {+ t' I; `
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ + B5 D  G' \3 _4 H; `% W; _
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    $ ]$ z0 c7 G0 e- v& g9 l$ c
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    0 b  h  ^: e' C9 q
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 9 G( _* v& y# U( O& r
  7.          sum += delta;
    . C) T$ f+ l0 C/ r7 `) {; u
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    9 E# h8 B; D  }" e' f% b3 w
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 1 @5 i2 d' U8 c
  10.      }
    ! m1 A5 D" w9 P; _$ w
  11.      v[0]=y; & N" J% }, Q& ]# @3 P: F, Q8 v
  12.      v[1]=z;
    ! S$ ^, ^2 |5 ?8 O9 X
  13. }   C, q+ d6 ~& {$ W  T- G$ X
  14.   
    # q! z; k5 X+ H, ?! ]% l" d
  15. void decrypt(unsigned long *v, unsigned long *k) {
    , o1 R% q  H  @1 T3 p4 r  l, S2 n
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    2 F% d2 E2 v, `9 }
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 5 ?3 c' Q  e$ R" ?0 U" o
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ / t) \. p, T8 e2 ]# _
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    4 z9 ~7 [* Z) l/ Q
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ' P; [# Z9 `: I! m6 o6 T
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ' a4 ]' Y9 X: P$ F. o7 M  a( y
  22.          sum -= delta;                                /* end cycle */
    7 ?: e2 \! ~; l  ]4 i
  23.      }
    2 A# Y! ?% x5 G8 c2 I
  24.      v[0]=y; ' R. Q3 C, Q9 y, ]' w
  25.      v[1]=z; ' j, e. k8 B# h& v  k4 C( M9 \; J
  26. }
    . w7 R/ O) H9 t; C
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ) g% f( @  m' g
#define UTIL_H : ~6 o0 d) {, m5 z" y4 `
* `- q: Z  B) h+ v1 |6 X
#include <string>   N5 V$ {9 W4 N. r: R: @
#include <cmath> # G/ `0 [8 Y( c& Q9 E
#include <cstdlib>
* `+ O( r% E) _  M( M0 }+ o 9 ?7 m. ^* d" A/ U, D( z' K8 ~4 w( k
typedef unsigned char byte;
) v/ d0 P# g) m$ s, j; {typedef unsigned long ulong;
! n7 n$ l; h% e6 q # v0 N  p$ E- v7 k
inline double logbase(double base, double x) { 8 A2 D! h  m( c4 C& q
    return log(x)/log(base);
  b+ P3 y1 y  w3 S/ v% W}
, Q' t/ k7 ^3 c/ K5 o
, V  ]4 Y0 t' r) V% V* p5 g/* 0 I( O/ W# w2 X6 \
*convert int to hex char. 0 c+ j8 i' `5 f( L1 a! q- Y$ `# g
*example:10 -> 'A',15 -> 'F'
& v5 s+ m2 l6 }" o*/ & ~9 Q* `& Z8 U2 g
char intToHexChar(int x);
7 T1 b0 g2 y/ N9 t 9 ]3 B: T% }& S- {1 y  b% T
/*
7 p* K" g- A! t2 |* \*convert hex char to int.
( s! U3 L5 H) ]& P*example:'A' -> 10,'F' -> 15
, T9 O- U& O, i* E. Y*/
& z3 I1 F) s7 F8 g& P0 vint hexCharToInt(char hex); , l1 l( r( E: I) _! c$ m

4 V* \; f4 o  c$ ?using std::string; % M- [' i0 q$ `# t/ G( J
/*
: `8 u5 r% P" C; o& P0 }*convert a byte array to hex string.
! P4 }  \  \9 P! H4 i8 U' I/ O) W*hex string format example:"AF B0 80 7D"
# t% {* b  E' {, S( F*/
: q: F1 }1 k9 B! w0 C* Fstring bytesToHexString(const byte *in, size_t size);
0 H% z1 b9 W$ g% S  B * e$ V& }+ w* a' H" P: ^
/*
7 m8 i. P7 _! r+ x# W' c*convert a hex string to a byte array. * p( q2 V, q  s3 v5 ]
*hex string format example:"AF B0 80 7D" ; j' L) b  i3 V% _  ]# b  w. Q# R
*/
; m, v7 v+ w1 z5 U% T) I0 g7 tsize_t hexStringToBytes(const string &str, byte *out);
$ y& \; [  V+ Q7 j+ q" `' z* A
$ j2 }3 m. G9 k, B#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 3 _% l1 _9 w% d: w0 a6 V5 f  O3 k9 c
#include <vector>
! O0 b  y  W# m+ x
/ n% N3 o9 }9 D& Pusing namespace std;
7 r+ C9 X! o& w, X ' h/ V! Z5 T8 H$ f& r9 X
char intToHexChar(int x) {
7 F0 ?8 d8 V, g$ h    static const char HEX[16] = {
$ U$ K  |1 j& |0 l$ u        '0', '1', '2', '3', 9 B7 D1 d% v' d0 u
        '4', '5', '6', '7',
- ~: p& F5 Y# d        '8', '9', 'A', 'B',
! \: s+ E% ]  L# n3 m. y. x        'C', 'D', 'E', 'F' 9 B8 v0 e9 C4 H  [& I% B4 L7 K
    }; 7 D6 t& ~# W; L+ w& _# I8 Y/ e
    return HEX[x]; 9 C5 L( z9 L) C* J5 ]5 h5 V
} ; o% c% B9 K- L7 m) j  M

: O1 C2 _. h# ~9 K8 ~% G4 t' |int hexCharToInt(char hex) { * F( E( b3 o, l6 _8 d! R) p
    hex = toupper(hex);
( e4 @6 {7 v6 \; G5 @    if (isdigit(hex))
$ v; L4 v& Y2 A. S: P/ L        return (hex - '0');
4 {# `1 O7 [  H; Y2 ^/ f    if (isalpha(hex)) ) h* W+ ~7 }2 u9 l0 n
        return (hex - 'A' + 10);
% K$ \' I4 M: F  \    return 0;
; N9 V8 \; m$ A9 N} , s9 X4 G! ^. E7 G

$ \3 x/ V% \0 L' |% d- estring bytesToHexString(const byte *in, size_t size) {
; B5 }0 ?- t9 f- Z3 x/ E7 m    string str; : f( f: ^' S7 K9 }1 B2 y. j
    for (size_t i = 0; i < size; ++i) {   [5 R1 F+ j' K9 y4 D
        int t = in[i]; ) _6 Z& M! O$ f) X5 V7 [# W/ L3 T
        int a = t / 16; ( m, c& a2 T0 @3 V
        int b = t % 16;
/ X, \7 b( G0 }5 x        str.append(1, intToHexChar(a)); + q7 b. B5 ^/ Y
        str.append(1, intToHexChar(b));
3 e' y' M5 m) Q% h" j- ^        if (i != size - 1) $ P* ~1 U5 M; x; H2 l
            str.append(1, ' '); % T" T- w/ Q2 \! Z) t9 O4 @) @+ ^, y
    } + W; e( L+ P# q: e) a9 L
    return str;
$ K: |. v& l+ U& v6 i# I} 5 K# y6 M, r( C' b3 K! X6 w
  c+ V- |$ m4 K' N$ V
size_t hexStringToBytes(const string &str, byte *out) {   U6 `- t1 m7 o% L" Z
9 Y3 o9 t( s/ E
    vector<string> vec; 6 Y" x8 I9 [) z& {
    string::size_type currPos = 0, prevPos = 0;
# [1 j) ?+ \8 `. P9 l    while ((currPos = str.find(' ', prevPos)) != string::npos) { ) F% D* I- v% t) ^- ~  X7 \
        string b(str.substr(prevPos, currPos - prevPos));
: B( v' Q9 t, ~9 [: |        vec.push_back(b); 3 Y5 Z3 O! c0 R2 e
        prevPos = currPos + 1; 2 y, v+ T5 P! g
    } / T3 U5 i" ]) X- Y/ L
    if (prevPos < str.size()) {
: M9 d# x; {$ a8 B0 z# q- ~        string b(str.substr(prevPos));
' e0 D1 s$ J+ \9 J8 I8 R; O        vec.push_back(b); * V* p# B! B7 R' w% R" F
    }
9 e) a. N& p  |. b    typedef vector<string>::size_type sz_type; , N' L4 ^* d/ `0 g( N6 V
    sz_type size = vec.size();
* f  f7 C# R2 [, S/ ]( ?& V( x    for (sz_type i = 0; i < size; ++i) {
0 L1 y* F3 ]$ a9 z        int a = hexCharToInt(vec[i][0]); ! P; S; o/ t& L" Z
        int b = hexCharToInt(vec[i][1]); 8 l& x1 q& X0 T, n) }/ J
        out[i] = a * 16 + b; 8 Z0 D& s! |6 G: {; n  t3 F9 X
    }
$ ^2 O0 A2 Z$ @( l; Y2 V    return size;
, [( a% g8 Z4 b}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
. M% h# m+ w! u, D, ^#define TEA_H % V1 ^1 C. {1 D& o' d
* I0 z  x4 e8 `4 c1 N% Z
/*
1 B/ a8 V( b( d; _*for htonl,htonl
9 e" K: d1 ]8 h2 N: f% x- |*do remember link "ws2_32.lib"
1 M$ A" E% e/ x5 ^$ X, S& B*/ 8 ?, k7 c0 c+ f# h5 u/ s
#include <winsock2.h> ( |% w3 K! B) I  q
#include "util.h"
  W7 F7 S# ]8 {' W) G  z: F; s4 a * P3 n- b& H& e/ R' Y. Q+ \# s
class TEA { + Z7 M4 e0 S. i; ~5 t& j
public:
- \& k8 F' M8 O7 {    TEA(const byte *key, int round = 32, bool isNetByte = false);
. i* d' t7 W3 _) A  H3 P4 ?* B0 R    TEA(const TEA &rhs); 4 U  f+ O/ H! ^2 o# J# A) A
    TEA& operator=(const TEA &rhs); 3 o% E0 O' P1 h- P+ K
    void encrypt(const byte *in, byte *out);
, o4 t* }9 `9 x0 @    void decrypt(const byte *in, byte *out);
: a1 T6 I( Z) E$ w9 S8 ^% Z0 I: Zprivate: . H# ^5 h) t( Q$ A
    void encrypt(const ulong *in, ulong *out);
) S8 ^0 n7 N5 _    void decrypt(const ulong *in, ulong *out); 7 N" {5 C% b$ J$ J5 u
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } , @5 s: b5 z3 e
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 8 N. m; f& B8 [& a; n( g
private:
* c3 g% `2 O7 I' O6 S. e2 p    int _round; //iteration round to encrypt or decrypt
/ s: j: \" \+ O+ A7 s% H7 d- W& ~    bool _isNetByte; //whether input bytes come from network 1 v1 q7 M- S+ Y0 N4 }, G' A" \
    byte _key[16]; //encrypt or decrypt key ; v( d% `) S/ R$ J& Y- ?, l' |; r
}; 3 G' c) A3 ~8 v, V) q3 b4 k
" k9 o+ n* J" n5 B% N  N
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
6 I& M' @* c3 }  P 2 #include <cstring> //for memcpy,memset
4 c) V  K5 C! {  L 3  + o6 K2 h1 ^5 v/ Y* O
4 using namespace std; $ k; N7 Q6 V3 I/ a
5  % ?! v8 I2 L  W: W4 u/ p5 U
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
  b/ n! L+ M, c 7 :_round(round) 5 _- D: A, H2 M" ^" n, R9 r; o7 F
8 ,_isNetByte(isNetByte) { . s  i' T, ]5 Q4 H7 k/ c0 Y! F) F
9     if (key != 0)
9 u9 ?% Q" S; E: C" z5 q* h* i10         memcpy(_key, key, 16);
/ j' T) e: g0 B5 ]11     else % o1 U. B2 _! c3 W# @5 r
12         memset(_key, 0, 16); - L3 k1 T  k% q3 v( W/ Y
13 }
3 ^! U' y0 _0 H5 g# D" N14  
" C# j7 J1 R  L; o3 N1 M) w/ |8 k15 TEA::TEA(const TEA &rhs)
: m0 l  E1 ], E3 i- ?16 :_round(rhs._round) + F; M$ k0 f! x7 L: M, u! J6 h
17 ,_isNetByte(rhs._isNetByte) {
7 T4 E1 u4 W  o+ S' E0 \18     memcpy(_key, rhs._key, 16);   f: |; T; t# C6 _0 g3 c
19 }
/ p0 F! y+ ?" `- X  T( {20  
; A6 N% Z9 x. f! J, E$ @- u, p21 TEA& TEA::operator=(const TEA &rhs) {
# r9 c; \% R- e. g* v" f; \- {22     if (&rhs != this) {
' z8 g% x0 P& L) N: A8 c23         _round = rhs._round;
4 V* x6 h, c8 i: E1 m; }24         _isNetByte = rhs._isNetByte;
1 [* P; ~( \/ }  g4 T25         memcpy(_key, rhs._key, 16); ' D4 I' E6 s2 V
26     }
6 o- V0 W' ^" d5 i, Q27     return *this;
' C6 f, P6 o: {/ K- C28 }
' H3 o0 s3 {) I7 z% o8 v% [29  5 ^7 Y5 e. d& D- i
30 void TEA::encrypt(const byte *in, byte *out) {
; f2 K$ A! I6 h2 `31     encrypt((const ulong*)in, (ulong*)out); $ n% o+ o3 K7 G9 d2 t3 r
32 }
5 D  F  D& l+ P6 y* }3 }33  , _+ B7 a9 e7 k7 j, e! T
34 void TEA::decrypt(const byte *in, byte *out) {
& d7 V6 X- D! u+ Q35     decrypt((const ulong*)in, (ulong*)out);
( l/ J6 z9 \- V9 d1 Z36 } # s3 I7 X5 H  V, k. z- p, ~
37  
. ?$ }0 A! [  I9 l: ?* r( L38 void TEA::encrypt(const ulong *in, ulong *out) {
/ g2 y1 }' R5 c39  % a  F. k3 K; h5 k5 i7 h
40     ulong *k = (ulong*)_key;
$ t; e' @, G5 @3 B2 ^- X41     register ulong y = ntoh(in[0]);
3 v  c2 `% J( z, W2 C" K42     register ulong z = ntoh(in[1]);   ]7 b+ i& Z# h+ _
43     register ulong a = ntoh(k[0]); / u5 ?: I; A" o- @! E
44     register ulong b = ntoh(k[1]);   g/ K2 @( ~/ p( F0 N, ?4 d
45     register ulong c = ntoh(k[2]); . _5 q5 K2 D: u2 a! @
46     register ulong d = ntoh(k[3]); 7 z- o$ ?. K' S. U( j4 i3 d/ d
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
9 _+ {5 ?# F- m# C+ i" @) }48     register int round = _round; ( D' j& T' Z& O: l+ n
49     register ulong sum = 0; % p/ ~% I6 V$ X5 S7 s, r% c- n
50  - ~3 j* {) n9 f/ H4 u, m
51     while (round--) {    /* basic cycle start */
" `9 Z/ v( e7 A# f52         sum += delta; % r) t8 o. i1 D2 p- ^
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 6 X4 u0 z- n) \4 G. g
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
: n, ]8 `/ [, ^7 s7 R55     }    /* end cycle */
( B1 p) u7 t, f0 L56     out[0] = ntoh(y);
# m2 O. j* }' D: i+ |& f4 }57     out[1] = ntoh(z);
* t! {, |3 g+ Y' U1 Z+ R58 } * K  G, m" h! _
59  " r7 x' P6 R4 C9 W% `1 U
60 void TEA::decrypt(const ulong *in, ulong *out) { 8 i1 R5 r1 V+ @
61  
$ B4 i9 l1 D: t, d" X  o1 k% q# V/ @0 ^62     ulong *k = (ulong*)_key;
" {9 B2 @, C% ^7 Q( D63     register ulong y = ntoh(in[0]);
- e& Y& R4 S) K" i64     register ulong z = ntoh(in[1]);
4 S( y5 h6 R  p/ o/ ]% f* I65     register ulong a = ntoh(k[0]); ) J. X2 X4 Y* V6 w" @5 q
66     register ulong b = ntoh(k[1]); + [3 c1 T$ Q3 K# ~7 W
67     register ulong c = ntoh(k[2]); : \0 T3 k1 g. G7 S/ P& X5 k9 J7 ?& K+ s
68     register ulong d = ntoh(k[3]); ( p0 X$ ~, g" d( b
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
& v  b& P0 |3 |: n2 s$ y70     register int round = _round;
6 |  ~0 t% `. G& U1 F* b71     register ulong sum = 0; 9 G$ c2 e9 k) H/ U/ H- p$ v
72  
+ O  K+ V) T* ?! y73     if (round == 32) $ X6 o, F7 q3 m+ k$ K6 W# ?
74         sum = 0xC6EF3720; /* delta << 5*/
% N# [( a" C( I3 A4 j" O  \5 U75     else if (round == 16)
8 a' p. U( V6 ?0 k8 T2 O4 s76         sum = 0xE3779B90; /* delta << 4*/
3 P1 ^1 y- U1 y77     else
+ }2 h- J( A6 k78         sum = delta << static_cast<int>(logbase(2, round)); . w  r6 s& Q) l' \, |5 M& ~
79  $ w' ~" W! U! V% _
80     while (round--) {    /* basic cycle start */ : G. W! s3 y9 b  _2 Z& K  |
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
$ p4 [: y: l* y4 o; A- L82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
- e+ b( M: H' H6 E9 {83         sum -= delta; , z' ~  b) {; M& e1 u
84     }    /* end cycle */
  s9 K7 h. S) P* m% p85     out[0] = ntoh(y); / N* B3 S5 {/ A, Y; F$ E) t8 y$ ?
86     out[1] = ntoh(z); % o9 s6 I8 r, H% e7 N. p7 ]% c; z
87 }
7 U" r$ b+ I. T7 a2 \0 {! {) d0 N1 n/ d( U  k/ |
需要说明的是TEA的构造函数:
. G* F. ]$ d( YTEA(const byte *key, int round = 32, bool isNetByte = false); ( N4 U+ t3 p/ L. {
1.key - 加密或解密用的128-bit(16byte)密钥。 / C; D0 m1 e9 }
2.round - 加密或解密的轮数,常用的有64,32,16。
3 o+ x9 C- ~) {" J3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
9 E0 _, [9 Q; ~, m! U$ K
$ |4 u* r/ I$ i9 F; D: H( V6 f2 Z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 3 R! d! b7 Y; l, R: \1 g
2 #include "util.h" 2 |3 G; ~' }& y8 X( _/ s
3 #include <iostream> / O; q" I% F; \9 }
4  
" N! r* F( R/ c% M- ?5 T1 }3 F! f" c 5 using namespace std; # j, K9 F& p  O3 |) G+ X
6  
! a" B- ~3 N$ Q 7 int main() { 8 C7 V' f, E2 S: N% R  t( [* B
8  
& e1 z6 G3 c6 s4 c 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 9 }' K2 X; _& i' p/ {. k& d# f
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ; b9 @3 i7 ]0 ?* m' j1 V
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; $ t( j# j( h& u+ m
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
3 y$ O. D" T/ y* Z# R13  1 {3 c2 u0 q6 T) X" G& e- p
14     size_t size_in = hexStringToBytes(plainStr, plain); / M, N6 t0 t5 e! ~2 a8 J; c, o
15     size_t size_key = hexStringToBytes(keyStr, key);
; k" t7 }# J  E( A1 C. d16  7 B, J4 ]! l$ C' i" J
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ; B8 y* L7 s2 N3 s" C: W
18         return -1; 3 N+ t* B# m4 W% }- m7 f. L5 _. h
19  
: C+ S; ?2 E3 R) B" w5 U( T20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
3 b: f5 j2 D" t/ m( \* o/ u+ Z21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
- M! Q  B6 v0 S/ r! r, v8 Q22  
( t. L( v" r1 u  J' g23     TEA tea(key, 16, true); 7 L8 c; N; v' v1 H+ z4 k3 n2 x2 Q
24     tea.encrypt(plain, crypt); 2 |# p. V& z7 s2 s/ w* Y3 c
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;   f$ |4 ]; v3 C& k, V2 Q( H
26  
& k8 @3 L/ Z/ S; i27     tea.decrypt(crypt, plain);
2 ]9 k/ W6 \/ N& J' e8 h5 B28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; . _2 l4 V( l4 z5 _
29     return 0;
# r+ l& x' {3 l; R* Z. E5 z( U30 }1 e1 _& G# Y" m/ Z
) ?0 w, Z' |. G: W' H8 q& x8 S4 q
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx" p, y; b4 r) K9 C7 Y& D$ O
运行结果:
& F4 u6 u0 ~/ D4 B; J0 dPlain: AD DE E2 DB B3 E2 DB B3
0 I$ @* T5 {# Z2 ~- xKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 8 ^! |" h! S7 [9 h: g3 Y6 A0 d; O
Crypt: 3B 3B 4D 8C 24 3A FD F2 / P( E  \) O2 D1 A$ f
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 13:41 , Processed in 0.020699 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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