找回密码
 注册
搜索
查看: 36882|回复: 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轮):
" {9 I9 i0 B) P. ^" X5 N4 Y微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ' F+ A" `" e3 r1 g2 ?# w9 E8 ]$ O
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
6 V" {0 a5 Q$ E$ G6 h1 H1 r. v之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
: p, q/ M+ s/ O2 X0 F在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 , H( v# ?: H+ S2 i: N" U
在 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. * s: l+ A9 {* k8 C6 Z: x
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ! U6 K, G( N8 |! H/ _. E& u
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    3 d" J# V/ [* A
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ' v7 ?" s3 Y" s+ ~
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ' p4 M- a5 x* k! D
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    0 S( S- B( A  @, ?; f
  7.          sum += delta; " ~& |! S& L5 i& C  e+ U+ |
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 7 d6 `0 M* V6 K* u* n; Y2 a
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ - G% t; F/ u9 T) |
  10.      } ' d& d$ g1 Y. ~/ I
  11.      v[0]=y;
    4 Y: o% S* y3 k5 q
  12.      v[1]=z;
    " ~* ?( g8 I2 C
  13. } 8 ^* W0 S# a# g7 H) }  z: Q
  14.   4 ~7 V5 I" |! L6 K$ m
  15. void decrypt(unsigned long *v, unsigned long *k) { ( s  y2 o2 r" i* L! O& A
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) S% z/ c2 X9 R8 n9 K
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    " P0 ?$ V% p: z) ^" h; Q$ p2 d
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ % R9 V/ Z6 K" q( ?  K, O6 I# ~
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ( F! P0 x, F3 c, p/ f; l2 j# D
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    2 W8 c) A; y& c& k# y* B0 y: c
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    8 v* S, r4 l* x
  22.          sum -= delta;                                /* end cycle */
    0 M$ h4 k# T; P! X6 f; z( q: k
  23.      }
    6 s. O; h/ X* o# l7 ]1 @
  24.      v[0]=y;
    9 ^% ~8 ^* m9 Z% I; F$ E( D
  25.      v[1]=z; - _# B& b& \) w$ Z. ?5 s% s
  26. }5 E4 g' u  A- x1 |( @
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
* w% N  Y* Q, L2 g2 X#define UTIL_H
' D3 F8 E; Q8 R$ n3 C$ \  L8 A" f. S; _
#include <string> 3 ~8 I  Q1 }8 k; _9 D- Y
#include <cmath>
. Q# `$ A$ {) o  y#include <cstdlib> , u$ z* P  ~' m/ \0 G1 m

8 b* R1 b2 G  S! e* t9 _typedef unsigned char byte;
/ X- Q2 F- y* j+ c! ~0 Ptypedef unsigned long ulong;
1 p+ h; S1 J$ y7 ]' c" Z
! F1 W4 R# |6 }9 F% `inline double logbase(double base, double x) {
1 |: y* X1 _& X3 {+ }    return log(x)/log(base);
2 n' x; t# E: h$ R}
5 \/ r+ W  J2 E( J; V# ]
% Q, Y1 y: G2 I. P7 L9 r. F1 a/*
7 r. m8 G& W' @* t1 W0 H*convert int to hex char. 3 t" c$ l* Q2 _, T. G
*example:10 -> 'A',15 -> 'F' 5 R1 t" A; \- X( p3 n
*/ % X2 g6 U+ f8 T. `6 F( T$ }
char intToHexChar(int x);
% [% t* C2 Q& o
8 F2 W# K/ B) J3 n0 Q. ^! i/* . A7 L" ^* i/ t$ U' a
*convert hex char to int.   w* S+ N" \* R7 |
*example:'A' -> 10,'F' -> 15
1 T. a, [9 [$ }2 M*/
" s1 X+ `4 e& ^' lint hexCharToInt(char hex); # Z. Y5 `$ V9 b/ n% U& M9 J$ T

  a5 h  q) c. }+ ^4 I* H9 A& v$ Pusing std::string;
+ z) m9 a1 c! o/ Y! B/* . h" T6 m" @  y/ Y
*convert a byte array to hex string.
2 l6 K7 [. N! W4 I( ~4 n: e*hex string format example:"AF B0 80 7D"
  q- k, g; S# G0 L; b*/
7 T4 V: N. u" N  Y) L. k# Z9 Ostring bytesToHexString(const byte *in, size_t size);
( i2 \$ t: g5 K( c" q; j 1 x8 r( j9 |1 z! r1 ~0 v; `; B
/*
$ c9 \: [8 c, e9 M, ?  O+ F% \3 s( Y  h*convert a hex string to a byte array. . ?* u8 h5 I- F1 c, `0 n/ B
*hex string format example:"AF B0 80 7D" $ J/ l' k$ i! V, Q- d
*/
4 m( j: |$ Z$ O6 w" g  Xsize_t hexStringToBytes(const string &str, byte *out); % j/ i1 [. @, M( ^6 s  X
- Q7 e2 m# _) p# w: v1 ]. q* ?
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ) x1 g5 M: J7 o% B
#include <vector> ; ~4 m& o% n3 l8 q% n3 Q

3 c" i. G3 d4 |: S7 B- eusing namespace std;
& T& m* e1 W9 z" m, K) i
( s6 Y% S; }* h  T0 w+ {char intToHexChar(int x) {
6 ^; t; \" s! G; x) a    static const char HEX[16] = { + e7 V9 A5 c; u. o! t
        '0', '1', '2', '3', : I& c, [- m5 S# y& |( c
        '4', '5', '6', '7', 9 K5 c# Z( G+ {9 O  `! f$ n# C! v
        '8', '9', 'A', 'B', ( {# L- \, M- h1 t% O
        'C', 'D', 'E', 'F' ! ?* b+ i. p  s7 [' G* L' u6 @
    }; 5 ?! Q( T% X7 r0 l9 G
    return HEX[x];
8 T4 V. I. S+ v+ A- v}
7 N( i1 J# W* i: [4 S8 o! s+ t 5 J8 f) N4 ?6 G8 Q2 J4 e
int hexCharToInt(char hex) {
1 w8 y- [) B$ W    hex = toupper(hex);
7 d/ S2 Z: z/ X0 v9 v# y+ z% ^    if (isdigit(hex))
+ g* d2 o+ Y& m. b7 C( O- Z4 W        return (hex - '0');
1 V1 n+ K) y& {" T$ B    if (isalpha(hex))
" w: m% h, _+ G8 W        return (hex - 'A' + 10); & E) C; e" R# ?$ J0 r4 b
    return 0; 2 b; H* P/ {% S
}
! ]5 ^% o( V/ j6 W7 r5 Q
; x9 S8 T5 U& q( y8 K9 Mstring bytesToHexString(const byte *in, size_t size) {
! _7 Q+ q, p% j& m: L0 O! z* c8 X, }    string str; " ^  ~' n9 j) `
    for (size_t i = 0; i < size; ++i) {
' V; }, w6 I0 z* ?# O9 u" B5 `        int t = in[i]; " M1 `$ m# z% ~& l. g
        int a = t / 16;
  U+ c  A) H: o. c! i# Y        int b = t % 16; 2 w9 M, Q. l6 u2 O+ ]
        str.append(1, intToHexChar(a));
7 e" x, A" o+ V5 |: L5 ?        str.append(1, intToHexChar(b));
8 r6 G5 F! ~0 A6 ^        if (i != size - 1) " U4 w3 t: L' m' \5 u7 ?: _+ x% ^
            str.append(1, ' ');
0 J$ i( J2 M* B$ C; l2 F. f    } & \, s; f( A" p; @, `
    return str;
* Z, L! V* O3 f6 w  X/ |} $ w1 K* j) S' n8 k' \* n. ]" U

1 Q5 Y' R* q8 h# i# b: t2 V& ]7 Usize_t hexStringToBytes(const string &str, byte *out) { / a- C  S3 v' l9 e0 K% X1 f- P
) F/ V* G1 m8 Q- q
    vector<string> vec; 4 O  [0 j) H( w  D( {* k" S/ t# O
    string::size_type currPos = 0, prevPos = 0; 6 C# t% {# o1 Q4 g0 H
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
1 w  v7 [3 T1 A5 z% L  O' m        string b(str.substr(prevPos, currPos - prevPos));
* c) w, ?* [- R% \* U3 ^  v0 D        vec.push_back(b);
0 U7 R, |! C- y$ m9 M0 w1 _        prevPos = currPos + 1;
* e% a8 L7 X- H: y1 I    } % ^1 u* j. ]- l/ ]  T
    if (prevPos < str.size()) {
( D* e; z2 E7 p. _        string b(str.substr(prevPos));
( k3 b5 g& B2 K/ T        vec.push_back(b); 8 _' Y/ e( S1 s- x6 {" a
    } 2 v5 y' ^% |5 ]
    typedef vector<string>::size_type sz_type; 2 L( W8 A3 x( V3 }) w$ b
    sz_type size = vec.size(); ' L  o( a9 p) p( @& L
    for (sz_type i = 0; i < size; ++i) {
$ ?$ P. ]# |8 j: P: A" d( `) M        int a = hexCharToInt(vec[i][0]); 6 [0 U0 _1 t( d' b7 e  a/ C$ L: |( v
        int b = hexCharToInt(vec[i][1]); , o, r& c8 R0 y3 X* b5 h! _
        out[i] = a * 16 + b;
6 j+ N% t( s9 D  X$ V7 z    } . h7 b' `5 T" l5 ^; \/ h: H+ f
    return size; & {. ~* d0 T1 \/ f1 t; j, K
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
) A4 ?( T* R$ u: t) T; D#define TEA_H
" s2 \, f6 s, r2 v4 f& }; ~
7 f  x% ?8 N- S3 [9 L& r/* % p( e- y5 T7 S7 U% b
*for htonl,htonl
8 _4 y+ w2 g4 }- z' W5 Z- {3 r*do remember link "ws2_32.lib"
& T& u7 m, G' I7 p( B- S*/
4 ?$ n! p* s2 s' }5 l0 ^#include <winsock2.h> * H2 S  c6 ^/ r
#include "util.h"
1 \6 z. e  a+ U- j8 Y. N/ Q, `; M
- q7 P- n( I2 Q, pclass TEA {
& V2 f( y& x0 r$ n- hpublic:
, y8 q0 W' h3 J+ H9 U    TEA(const byte *key, int round = 32, bool isNetByte = false);
) c2 y/ S$ `( Y9 i% ~' f* D0 u    TEA(const TEA &rhs);
7 H7 O- K* B2 |( h2 }$ m% E4 \    TEA& operator=(const TEA &rhs); & c+ Q. `* u% L/ P5 J$ M$ B9 Z
    void encrypt(const byte *in, byte *out); $ P0 ~) J& B5 ^6 o: Q$ ^
    void decrypt(const byte *in, byte *out);
1 V9 a" s+ H! Y2 H* X2 w! b# {) C1 n0 _private:
' X* c0 @0 y* N7 L$ o1 N7 b    void encrypt(const ulong *in, ulong *out);
3 ?% ?, G) {. ^6 o. `    void decrypt(const ulong *in, ulong *out); 5 {7 D) x; `1 ]& b
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
1 d6 g/ T* M" o- o2 t    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
& {- G  F7 f! S9 s& g% L7 k$ ?! jprivate:
5 W0 _9 T9 y9 |$ y" l    int _round; //iteration round to encrypt or decrypt
. O9 m3 _- s% M3 u/ N) D    bool _isNetByte; //whether input bytes come from network ) `5 {, p! W" H; `
    byte _key[16]; //encrypt or decrypt key + a1 l, [5 a2 A  b! P- }2 ^
}; 9 o% h9 c8 k% q, |0 W

5 I0 h1 R4 d% y$ t7 f# E#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 6 T, N! z$ J2 j# ~& e
2 #include <cstring> //for memcpy,memset
, k, {: j2 u6 ~ 3  
0 J5 z$ [/ ?' i* e+ Z: O 4 using namespace std; 5 Z, p' _8 P9 `: }! h7 [  N) l9 Q8 Z6 t
5  3 I* C# S; z% \7 W$ N& W8 x
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
' p  n0 K; `' {% g2 O9 X4 X& ^ 7 :_round(round) 9 {# k' b" A( H8 }9 S, V
8 ,_isNetByte(isNetByte) {
# T# O5 W# ~& O3 K4 {, u 9     if (key != 0) . k" V% _: J3 i
10         memcpy(_key, key, 16);
' n3 _2 }; l1 e& s7 P1 S, W11     else 8 o9 S: |% ?" R
12         memset(_key, 0, 16);
' l! B  n3 Z4 s2 a13 } $ X1 M8 S2 M5 b$ Z& X* m
14  ' H+ O$ ]8 ^8 N4 E% Z
15 TEA::TEA(const TEA &rhs) 6 M) p8 \* U0 j- {
16 :_round(rhs._round)
& @+ y$ X% C9 _2 D1 Z! l17 ,_isNetByte(rhs._isNetByte) {
3 c! ?5 ~# h: I& Y18     memcpy(_key, rhs._key, 16); " M. ^: \' c4 c  \2 y
19 }
" ]& e2 Q3 I6 n! ?20  , a, C* q, a5 i5 a- Q2 R
21 TEA& TEA::operator=(const TEA &rhs) { % s) X9 l" c8 m7 e( t4 M; r- V
22     if (&rhs != this) {
" D; t9 W* E6 h  ?4 N, G' u23         _round = rhs._round;
2 J( r2 z4 W- y8 R# t24         _isNetByte = rhs._isNetByte;
4 a' r6 J4 p6 }25         memcpy(_key, rhs._key, 16);
+ m5 R; E6 O! k$ k) X26     }
$ v" m# f. l- L# A# S/ c27     return *this; ( E! F- c4 @: y" l
28 } 0 c9 {& s3 H8 @, O7 x* }& s
29  + ~7 ]5 ~# k1 ~# n
30 void TEA::encrypt(const byte *in, byte *out) {
8 ?1 p3 C/ l  o% O* d5 K. \1 ~0 W31     encrypt((const ulong*)in, (ulong*)out); $ ^, I+ H9 R- a$ N( K" G$ o
32 } ' P! G/ I0 E8 }3 W7 k! F
33  
5 v, J3 M" F% [34 void TEA::decrypt(const byte *in, byte *out) {
4 l! y# l+ f9 P8 s35     decrypt((const ulong*)in, (ulong*)out); , l9 R' {2 d5 h: y  N  U( I# W
36 }
7 n( o0 _/ g. A; g" t1 [8 K2 h37  
5 Y" C. I# [9 {4 }, J38 void TEA::encrypt(const ulong *in, ulong *out) {
4 T" [8 S! h0 r- u5 \4 v: c8 J39  4 I2 v' m! v7 \* y
40     ulong *k = (ulong*)_key; ) v1 Y- E7 K9 y6 F
41     register ulong y = ntoh(in[0]); & h- D$ b3 b+ j" @8 e" Z
42     register ulong z = ntoh(in[1]); 5 \4 e  `0 |& k( ~: p2 }
43     register ulong a = ntoh(k[0]);
% p& F+ Q/ c, q2 `2 @44     register ulong b = ntoh(k[1]);
0 W$ _9 y, U/ {7 q1 T7 V6 |45     register ulong c = ntoh(k[2]); 8 T7 j2 S1 |$ E5 Q" y+ Y
46     register ulong d = ntoh(k[3]); 1 j. @5 w. D: D( p
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ `. W& d% \' T% T3 M! ?5 O48     register int round = _round;
9 U" T, `9 r' {  m, Y49     register ulong sum = 0; . L2 C3 F8 t! ^2 z: _. |5 S
50  
! W! @' t" @( E- h3 W) X" R51     while (round--) {    /* basic cycle start */ 8 u0 s& o  @* D
52         sum += delta;
; T  `6 O6 K* }* i/ \0 Z) H53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
: O9 E% f7 e4 Q+ x: R54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 8 F" N& G! ^5 c" t! Z( C# ]# B. b
55     }    /* end cycle */ ' `4 F" Q. v8 g& R" E
56     out[0] = ntoh(y); 4 v3 a" Z4 l0 E% A( n
57     out[1] = ntoh(z); ) Z! c4 Y7 i8 @# [7 ~0 X
58 } ; M# C1 V: z7 q
59  : A- f( Y% i4 T/ X( m7 \) [; A
60 void TEA::decrypt(const ulong *in, ulong *out) { / q! ^; k- m4 J# s  m/ D( f
61  ) X' i, }. C! F6 Z- d( k
62     ulong *k = (ulong*)_key;
  b3 G/ k) V% I7 \# x3 n63     register ulong y = ntoh(in[0]);
* s4 l5 c* o, O! w+ T% N64     register ulong z = ntoh(in[1]);
5 ~3 `# B3 h* e# w3 \65     register ulong a = ntoh(k[0]); 6 u0 ~) U4 t6 H0 v9 ^" ^/ U" ^/ ?
66     register ulong b = ntoh(k[1]);
! S; h2 Z5 f1 h: m67     register ulong c = ntoh(k[2]); # R! l  T7 s; g) p+ l- E5 \! ^
68     register ulong d = ntoh(k[3]); * E' d& f4 _( H# V' K; R
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
3 ~2 ~! B2 P5 W8 J+ ]. V70     register int round = _round;
; Q* ~5 K) n; _" s1 n1 R71     register ulong sum = 0; 7 i0 S* X' J/ V6 Y9 r5 E
72  
% k. h' v; T2 }; x0 \; d73     if (round == 32)
! o( ~7 N2 ^3 }; {% z- d( I74         sum = 0xC6EF3720; /* delta << 5*/
7 F7 P8 O2 a! `  V& j75     else if (round == 16) # H' p0 d1 R& Z
76         sum = 0xE3779B90; /* delta << 4*/
. h3 c. `  Q1 j, J) o; L' z$ i* ^77     else
. l: l2 g: M( V( [78         sum = delta << static_cast<int>(logbase(2, round)); 4 @! X/ o) M0 y" V- Z  |, C
79  
! n6 o! A; C( ^" J/ }; a5 u1 c7 p+ ^80     while (round--) {    /* basic cycle start */ ( T, @) b0 x2 U
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
' l& ^4 f* j$ R8 @3 X2 s82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); . r! ]6 Z' o* ^: p2 N. `. Z" c
83         sum -= delta; 2 `. n8 ]) T4 Q) n
84     }    /* end cycle */ ' c/ |  v- I  \3 C. `9 M+ @
85     out[0] = ntoh(y);
( c5 @) |; r& m0 c! A3 }- }86     out[1] = ntoh(z);
7 b/ j9 x0 @- `/ p& K87 }" O( e7 u) W% N) T

0 u& Y: `; c& Z% _- X0 @; w; c需要说明的是TEA的构造函数: ( {5 U) U  A2 E+ o' b5 s
TEA(const byte *key, int round = 32, bool isNetByte = false); / G6 w2 t: O  x4 d- h
1.key - 加密或解密用的128-bit(16byte)密钥。 ! C5 d: Q! a; h( B% {
2.round - 加密或解密的轮数,常用的有64,32,16。
. W  K1 s4 ]7 k4 d$ I( o* G3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
1 B) D+ \6 |1 j3 b4 C! ^: |4 h
" }6 ^, W: @! F( Y+ i最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
8 _( X3 [) [7 s* O! y8 W$ Q0 L 2 #include "util.h" $ c2 N0 J' p6 t- t4 C
3 #include <iostream>
, W- m$ u* O5 Q! c2 F0 @4 r 4  3 J+ o! T; t) t/ z
5 using namespace std; 9 S2 Z) X3 O+ v* C! C" \0 h& G! }
6  0 T. z4 S' T* q- e
7 int main() {
4 C& k% B/ ~9 N3 ? 8    B( Q$ M& d# A+ [# N* q6 u
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
4 W9 s9 L6 c3 P+ N5 P10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
6 w; p$ s# @4 i5 q- k; E6 i11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 8 _6 ]1 x9 G  Y, b' D( Q
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
& q9 P3 ]. S2 o3 \9 O- D13  
( @0 W, Q5 @+ Q; ^$ D3 r( {14     size_t size_in = hexStringToBytes(plainStr, plain); * M6 F7 l2 ]; ~8 x" s6 x6 _
15     size_t size_key = hexStringToBytes(keyStr, key);
" e% D2 c7 }+ @: k16  
1 t: Z! |( J# ~6 V$ ]2 h17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
' ~( @( x0 v' y% b18         return -1;
( n0 N' k' [( m' {8 I1 J19  
& m) Q5 }% |! S+ [4 B: m5 C20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; - S3 a! V; f  `9 j  H% `7 {
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; - H  Y5 `9 |( z2 C- n
22  
: T% P& _8 N; X7 b" ^% N- a23     TEA tea(key, 16, true);
1 W+ b' o. Z. f6 [24     tea.encrypt(plain, crypt);
) `& }) P4 c9 k, U5 s8 B8 R25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ( `/ W7 |1 d% L7 W
26  # v: K0 m2 C! u* A4 `, j
27     tea.decrypt(crypt, plain);
* k) \" k+ W- r28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;   T0 p$ @/ t% e" D0 J: l+ p
29     return 0; % u( v; B9 V6 L0 J5 R: d) v
30 }, R% g  j$ z) A0 G0 q

% \( Y7 S8 N" q& N本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx( l  h7 ^: h. Y; D/ I5 `# w, a
运行结果:
- _) S- a3 N  Y/ Z! r( pPlain: AD DE E2 DB B3 E2 DB B3 # u0 @7 z: m) ^) |. Q  p
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
6 b. Y4 F' ~9 S0 t& A8 b  Z# n8 `- m% \Crypt: 3B 3B 4D 8C 24 3A FD F2 % i' w# s! `' O6 T. E
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-8 23:16 , Processed in 0.035890 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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