找回密码
 注册
搜索
查看: 37858|回复: 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轮):) x8 G# k6 f9 t5 y
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
" F" l; P+ h" Q2 B$ `" T" XTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
0 ^4 B( y. Y' w! e! [之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 # _- {8 E& d8 e" S/ Z4 P; h& o
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
7 a6 p1 |2 Q( v' _2 R- b1 t在 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. ! C8 p* l/ R$ e: Q: e9 h
  2. void encrypt(unsigned long *v, unsigned long *k) { 5 r; B. a6 @% h9 g+ O
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    2 ]$ N. G# e/ s9 j% C/ |2 w8 S
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ! b  R. `& |' k9 N1 T
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    / _  H) [' t! Z2 q0 J, F# t
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    : k% e4 j# V; |1 }* }
  7.          sum += delta;
    7 n' q7 I. n% I  B0 s- `  h3 w* S$ l
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ) a8 b2 _. ^- }" x5 J( g9 J+ t4 ?
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    ) D/ K1 ^6 s, a2 B0 {  Q7 R2 {1 Y6 e
  10.      }
    " O5 W* k7 J4 i+ v! R4 k0 z8 ]
  11.      v[0]=y;
    : D. T- h) l3 N0 W. k6 E
  12.      v[1]=z; ; L5 ?! u% C2 f5 P9 O
  13. } ! t6 A6 o4 L* ?, W
  14.   9 \( C) _% M1 d7 f
  15. void decrypt(unsigned long *v, unsigned long *k) {
    & c7 w' |1 P1 i
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ + P3 Q  a9 p4 q" u. V; s6 X( K; G
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    5 u" K; _. Z6 J) f0 f0 `
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ & F+ [: s- z1 g
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ; v7 W) B7 X* A. p
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); . h" B- e' L% ?1 k7 T+ s8 n/ h* u
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    7 r+ r9 @8 r( B
  22.          sum -= delta;                                /* end cycle */ 4 ]& _( F8 S# |  \2 Z
  23.      }
    6 B- ?; u" @- ^% t7 T; [
  24.      v[0]=y; , `/ n7 [" @' z; o5 I: B& Q
  25.      v[1]=z; ) [+ ]1 {; Z$ x9 h: C
  26. }* T2 @3 |6 q  y7 i* a) h
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
. k6 t; ~0 w5 S/ D. f#define UTIL_H 4 _7 ~$ l! i+ s' t

/ c2 m/ Z0 E9 i1 D#include <string> ; ^6 T/ i4 a( |5 c# X! n* _
#include <cmath>
/ A1 Q: h, T, l0 i# d5 y8 o! z  t#include <cstdlib>
; n6 i" L: q0 e! }' t - m; k# O( J4 P# e; P' x: r
typedef unsigned char byte;
) v2 p& v6 Z6 ~0 ztypedef unsigned long ulong;
0 H" |/ Y/ \" g ; x, z! ]+ ~% q9 ]/ A- g
inline double logbase(double base, double x) { 0 H- ^! `* m7 X0 U
    return log(x)/log(base); + N% ^7 t8 u7 v  v( ?
} 8 f8 ?8 ~' q+ f3 ?
7 s- `$ ?7 [; O4 V5 D
/*
! m1 a: A) U) `4 N! Y*convert int to hex char. ( G( Y- ~) w8 F: @: g; C8 R
*example:10 -> 'A',15 -> 'F'
8 W* j1 D. P3 @' ~*/
9 A: c* ^3 n+ {5 C& n( Mchar intToHexChar(int x);
6 M% n7 ]  c4 @, Y 0 b; A! }8 a4 d, m) H4 n
/*
  ^/ Z3 Z# S; i+ [) P*convert hex char to int.
/ x# i4 S7 a0 e" Q! E! @0 q" F9 Q2 P! L*example:'A' -> 10,'F' -> 15
' M, E' y3 O3 d3 j* Q+ A*/
: B: P1 F/ A1 yint hexCharToInt(char hex);
4 Z0 P" C4 C* `$ v. y. v5 Z
' A7 f- n( j& q+ f& Gusing std::string;
. u6 O& B* N* Q) S. r/*
) o) g; T7 k) p( ~1 h*convert a byte array to hex string.
* Y! Y* Y0 u4 `  Y1 b! Y7 m1 R*hex string format example:"AF B0 80 7D" % A% b$ X& m+ E$ n
*/ 4 _9 ~) D, n* z8 ]8 u# E( z
string bytesToHexString(const byte *in, size_t size);
6 _% T4 |+ B. F" }& c 3 P4 N6 o7 r6 J1 [
/* " L$ S5 M; g: M# o8 O
*convert a hex string to a byte array.
) ?# \5 G: q4 g0 G+ t* Q6 ?*hex string format example:"AF B0 80 7D" ; S. p, }7 G9 y, R7 H
*/ ' P: T3 |1 H2 a0 f3 ?$ R0 k) B
size_t hexStringToBytes(const string &str, byte *out);
0 ?3 R" |3 C2 r4 a  x! `
' n1 K% Z: o* n8 X" I#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
6 U# N  q, b  r+ \( N9 ^#include <vector> 9 {9 B& y; ]" Z

% k, E8 X+ }( x7 k5 Ousing namespace std;
% [3 }2 a" E" v( ?) B' o . I7 ], m! e  d9 |+ m" ~( h) ]% j% Q2 L
char intToHexChar(int x) {
8 b5 e* H2 d* @* Q  b    static const char HEX[16] = {
( e8 X% Q3 p4 R5 V9 a, N4 {        '0', '1', '2', '3',
3 e$ N1 [9 f( w. A* @4 C3 u        '4', '5', '6', '7', ) z) u) m$ \" v$ b9 L" \
        '8', '9', 'A', 'B', ) k  t: h" a8 j9 P1 u( r
        'C', 'D', 'E', 'F'
- b6 o7 l. y% p/ l3 F  }; C3 r    }; - C4 D  i" ?; ]) x0 C8 a; K
    return HEX[x]; 8 ~/ D" a" D. D" A* s! D
} , s2 x1 e6 F: C+ ?: `7 k( P

& w9 i9 B) ?* s: iint hexCharToInt(char hex) { 5 W1 ?0 z. ?* \* A' j: g# D* z
    hex = toupper(hex);
" {( N% W: ]0 l    if (isdigit(hex)) * O& U  U# ~/ _$ }$ Q+ R
        return (hex - '0');
  }$ ^5 t7 O: ?$ ?4 l% i    if (isalpha(hex))
( n! N$ w& ]# x7 p$ m2 G" Q5 D! P        return (hex - 'A' + 10); 2 Q( ~8 E! r  S; W
    return 0; 3 e% o/ u6 d. ?2 s
}
5 I+ l. x- {' ? 2 O, L4 l  D) C4 ]5 d
string bytesToHexString(const byte *in, size_t size) {
4 V" K5 ]3 y2 e0 T4 f9 u    string str; ! p1 Q* U3 s. F  m
    for (size_t i = 0; i < size; ++i) {
9 ?9 G- ~, T$ Z' i4 ^2 X        int t = in[i];
2 g* U5 K0 y, }  A2 h        int a = t / 16; # p7 ?! I% e1 _
        int b = t % 16;
$ i+ K/ N& T, z        str.append(1, intToHexChar(a)); , f0 _/ j, d9 |* P! h9 J! X  H8 |& A
        str.append(1, intToHexChar(b)); * a# r$ Y7 |0 [2 [8 K+ ]
        if (i != size - 1) & d7 b5 f2 s6 i2 S
            str.append(1, ' ');
4 h; T. F# m) t  k    }
! ^0 ?# C( n! h9 j" A" |    return str;
# z; p4 ^. U8 D- z} 4 V& e7 q1 a- T+ a  X. a7 \
0 [6 I% D7 u! j( y
size_t hexStringToBytes(const string &str, byte *out) { + I- A- [9 S- h; e$ F1 j
# s1 E9 b4 [) H0 P- u* U
    vector<string> vec; / k$ K  J; v9 |* F9 w* h5 s% f' J
    string::size_type currPos = 0, prevPos = 0;
! E6 D, n+ o& E  N% A, Q: w    while ((currPos = str.find(' ', prevPos)) != string::npos) {   D, P; a/ M, }4 q# `1 C
        string b(str.substr(prevPos, currPos - prevPos)); ' x$ i8 A. d' B' J3 M) w
        vec.push_back(b); ; m. R. ?; g" V4 G
        prevPos = currPos + 1;
% `: B1 s' ^% K9 L5 p( b    }
* D2 x6 r: b$ S; [4 |4 u3 O2 ]    if (prevPos < str.size()) {
% H7 o6 t7 o. P) F- ^        string b(str.substr(prevPos));
. Y5 i- ]& [& X$ t# Z3 U        vec.push_back(b); 0 [& x& a: R. @  R/ V  q5 H
    } ) C( Q; M/ E5 |
    typedef vector<string>::size_type sz_type; " r+ V7 u& u' L2 U. z
    sz_type size = vec.size();
9 D5 X3 f& T# F5 x6 I    for (sz_type i = 0; i < size; ++i) {
$ P6 a: ]6 Q0 C& Q& C        int a = hexCharToInt(vec[i][0]);
" C4 U, |1 N$ v! l% L) C3 }        int b = hexCharToInt(vec[i][1]); 0 N/ o4 X6 U6 P1 o3 J
        out[i] = a * 16 + b;
+ {$ r6 L( y' Z; m    }
* T3 x: V0 J) o    return size; . D1 v4 Z" y! U( g& F
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H 9 @) ~; Z( f* e, D6 \
#define TEA_H 4 A7 e5 k4 r0 Y; f: ~

! O: b3 t  w( @/ F( P/*
* w: r. k5 C3 Y*for htonl,htonl
; h! \1 B- C# ?! N# W5 ^*do remember link "ws2_32.lib" / V* R3 o. _' |/ z
*/ ' i# ]; s" r: [/ t6 d( w
#include <winsock2.h> 3 h" \. J) [" E* `2 G$ O
#include "util.h" ( U+ w, L. `5 z, n6 v

# {+ ~" t" @1 g% Nclass TEA {
# s4 I, A8 ~7 Q1 M  Spublic: $ A; j& A9 b! j% }
    TEA(const byte *key, int round = 32, bool isNetByte = false); 5 I8 `( u6 E5 ~
    TEA(const TEA &rhs); 6 X5 K3 V4 I3 U8 p6 L  ?3 T* G
    TEA& operator=(const TEA &rhs); / p1 t1 o' v  V3 o5 g/ V
    void encrypt(const byte *in, byte *out);
2 H/ ~" P1 m2 r  m3 P+ t1 r    void decrypt(const byte *in, byte *out); + P2 ^" E" D& P$ {
private:
4 F6 c" C( r( N' a5 k; N. y    void encrypt(const ulong *in, ulong *out);
- J7 x5 w0 C9 K' W- c    void decrypt(const ulong *in, ulong *out);
7 |+ f0 _& e, d$ e) Q" R- L    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
; s7 Q" [% ^; A9 r- u6 O2 ~    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
8 P" K1 N0 B$ eprivate: 0 e+ _& p- A( }! a* V
    int _round; //iteration round to encrypt or decrypt
9 Z. F% k! A/ R    bool _isNetByte; //whether input bytes come from network
8 V) [# q. F& \& T" v; G    byte _key[16]; //encrypt or decrypt key
  v; \/ r3 p0 T. [) n/ G}; 9 |( b! {6 J! f% L8 o

. d* @) X5 `9 J2 v! o#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" # B* d# I" F( y$ F* Z' r
2 #include <cstring> //for memcpy,memset
8 }- a; \) M. y 3    F5 @' j6 R  k- n, {
4 using namespace std;
1 w- |6 G' Z, Z& i  X 5  
4 V" S2 p0 X4 a# i& X$ [4 l 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 9 F$ Z. B( U. y
7 :_round(round)
6 }" H/ z- R8 ~! ~% X+ _ 8 ,_isNetByte(isNetByte) { ! s" T# l; c: @8 R) s+ w3 X( n
9     if (key != 0)
$ W' v# O7 A8 N# T10         memcpy(_key, key, 16); + `8 X( I, W6 N0 J' t0 b
11     else
0 a7 c" M0 h$ A: I' y) {: {% e: i# T12         memset(_key, 0, 16);
' B  [' B4 q- }  A/ _13 }
* o& y' K8 K9 E, D7 q14    V9 l7 n$ H) t2 L+ t5 R
15 TEA::TEA(const TEA &rhs)
) ?, o& }* t" R16 :_round(rhs._round)
- @  |+ g5 `% O1 F) `17 ,_isNetByte(rhs._isNetByte) { : P5 b! J* D3 D% {+ E: m) \
18     memcpy(_key, rhs._key, 16);
" X6 `/ \2 X! ]/ j19 } + Z9 m6 U- I: S
20  % N7 [+ I2 ?: l& O
21 TEA& TEA::operator=(const TEA &rhs) {
0 t2 F" J$ C4 b  ?3 F1 @6 r' ]22     if (&rhs != this) { " I: [& d4 U) l9 o- z+ w
23         _round = rhs._round;
! O. e1 E( r7 D1 j3 E* D24         _isNetByte = rhs._isNetByte;
5 ~  b% J/ p: u6 k8 ~25         memcpy(_key, rhs._key, 16);
6 a# x' ]$ I$ U$ F. u8 R5 i9 D. i26     }
4 a% }9 f  c" \27     return *this;   G7 K- |: |& H) u9 ~
28 }
. T* L, ~, ^; b29  
7 u3 E0 {4 P+ C30 void TEA::encrypt(const byte *in, byte *out) { 9 h. ~7 V2 u1 W! K# D- `- D
31     encrypt((const ulong*)in, (ulong*)out);
; X. {7 o; }  f4 q+ N32 } $ ^( A1 E" M) S* r7 m3 c3 a5 D% l5 p! `  ^
33  : G6 D, x2 ]/ m4 P
34 void TEA::decrypt(const byte *in, byte *out) {
- G% [' i# I+ E7 A) D35     decrypt((const ulong*)in, (ulong*)out);
4 x! N( h- P* `- B. }36 } ) d8 Z/ O0 y* O, B8 o' Z9 t, n9 P
37  - r6 \6 B2 H& C' h* x
38 void TEA::encrypt(const ulong *in, ulong *out) { - s7 D# x/ o+ y5 r; J5 E4 }' Z
39  
- q' q6 @( E5 ?1 C* `/ i. Y. T40     ulong *k = (ulong*)_key; 2 J! m4 f2 H* v1 n5 ^1 y! i/ \3 C
41     register ulong y = ntoh(in[0]); 9 b( U9 y" u4 X/ f+ p! I% B9 `/ s
42     register ulong z = ntoh(in[1]);
) U. |3 f: R: K: }43     register ulong a = ntoh(k[0]); : Z4 A, @( g3 ?8 I
44     register ulong b = ntoh(k[1]);
/ b, w5 N+ |& ^2 o% e* u0 [# \7 b" f45     register ulong c = ntoh(k[2]);
9 p0 Z! i! w/ }: E$ z" |46     register ulong d = ntoh(k[3]);
8 q" {1 E" X  ]47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
9 B7 ~6 ?" X8 Q, X% a48     register int round = _round;
3 e5 {$ c& u% L; n49     register ulong sum = 0; 6 o; T* P7 a8 [1 }
50  
8 L( G* r" M. l0 m% A51     while (round--) {    /* basic cycle start */
5 b4 q: L5 g- F7 U0 C52         sum += delta;
' u6 ~2 S0 i$ g2 h53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 0 F( O4 f1 W& p) ~
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 4 N) H' a  ?+ \4 N
55     }    /* end cycle */
( C/ H! b1 `4 f  [) p! S56     out[0] = ntoh(y);
/ j& I" n$ l+ R8 z57     out[1] = ntoh(z);
8 l5 s7 [- ]% c% i58 } 4 L) @6 {9 E" U3 X
59  
' ^" j( V, b$ I- A! }60 void TEA::decrypt(const ulong *in, ulong *out) { 5 K! I6 s  x& X# ~3 O, u  \
61  
: I  A' m/ \$ U9 f1 f* h" l62     ulong *k = (ulong*)_key;
/ K9 C2 A3 Q+ Z: d1 U63     register ulong y = ntoh(in[0]); 4 ]8 O* L# w; f& \
64     register ulong z = ntoh(in[1]);
4 U. ~* o$ b' [4 \+ J65     register ulong a = ntoh(k[0]);
0 X( ^# B' a  {! F: u8 i& V: S66     register ulong b = ntoh(k[1]);
! W$ `) ^: o0 Y. {67     register ulong c = ntoh(k[2]);
0 Y7 Q+ ]# V0 Q68     register ulong d = ntoh(k[3]); - t1 |4 |6 u  \/ B( d8 ?
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ : i1 E* N' ^+ q
70     register int round = _round;
' R5 ?. X- C6 Z2 T9 B8 j71     register ulong sum = 0; 2 f1 ]& C( K* A, C0 V7 g
72  
- V# a% t7 L8 \/ t73     if (round == 32) + T( y) N+ f6 [  w% H
74         sum = 0xC6EF3720; /* delta << 5*/
# A3 n' I6 \9 j9 U6 G75     else if (round == 16) ( r0 g$ R1 N: g" p
76         sum = 0xE3779B90; /* delta << 4*/ 5 A" V- A3 F5 B6 Q- A6 h
77     else 6 K3 n8 w7 ]' R% ?7 H  X( X
78         sum = delta << static_cast<int>(logbase(2, round));
, a7 u: Y0 S" {- t2 ~/ I79  
! b, @6 p1 |3 A2 b* U2 J80     while (round--) {    /* basic cycle start */ - s! \7 u  }2 y; h% M- B- r& u
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
# r7 J: j1 U0 Z; T! u" S5 U82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
6 V9 ?& M3 C# I0 Z; m83         sum -= delta; 8 |7 |* e9 Z6 s+ m
84     }    /* end cycle */ . r* D4 C' f8 \2 t5 E4 s
85     out[0] = ntoh(y); 3 ]( D8 c3 c! U7 A! K8 X/ ~& i' a
86     out[1] = ntoh(z);
) }4 @* o' R7 k9 F87 }
' C& B2 s' b( N9 @% i
3 ]& X4 U9 b# B* E0 {需要说明的是TEA的构造函数:
) _! d( q, E2 z/ r7 GTEA(const byte *key, int round = 32, bool isNetByte = false);   ]  N/ a6 t' R
1.key - 加密或解密用的128-bit(16byte)密钥。 8 k& `" M9 }0 H
2.round - 加密或解密的轮数,常用的有64,32,16。
$ p! L! ~. f& S3 h3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ! [' C/ @/ w2 t

/ Y) w" \. C% E" ^5 A" s' |; F; b最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" * O: w: n' q: D1 ]& k! d. ]
2 #include "util.h" 4 F* d4 j# I2 X0 W
3 #include <iostream> 9 w$ ?! |; {1 w$ N2 t! U/ K
4  * p& w4 g4 W! I% l/ M
5 using namespace std;
$ e# G0 @; v4 Z- `! p. T! z2 K 6    U5 i& x! r3 a1 _
7 int main() {
3 {; V$ h6 ^5 {+ F% [2 b& z' L 8  - y9 y7 z9 [! N8 e
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
/ [3 w0 T' X- B- B5 X4 ?" E10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
% j. P' a9 Z0 |; Z11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
  G7 J+ A/ @2 @2 h; x: }# _12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
8 _  t" K. U9 r/ n4 F13  6 z$ N! Q/ x+ H) N
14     size_t size_in = hexStringToBytes(plainStr, plain);
- H. i' E5 Y5 S6 P& x0 ~. Y$ Y( e. m15     size_t size_key = hexStringToBytes(keyStr, key);
8 V( z$ r! M# ~3 V" h' C4 w/ V) r16  & C! k' r$ F4 _
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
) O+ n& D. Q) D; B+ a9 N18         return -1;
. e* m$ h) \/ m$ R8 z  q6 Z19  0 m& _* d9 |2 m" I. B- m( Y" `
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; : S8 z  i- y4 Z" u2 Q
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
1 o& ]/ e6 J) ~* u/ M22  : f3 P" \# }) [$ |2 Z+ i+ j% G
23     TEA tea(key, 16, true); : U0 d9 W  d! @! \) Y7 X
24     tea.encrypt(plain, crypt);
5 n) B! A4 F7 p25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
% U. {8 c! F6 D2 g26    ]9 B0 p, u& h; u# u8 v& T+ i) G$ J
27     tea.decrypt(crypt, plain);
- `1 l! P# M/ K$ |# I6 g3 Y- t( Z! y28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ) Z5 ~- j4 @- R- ~
29     return 0;
% y' H. N+ F" S& G- }( J9 l4 o30 }3 S2 H6 t% }* J8 D1 R/ f
7 p: q( m0 \  ]! P
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
' ]. v" T# q' G( G运行结果: 7 i7 g7 d9 i. K  Q9 E3 u
Plain: AD DE E2 DB B3 E2 DB B3 ; L$ u; i( Y, r! A* _
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
0 l5 X; P2 v) M% z0 z3 @5 D1 B' H+ xCrypt: 3B 3B 4D 8C 24 3A FD F2 " l6 Q, n5 q8 M# K7 H/ R- w4 I- e
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-2 08:15 , Processed in 0.021683 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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