找回密码
 注册
搜索
查看: 37729|回复: 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 q4 \2 P7 u3 P* m微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
0 A0 Y& k, {& ^% ATEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
0 o2 _8 W. o$ L5 G# T( ]之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 : \/ X0 x; x3 w! w
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
- |$ ]5 p, S+ u9 E8 s% S% l: j在 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. 7 ?) y  t4 B+ L4 [; ?* Z
  2. void encrypt(unsigned long *v, unsigned long *k) {
    * R0 R7 w- ^+ H8 K% [
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 2 M8 x8 Z! z8 I7 F- m* w
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 9 v. Q/ u, `/ Q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ( g! ~- o$ f  A+ o7 \# N+ M0 J6 B+ M
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ' @9 E# Z, n" J1 W: P+ ~
  7.          sum += delta; 1 S  c; G# b; p' T2 l1 v
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    0 n" b8 E! w6 ^6 [. C8 s6 d4 U
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 0 |9 o% J% O- r3 e4 ~
  10.      }   Y1 }4 P3 U1 x
  11.      v[0]=y;
    $ d" _1 t" n) T) U: W# b; U
  12.      v[1]=z;
    * o6 E5 U" |) m+ U, X
  13. }
    & ^, g  q$ K1 h9 R! N# z
  14.   
    8 q% @+ V2 v; e" Z- ^! E# J+ i* x
  15. void decrypt(unsigned long *v, unsigned long *k) {
    9 g) B( r  q* o. I1 b
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ % I. e3 n+ }5 L6 q+ o
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ * x  B: }! r9 b4 c2 X# S
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ * h, C0 R  x- r; F/ \6 D- ~$ A: B# z
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ! p8 K. ^0 T5 @- P
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ) k1 h, g4 a, w, U' K
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    9 T6 P1 Z3 b# J
  22.          sum -= delta;                                /* end cycle */ ) w5 T! M# `# I. h
  23.      }
    * b+ s  T8 W0 w- N* [
  24.      v[0]=y; % N, H& k* N: Q
  25.      v[1]=z; 7 }+ n' N& F4 r
  26. }8 P- N; r7 c  @9 O, i+ P
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
$ e. G8 C& {, r3 m% o/ I: y( [. j#define UTIL_H
4 i' y3 m0 w: p5 y. l& c9 X
6 j" M$ \# g. B$ q2 y2 h' K- a#include <string> 7 V; t' F3 n% C: G7 n5 [) e
#include <cmath>
' D2 `  g' U: t9 ]( m4 g. o/ Y5 X#include <cstdlib>
' `; x! n; A, m" j 0 Y1 @3 D  V( b7 ~/ Y
typedef unsigned char byte; & Z& ^% U5 E' a. `( z' y
typedef unsigned long ulong; + [( Q% C& ], b, `4 R; W  |% x

; N: _, |& I. T8 kinline double logbase(double base, double x) {
* d4 s* J! E. Y( m2 G: K    return log(x)/log(base); 9 q% _( k- O' B, b
}
  E6 I0 R' z9 z& I% Y- G, {
) T. V3 @! [4 ?/ m% U8 t5 V/* 0 J5 Y7 p" d  v# R7 A
*convert int to hex char. 2 H- a( v3 @7 X
*example:10 -> 'A',15 -> 'F'
# F1 @4 J- o1 [5 Z6 M9 }*/ ' W6 Z& `' M4 Q* D
char intToHexChar(int x); 7 z6 h6 t/ A7 b8 y
" B3 z2 I, I/ ]( i
/*
9 k: T3 v7 v& ?, |" ]0 [*convert hex char to int.
" X$ @! U5 m: V! y1 d*example:'A' -> 10,'F' -> 15
9 g& W1 m( L6 w! O4 S& k4 C6 c* {*/
; H3 d  T& b6 Q: ^, qint hexCharToInt(char hex);
, v4 ~+ w5 p% d 2 X. c$ ~: Q" ~$ F* e
using std::string; - P* }9 v- J( y3 F# q3 R6 T" W
/* , R) P, X) V' W* R5 }
*convert a byte array to hex string. & _6 P6 ?9 Q: C. {. a
*hex string format example:"AF B0 80 7D"
9 _- E* n# b: t3 y" p$ p2 L*/
/ g: |% W# _  z" Pstring bytesToHexString(const byte *in, size_t size); 5 f" C% w3 `& U- j, a1 W
' q$ r" C$ J9 P4 J. P/ b+ ?* c
/* 4 j& V: H. O# q9 J0 g
*convert a hex string to a byte array.
+ A* q4 T. A0 D2 l*hex string format example:"AF B0 80 7D"
" B* g' a+ ^( G" ]*/
; L$ _' s8 g. P: h/ _: a" M: G3 M: jsize_t hexStringToBytes(const string &str, byte *out); 5 O, ~$ Y' c0 F# J$ {7 l$ K
% @3 F4 K5 _. O  ^0 z5 e0 W+ F$ y
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" . C, g/ r8 q- ]& w
#include <vector> , \2 I* W' `: o4 P9 @
( @# I4 h9 P! e3 _8 v/ d% S5 z
using namespace std; ( O$ ]( h( |9 z! v5 `2 a

& w6 l4 _' Z/ z# Wchar intToHexChar(int x) {
( l* @$ |* }1 j0 }1 @: V5 o9 D    static const char HEX[16] = { " s& _9 R) s8 q% X# Y1 g
        '0', '1', '2', '3',
: L5 L! A% m* S) H% a, u# S9 Y        '4', '5', '6', '7',
4 A& L6 ?: O1 }7 U        '8', '9', 'A', 'B',
% D5 I/ K5 I7 `3 `4 g4 P# @        'C', 'D', 'E', 'F' ' d2 _: u7 A4 ~4 |0 d1 O# e
    };
) x* r* E3 p+ N  D9 ~) Q    return HEX[x];
" J) z/ ?& u, V) `}
2 p. q& @2 r) P* e
: a" n/ M$ @0 ~% ?int hexCharToInt(char hex) { / x# Y2 z) ^, X6 L6 ~/ H& v, N
    hex = toupper(hex); / c! i! X" a+ b. W8 D& t3 x& A
    if (isdigit(hex)) 7 e0 M4 W* I' F5 q2 t& W, I
        return (hex - '0'); 8 c, G& b' E% q
    if (isalpha(hex)) * n' e$ l% I4 o% i7 F
        return (hex - 'A' + 10);
7 b& }( ]3 y' ]9 Q. S+ {4 x    return 0; 5 k+ Y8 R! }) Z5 o, S1 W# M
}
2 I6 k# y$ f5 n
/ o" [" {3 J% `: M/ }2 Hstring bytesToHexString(const byte *in, size_t size) {
3 I) b% E# y) c6 K" T, k    string str;
% [( f2 }/ l" ^5 `9 B    for (size_t i = 0; i < size; ++i) {
/ P8 J# B! Y, I/ u% \1 P        int t = in[i]; 9 G: d2 H0 o( T! z8 n9 ~/ r
        int a = t / 16;
1 \  m) ]) t4 @8 e5 R/ A1 }. _( ?        int b = t % 16; 0 c7 q8 u5 g7 r5 E
        str.append(1, intToHexChar(a));
$ h. L' z% ]6 G, X        str.append(1, intToHexChar(b)); 3 Y4 `; J  d& @# J) V) l' e( S7 K
        if (i != size - 1) 1 E- {  I2 I/ f% _, @/ `
            str.append(1, ' '); 2 W: e9 {  P$ o* h  r) o8 |% y9 V
    }
' _5 }1 g# w+ L: f    return str;
% X# V9 M; y6 m) d) C' I* O}
* I0 O; Z# N  b6 d
" N% [+ M% M4 N: l+ i  B# t) usize_t hexStringToBytes(const string &str, byte *out) { , o! H1 H4 q( F! U

" ^) d' t8 u' b' C4 B    vector<string> vec; 8 d) w8 p; w2 G, E9 A
    string::size_type currPos = 0, prevPos = 0;
, i4 K4 J: b) ?# R0 ^: W    while ((currPos = str.find(' ', prevPos)) != string::npos) {
4 h. l' ~7 b# {        string b(str.substr(prevPos, currPos - prevPos)); $ C8 M6 g2 \/ s9 f+ s+ E4 a3 R9 b
        vec.push_back(b);
/ [3 x; ?1 {3 z5 k/ v1 k        prevPos = currPos + 1; 1 e* O. r0 N, N* x) [
    } 0 `! c8 d* f2 u
    if (prevPos < str.size()) { ( u" S5 k, p+ s. W
        string b(str.substr(prevPos));
- I$ Z1 s6 E" L; H3 ^$ o        vec.push_back(b);
% q' a0 V9 ?) X: f) Q    } " d# j: C1 L8 T$ ~7 s
    typedef vector<string>::size_type sz_type;
: E# Y" f0 [% z( K    sz_type size = vec.size(); $ K% G/ b9 P9 w; h7 V
    for (sz_type i = 0; i < size; ++i) {
1 y6 v( V) h# C( s        int a = hexCharToInt(vec[i][0]);
. C6 y6 l/ P- t' w) {        int b = hexCharToInt(vec[i][1]); " j' i" x2 |8 |5 [! G( R
        out[i] = a * 16 + b;
9 f+ D1 K% d& W    }
- |: d7 K) W# z# ^    return size;
4 V( \2 M( B$ l9 b" U& P}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 1 S7 c% S# U% S  C" z" m
#define TEA_H
# W% z  K$ G& c- n5 E
! s9 G3 N+ E# P& \/ b+ f  x4 E- \3 q0 h/*   z/ f2 c0 X2 Y
*for htonl,htonl 0 E( c2 }# y# ]) b8 R& B
*do remember link "ws2_32.lib" ) ~, U; v9 ~9 k5 G0 c7 S, A1 w/ t) \
*/
2 P, T$ ?3 y+ Z# N4 e/ g#include <winsock2.h> 9 v  \7 m2 d% l2 S2 P
#include "util.h"
" f. K' p; D# c & e: Q2 `4 d* V
class TEA { # `" R" o- V7 j& ~7 B. ^6 m6 d$ K2 V
public: : s8 q" h% {3 p9 I+ L' z
    TEA(const byte *key, int round = 32, bool isNetByte = false);
% e3 ^$ t/ j* v1 k# W* A    TEA(const TEA &rhs); : R0 E) B$ k8 k+ X  o: \
    TEA& operator=(const TEA &rhs);
0 B5 |$ {3 Q3 \7 c    void encrypt(const byte *in, byte *out);
8 r% a0 w* }  P% l( g) m1 Q    void decrypt(const byte *in, byte *out);
% }% L, U. f4 q' w4 L, aprivate:
1 @, r: p9 I' `: p& L9 q    void encrypt(const ulong *in, ulong *out); % ~5 @+ P1 |$ p9 [; O" _
    void decrypt(const ulong *in, ulong *out);
- V( y: z# y1 q. S: f& o- j    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 2 N4 n; S+ ^( A8 A
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 7 S8 O) H1 q+ [2 ~/ v7 m3 `
private: * Q8 m( R* H2 p0 l  W* H) k9 K0 \
    int _round; //iteration round to encrypt or decrypt 4 Y% E* T2 b9 I5 @
    bool _isNetByte; //whether input bytes come from network # }& N: g; l7 }$ O
    byte _key[16]; //encrypt or decrypt key $ v0 [3 }+ `0 \  [+ ^# O! P
};
4 _0 R# v/ @( J* `/ b ) e6 x# D3 m0 |; e) V8 @
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" : `3 X0 Y# f0 t" z
2 #include <cstring> //for memcpy,memset # Q# B' [/ Z2 S3 Z. {0 o
3    G1 ]# N' X0 q0 b
4 using namespace std; & n  a8 @2 H* `$ D
5  
2 W8 |& X* [1 r 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ! K. s* G- z  a! n
7 :_round(round) ; M: E8 Z0 J" q% N; v. o4 Q+ u
8 ,_isNetByte(isNetByte) { 7 \' O+ J6 A* R! N5 r# p. m" C
9     if (key != 0) & ~6 g, _( o. ~8 I/ s9 \
10         memcpy(_key, key, 16); 1 t; z& n3 U: \, b. }- V' e3 l; y4 m
11     else
. ^9 w) V) E5 @4 e; r* G12         memset(_key, 0, 16);
% r4 L2 O  c" ]6 a13 } & D2 u4 a( j# D' C7 z- |
14  9 W- z5 E: H* O; O- }0 [
15 TEA::TEA(const TEA &rhs)
! n  f% r1 E" k. Y' v& d  l( g0 v16 :_round(rhs._round) 3 V5 C1 b2 R2 N1 F- k' Y& H
17 ,_isNetByte(rhs._isNetByte) {
% n2 d4 C/ N0 ~  b3 n18     memcpy(_key, rhs._key, 16);
0 W2 m  L5 c* V/ V19 } & d; a2 o/ b, r/ Q- D( ]" }- v, q
20  
- G$ N3 m8 v. |$ @" r  \$ O$ f5 {& T21 TEA& TEA::operator=(const TEA &rhs) { 3 m5 ^. T) i  c. {9 E; ~
22     if (&rhs != this) {
7 J2 z4 |7 A! Z' I8 i/ ~0 j, S2 y23         _round = rhs._round; ' i* u6 ^9 B; J, r1 \4 \$ `
24         _isNetByte = rhs._isNetByte;
4 ^- Y4 v9 }, j' s  N25         memcpy(_key, rhs._key, 16); 2 L2 p* g/ P& _- u( n8 W6 `
26     } , l; u8 M! L! r( C
27     return *this;
; ~  Z  m1 t9 w' N, c28 } ; o7 L1 r* c, k) U2 H& ]
29  
) X1 F7 z: _4 K% ]2 J4 W' h1 z30 void TEA::encrypt(const byte *in, byte *out) {
2 h  ?- m# l& y: j9 S: G. d31     encrypt((const ulong*)in, (ulong*)out);
3 d8 K  x/ k' s' G  [/ _32 }
5 g8 a* h4 \5 b) [33  ! w  [2 H  S8 A5 H+ h# t0 p
34 void TEA::decrypt(const byte *in, byte *out) { ( r1 l* }; \' h2 z7 f5 t
35     decrypt((const ulong*)in, (ulong*)out); 6 @/ O3 J. B2 V9 E3 b" H% g
36 }
8 n5 ]/ U4 q% r! F+ O3 }( Y; @37  ( |, r; j, t$ A# m' H, i) m
38 void TEA::encrypt(const ulong *in, ulong *out) {
9 @# i* v& l+ k* ~* G. h39  ) E6 _$ V% w: ?/ p. K
40     ulong *k = (ulong*)_key;
+ N6 X( V5 T  R$ M. w# \41     register ulong y = ntoh(in[0]);
! V& G% H& l' P  S7 b9 f5 l42     register ulong z = ntoh(in[1]);
( z8 B! V) ]% e8 G2 n43     register ulong a = ntoh(k[0]);
9 j/ C3 k2 \# c5 L44     register ulong b = ntoh(k[1]); 2 S. H, p7 _, P; Y
45     register ulong c = ntoh(k[2]);
9 {/ M, d' A$ V8 A+ J46     register ulong d = ntoh(k[3]); ) {9 Z- e# O) A- x5 L
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ # I+ _' Q. V+ i: N. D
48     register int round = _round;
( H1 ?( M/ @: h& b+ w/ v49     register ulong sum = 0;
% w- z: g" R2 B) W50  
( G! g' r* [# h( ?0 y) ^9 P51     while (round--) {    /* basic cycle start */ : N" j+ E$ a$ b& N
52         sum += delta; . L: c  e+ ?3 S
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
! K1 }) |/ ]: B2 _" _+ D54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 1 s( ]5 m, T$ N
55     }    /* end cycle */
" {: M* u3 K2 v: g# Z56     out[0] = ntoh(y);
+ \$ W+ v" o/ _3 K3 D; i57     out[1] = ntoh(z);
/ z6 a6 S) ^. q& R# Z58 } : l( y+ Y" E3 d
59  
- h' K; J) Y+ w  Y) |. e60 void TEA::decrypt(const ulong *in, ulong *out) {
# s2 Z) ]% A0 o0 s61  
8 O; D6 T$ V5 N( r  p5 T' E62     ulong *k = (ulong*)_key;
7 {3 b* I' X- Z5 j( E+ c- z63     register ulong y = ntoh(in[0]);
0 y2 @6 B% U1 T; v* m5 s+ _64     register ulong z = ntoh(in[1]);
8 R. A  @! u/ {65     register ulong a = ntoh(k[0]); 7 ]1 t3 k7 p' s
66     register ulong b = ntoh(k[1]); & w' |, t: S# H  q% B" C
67     register ulong c = ntoh(k[2]); ' ~% o' w, o6 n9 A8 j2 E, H$ R9 p
68     register ulong d = ntoh(k[3]); ) c, X# C0 o. n
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
( b# m- F; @8 b  t! O$ E70     register int round = _round;
2 L% O6 M2 q8 X7 K$ y71     register ulong sum = 0;
1 M: T. q) v/ `  \0 j72  
& _1 h) N8 p: U! ?7 t/ t7 ^8 J2 [73     if (round == 32) 8 \1 W4 ~2 O6 d4 t/ s( C2 R# W" {
74         sum = 0xC6EF3720; /* delta << 5*/ 9 y3 ^/ Q& P1 ~) ]( @; N8 J& z
75     else if (round == 16)
: u( }% b7 l1 `2 T8 q7 C2 [) }, I4 j76         sum = 0xE3779B90; /* delta << 4*/ / H5 ?  W( |% Q) b7 A0 J" p
77     else 3 q4 n3 f- `3 S3 A" I, a; k8 U
78         sum = delta << static_cast<int>(logbase(2, round));
* e2 M) J) P& B5 Q9 y% ]# A79  2 ?. q* A, j* j# t; q# n
80     while (round--) {    /* basic cycle start */ 3 Z' D( M. n( S2 b2 f
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
. ?- B) _4 V) q/ `( Y, N82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
, A5 ?) I- F) v- }" I( f! E: z83         sum -= delta; 1 C8 I7 n4 j, F& E  ^* i, I
84     }    /* end cycle */
; x# n- J+ t! {1 c1 v( _& s85     out[0] = ntoh(y); 0 r8 L0 f' }* J6 D0 Z+ L
86     out[1] = ntoh(z); ! C8 E( B) {7 Y5 m5 z; e: N
87 }# i0 P, s9 j: U& \. J
; C& l! s: ]7 f0 Q
需要说明的是TEA的构造函数: 0 {! H9 X# K! u5 U2 F% t4 `/ {5 b% J
TEA(const byte *key, int round = 32, bool isNetByte = false); 7 ?# i6 n* D' K
1.key - 加密或解密用的128-bit(16byte)密钥。 ( O3 O' [* }9 J: a( g0 {% P' I
2.round - 加密或解密的轮数,常用的有64,32,16。 ( L7 \7 N8 Z5 _. Q3 C1 ~
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
7 ^. U! t2 {9 u7 W7 o2 L. i  i4 `1 e- d; I
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
6 z) i% J1 b7 _  X, U0 q3 ~ 2 #include "util.h"
9 ^+ c0 f0 P( `$ w6 j) u8 X 3 #include <iostream>
! H; x6 w+ `: D( S% c; a% l0 F4 A 4  
2 ~/ g3 E$ ~6 G 5 using namespace std;
, n7 _* W) a$ K8 R% W9 S: R/ F+ ^ 6  
- X6 r9 L" Y* [% ~' g. @7 { 7 int main() { " i9 L) u0 D* i
8  
) ^4 P/ x; n) p$ R 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
! S2 M5 F+ y& i: W$ @10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
! N# t/ m) J; `6 j11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
2 f* C. k+ u/ L9 Y12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
7 p+ t5 x3 A( g  m7 }13  
7 S5 e2 r( W4 |% G% }14     size_t size_in = hexStringToBytes(plainStr, plain); # e: ]0 i- {: @7 ^" ]/ o! [" h
15     size_t size_key = hexStringToBytes(keyStr, key);
& m% ~3 u; m6 J% P2 s1 W4 }! x16  ' v! v$ l7 n" y6 j) ]- b
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
/ l: o$ Z# [- K9 u/ G4 W+ q18         return -1;
" B4 F; {, W+ S( @4 ~19  ! f  h9 x3 K! I" `0 G& n
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
9 O- J+ j0 N& w+ h2 E: p- \21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
" e% D+ y) H+ j22  # c) ]/ R3 v) K0 [3 {  r
23     TEA tea(key, 16, true); 9 ]' z. l) x+ [9 O! U1 j; x
24     tea.encrypt(plain, crypt); 6 S5 N( C' P6 j. w: H
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 8 M5 Q9 L3 |; ?0 D/ |! m% R; p
26  # s$ I2 E/ ^" ?& N) R
27     tea.decrypt(crypt, plain);
) R+ `+ J9 m5 w28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; + U& P: {/ C; t9 m0 u
29     return 0;
% B& m- w7 [5 l' _+ k! }8 @30 }
; N. F& }" ~9 d  A% C; l2 f
$ m( H# m. w5 v' u) {本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
# A8 P7 b4 `& H( u% H3 |运行结果: 3 V6 h7 G1 x2 J& g) O+ H
Plain: AD DE E2 DB B3 E2 DB B3
, [! U2 Q) v) t5 OKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
7 a4 R9 h/ Y: c. e+ d- I. SCrypt: 3B 3B 4D 8C 24 3A FD F2 " ?- t3 \% |% J! Z; U
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 03:12 , Processed in 0.021578 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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