找回密码
 注册
搜索
查看: 37685|回复: 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 i2 |% _. H2 x! c! t' a" `# ]* m# x/ D
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。   N6 J  _! ^, s. `9 Q
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 # y" E4 ?+ @9 K7 A1 ]
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
* `9 d; d$ u8 G9 c. i6 D# _在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
2 u, c& {% I/ F2 L在 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. 5 N1 U$ [" {% v+ `' H
  2. void encrypt(unsigned long *v, unsigned long *k) {
    , j5 x& c) @4 f2 w/ S
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    7 Z2 ~9 \* t* n. X
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    ! |/ U3 k4 N: d% W8 Z/ u
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ) I7 m1 V9 e& t3 q8 t0 p, L5 W+ j% p
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ) S1 {2 Z; @* x# a$ P
  7.          sum += delta; , O5 t% l2 e0 |! h: |4 L
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ) n: E. Y$ T- \
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ - [" s3 X3 p4 M. f" j( X6 W
  10.      } : @9 j/ s- T( f. [! j* g# d2 {
  11.      v[0]=y; # N1 @% I# B0 a" r. R  i
  12.      v[1]=z;
    1 ]0 C, [5 m' }) o, G" G: I. p
  13. }
    $ N: l* u/ ]/ K& _
  14.   
    $ o. |$ a3 o* f9 k# o: d( R
  15. void decrypt(unsigned long *v, unsigned long *k) { - }$ S# m; [9 g# O6 {
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ ( Q- Z8 v1 r, Q6 @' v- W6 E$ g
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    : x+ H( f+ V1 I& ?
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    # r1 t# f) O( _& B/ Z4 Y  e
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ . w7 \% }8 b" |5 L1 k, p% q
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ( l' g$ ~7 T* L1 f1 a
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    3 h) J: P: Z' _0 {
  22.          sum -= delta;                                /* end cycle */ ; g# P) Q9 W. Z
  23.      }
    ) g  o: k3 {8 g
  24.      v[0]=y; ! F% Z: ^" j1 a" \
  25.      v[1]=z; 1 F( C5 N( H" W* w
  26. }2 j' {5 t  y0 E; K3 }
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
, X: X$ b! _) X; U3 Y4 P#define UTIL_H
1 [$ g5 Y7 I5 Y0 @" H
6 \+ R4 d" c! F2 F; q9 t) l#include <string>
) C, r" @4 B+ W#include <cmath>
- m9 a1 u( d2 G3 I* U) Z5 C8 q#include <cstdlib>
$ N: H3 b2 g: |  W 4 O$ Y% r* S5 T6 h: P% \
typedef unsigned char byte; " I% w8 y  k5 {* l# H
typedef unsigned long ulong; * V8 S* \% Y: o% ^0 C  v% h% x
7 u8 ]8 V# I5 h9 A7 g" R8 ~: F
inline double logbase(double base, double x) {   ?" `: o! u0 C+ X: p
    return log(x)/log(base);
' i; v! O$ U# D8 r; k, i. n5 Y}
. H# d! k# c; D* o1 V
' U# l* Z5 P9 ~9 k/* - h9 {- @+ f% n8 ?9 u
*convert int to hex char. " s5 P2 H0 @2 @% @$ P3 F
*example:10 -> 'A',15 -> 'F' . K" A- ?# _0 [9 a0 @, i
*/ 9 y  s1 m% g+ ^1 X! B% O( f
char intToHexChar(int x);
- [' ~3 A- M. c
( w6 j6 M" W6 P7 j! Q1 k2 s/ Q2 @0 ?/* 6 U/ a; f# S0 S* Z8 ^6 T" D) y/ _
*convert hex char to int. ; ?7 G0 p5 M% g, r3 L  l
*example:'A' -> 10,'F' -> 15
+ Z, d/ ]) p9 y7 u6 K*/ 5 E9 m) |  Z1 g* @& u
int hexCharToInt(char hex);
- A: F/ W$ r+ ^! H2 X( r
# J0 _7 V9 ?. l) {using std::string;   z9 V. a1 A; K: m2 ?
/* ' S2 M3 D$ l, v0 ~
*convert a byte array to hex string. * J1 f- Z+ C1 }
*hex string format example:"AF B0 80 7D"
9 G8 J6 W2 N  X8 x& u! F*/
- ]: s* m- }7 g9 {, N/ X6 ?* G! ^string bytesToHexString(const byte *in, size_t size); " M+ a! u' e: @* ^0 t3 g6 K
& R+ o/ E* `4 F( t; y4 b. F& \
/* 9 k$ u8 I0 o" v% Z+ S$ o. a* w& e
*convert a hex string to a byte array. + q) R9 y5 q6 X3 e) }0 C
*hex string format example:"AF B0 80 7D"
" I+ i8 g$ _0 v+ |' O*/ ! W. v5 }9 B& y5 P: M. f; V# K
size_t hexStringToBytes(const string &str, byte *out);
' m$ l, K( K3 C8 @2 l+ D- J" c' M
) ~: C0 N/ z5 v6 C; U& H( w/ I#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ' Y9 |- G. |* C4 Q3 D' C
#include <vector>
0 H8 i; E5 ?6 |0 u2 f' N  d * w) s3 m" X3 G4 G
using namespace std; : Z& v/ G) ^( C
! o' L# t  s3 t2 c: o5 o
char intToHexChar(int x) {
0 N& r5 t' L; C" J  W! p    static const char HEX[16] = {
4 x! ~% Q, |( P+ O        '0', '1', '2', '3', 3 q" d9 J8 u, x6 _; A
        '4', '5', '6', '7', 4 b% m4 u; ]! _" [& t
        '8', '9', 'A', 'B',
& H# K" t4 X7 c        'C', 'D', 'E', 'F' 9 |$ M3 Y6 I  A1 k
    };
+ G8 C8 a2 E1 y    return HEX[x];
, f9 V3 D- Y! d4 a: |} # n3 J1 G/ Q: E/ \& H
7 L- X" C9 S$ ~; }& N7 x) u3 }
int hexCharToInt(char hex) { 3 E6 {& B  y9 `# s
    hex = toupper(hex); # T2 J7 K( j+ m, v
    if (isdigit(hex)) % G; y/ |$ L- V. D
        return (hex - '0'); ; _( t6 r$ E& a: I: H
    if (isalpha(hex))
4 X- T0 r/ X7 {! y! j        return (hex - 'A' + 10); + I* k2 J2 \3 L5 a# ^, I5 q7 j
    return 0; . j* ^: t0 Q2 M0 ^* z2 O
} ' l, I8 i  z# R9 d6 q
" H) |4 j! |% M7 X
string bytesToHexString(const byte *in, size_t size) {
3 n" Q, }# x) y    string str; " v2 {- }7 Y4 ]3 n8 ^$ R; v1 P
    for (size_t i = 0; i < size; ++i) { ; I* {/ w! E5 V+ @' r
        int t = in[i];
2 D) K6 `/ k. O) E        int a = t / 16;
* d6 u3 l0 R; t5 z- o5 x1 N1 p" {        int b = t % 16; * w- i9 W% O3 S  v0 a$ \
        str.append(1, intToHexChar(a));
. d" j8 K; W6 t/ ^        str.append(1, intToHexChar(b)); 2 O! ~' A& [3 E" u; l
        if (i != size - 1)
! v! k2 s$ C! Y. \9 F! @            str.append(1, ' ');
& L& K0 D/ M- @3 O    } 5 Z; g1 p4 o% o0 W% J+ |
    return str;
0 p4 t5 E; i3 D$ L}
+ k7 x+ |3 R; S0 D' h# I- F! n9 \ # k$ ?  T+ P) l$ S- Y
size_t hexStringToBytes(const string &str, byte *out) {
$ Q6 e2 U2 l- v( h+ T5 h* K : ]% g$ |1 z7 ?* {
    vector<string> vec; - j5 z1 X8 g6 N/ Q
    string::size_type currPos = 0, prevPos = 0;
+ w) ^; Z2 @; h, J    while ((currPos = str.find(' ', prevPos)) != string::npos) {
) [+ S) o( [: a! X% C: k        string b(str.substr(prevPos, currPos - prevPos)); ( B( C* X- C+ f# l, O8 D
        vec.push_back(b); 7 _5 {9 K1 g* d0 f- O/ S0 R
        prevPos = currPos + 1; 2 q) ?% ^6 v0 }" ?9 U, x( ^& @9 {
    } 8 h! v9 Z2 M6 n3 c3 ]
    if (prevPos < str.size()) {
: N- X) e( \4 Q+ s( E: l' C        string b(str.substr(prevPos));
. l3 [/ a# P% S% I* p, s# n- y6 t- w        vec.push_back(b);
. v" F& n& [. z9 s  K    } , `8 A8 h2 w9 f5 W4 q) F' E( g/ V
    typedef vector<string>::size_type sz_type; 5 [9 y9 o$ M! U
    sz_type size = vec.size();
1 Y$ K8 P6 j* c% M9 U4 x    for (sz_type i = 0; i < size; ++i) {
+ m3 o4 Q* H0 D" Q        int a = hexCharToInt(vec[i][0]);
( g. r0 t- _9 Q. C        int b = hexCharToInt(vec[i][1]); - K/ g' p7 b# {! w; H; ?4 a
        out[i] = a * 16 + b;
( V- k! X1 y6 P+ r3 W$ c0 z    }
& c$ G3 ^  K0 R    return size; 0 c( w% N" v' F' o- w3 I
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
6 D$ ^2 {; {. D/ S% p; T#define TEA_H % Q% c! y2 }% R* d6 C8 d

- y# P7 p: y8 z$ L/ g/*
% h* O% c1 T, X8 l* @8 L*for htonl,htonl ' l0 t1 @* e' @9 l7 w- d
*do remember link "ws2_32.lib"
- p( V; W# C+ O! c, M2 f/ G*/
4 S* Y; C' S; \#include <winsock2.h> 7 W, I+ i7 u* `  h/ H
#include "util.h"
" U2 S# N! G) o) ]: S! {6 u  x 4 \6 Q4 ]. a8 l, U
class TEA { 4 E  G1 N! w- s5 ^: e4 Y
public:
/ r6 m1 n( r& j. d7 E/ }  u    TEA(const byte *key, int round = 32, bool isNetByte = false); 1 J  R- b; e+ Q
    TEA(const TEA &rhs);
" q. R" x: x) |- l. Z& ^    TEA& operator=(const TEA &rhs); 9 `# K0 E, A+ Y, s
    void encrypt(const byte *in, byte *out);
7 R' D0 _8 t8 C    void decrypt(const byte *in, byte *out);
: ]+ ?. \9 z' }private:
9 O( m% J: }, g  p! n: p    void encrypt(const ulong *in, ulong *out); 2 K4 y9 }9 ~; }* m& E( d6 c
    void decrypt(const ulong *in, ulong *out); , A$ K. i7 b. O2 d, K6 E
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 3 p  O+ q' S0 d# R
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } % _/ f% C0 |1 u0 R; d
private: ' }0 g+ Z% B/ R+ p9 {
    int _round; //iteration round to encrypt or decrypt 6 |2 l/ R' _9 @, t' H* P" m8 {
    bool _isNetByte; //whether input bytes come from network
8 H5 @/ s" [4 u: P' }: _    byte _key[16]; //encrypt or decrypt key
( d$ j' u7 X6 \+ \; ^# Q9 C}; % }9 ?* X9 f. s- j  d3 s

5 Q4 t8 ~+ ^, w& G; Y% E* I! P#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ( R) p% f7 ^! S8 A. e$ m
2 #include <cstring> //for memcpy,memset
; S1 C/ c1 |! e/ X% }4 Y 3  4 O0 M5 S, D. A; w3 c
4 using namespace std;   _5 j1 Y' r' A) @8 L
5  
- i0 n$ C8 P5 q8 ?" B8 Q9 |' j* S& u/ U 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 1 \; q# [0 u, }6 ]2 g+ W
7 :_round(round)
& t; D' Y5 `* T$ _" |6 b( E9 h- { 8 ,_isNetByte(isNetByte) {
: y" q% O+ G% t' \- P2 e 9     if (key != 0) 7 q8 i$ V# K! J7 W2 h  x
10         memcpy(_key, key, 16); ! z6 T' q& ^% [
11     else
$ D/ Y5 H! y0 r" A3 a, I: P& F+ ]12         memset(_key, 0, 16); 1 m& M0 L4 \; W2 k/ ]; g
13 }
& m# t7 [3 U" {  l+ F9 B# d3 _  T14  
$ X6 X' h* S  n/ W% z15 TEA::TEA(const TEA &rhs)
8 Z/ ]8 _" y  g! p* N; h( Q16 :_round(rhs._round)
9 t: j6 }& x( E) ]+ i3 Q17 ,_isNetByte(rhs._isNetByte) {
: ~6 b0 z1 H( _4 f1 S0 C. j18     memcpy(_key, rhs._key, 16);
. Y7 d! l! Z0 a/ y- }' t19 }
3 t; Y4 {" x' y& n) V# N20  7 k& ^0 t. G' _$ z" z% a$ L/ n
21 TEA& TEA::operator=(const TEA &rhs) {
1 y: @9 k& n2 v: h0 O6 h22     if (&rhs != this) {
8 }0 P; n3 V$ @( t( x; f% ?6 Z+ f23         _round = rhs._round;
% u% ~+ v! r; K24         _isNetByte = rhs._isNetByte;
" M* A/ {9 z$ h' t$ l4 K) L25         memcpy(_key, rhs._key, 16);
8 F4 o* k) t+ V* k0 Q26     }
, Q4 j4 V( J9 b7 N; ~27     return *this;
! y( v1 c" m7 v  U% b28 }
3 W0 u. P  K* m" Y; p7 K29  : H7 f: R8 Y/ c$ y
30 void TEA::encrypt(const byte *in, byte *out) {
" R1 f2 c+ Q+ \5 b, R/ g% \0 a31     encrypt((const ulong*)in, (ulong*)out); . x  c5 y0 K$ X0 t# @! ]
32 }
+ p+ Y) c* _7 Z, j0 Y3 d9 }33  
$ X5 g5 P$ r5 ~' V; @' Q( l/ {; w34 void TEA::decrypt(const byte *in, byte *out) {
8 w) }4 b  e1 r) n9 m35     decrypt((const ulong*)in, (ulong*)out); ) R; V# s7 @( X: ]4 ~5 L* K- e
36 }
$ J! I/ {9 C& v37  
6 G5 R4 w9 }; _% W5 L) ?. I38 void TEA::encrypt(const ulong *in, ulong *out) {
5 m# x. w+ A' R, G6 k$ Q+ ^8 _6 R- m39  
) O6 x2 `8 Z& y/ R* Z6 J40     ulong *k = (ulong*)_key;
2 X0 P# ~3 n0 [% t( r: j) }41     register ulong y = ntoh(in[0]); ) _* k* v0 w. l* g/ V
42     register ulong z = ntoh(in[1]);
# f$ ?: L0 m) J+ y43     register ulong a = ntoh(k[0]);
: y1 Z9 |9 o* ?9 e& e& e0 P  I% S44     register ulong b = ntoh(k[1]); . e: X) u$ @, y
45     register ulong c = ntoh(k[2]); 6 i" U7 d2 X# x- ]% i  s) v
46     register ulong d = ntoh(k[3]); 0 g; a9 C' Y# Q3 z+ X! h5 ~
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
% z# N. k$ k: b( H/ J0 R0 h48     register int round = _round;
9 C/ v* f$ f: R* A4 ?$ V49     register ulong sum = 0; - m$ B* x$ b* m' g) a' @
50  : L1 D' W! F. o* o+ E7 l8 l4 d
51     while (round--) {    /* basic cycle start */ 2 q  D. R- k, ^$ c( C
52         sum += delta; - L5 v( j8 p, ^7 G; k- ~! R: ^
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 4 z; |+ h7 ?* D3 \# s3 i
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
- _; F" x8 g1 c' b% |  Q55     }    /* end cycle */ 0 v' U2 w! [8 \/ G% h2 T
56     out[0] = ntoh(y); . ?" O+ K$ T3 i
57     out[1] = ntoh(z); 2 Q8 [' Y) x# p3 [. R
58 } ) b, u. ]  h4 p7 ]1 N! f0 k
59  , h' i+ s4 l+ h' Q9 `+ Q, j4 U
60 void TEA::decrypt(const ulong *in, ulong *out) {
8 N$ o) J, Q7 o1 l% q2 o0 `61  
( q% t/ e3 ?* K# q) X62     ulong *k = (ulong*)_key;
) W9 T$ V- r; }6 Y6 e5 `; S/ M63     register ulong y = ntoh(in[0]);
. i' }! H3 d! F# d2 ], g1 R8 ^+ E, ]64     register ulong z = ntoh(in[1]);
& V+ Z0 A# o: ]( R: Y4 E65     register ulong a = ntoh(k[0]);
' u+ P7 s0 C5 o66     register ulong b = ntoh(k[1]); 8 {4 F- o" f" V  l
67     register ulong c = ntoh(k[2]); % o- v2 W# w/ |; B  ^
68     register ulong d = ntoh(k[3]);
, _" `1 Q" f( l69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ # X0 C2 q* E& k( j* g) @! F5 F
70     register int round = _round;
; U2 }" e; w" ?9 e71     register ulong sum = 0;
6 Y+ G& d5 {: L7 k2 D2 M( d8 R72  # Q: p' S0 Z' F# H" K4 J$ ^
73     if (round == 32)
. C+ |1 i* z1 u- G9 x74         sum = 0xC6EF3720; /* delta << 5*/ 2 F, m; E; o' g- [; H
75     else if (round == 16) ! v1 }* Y" T0 f( `
76         sum = 0xE3779B90; /* delta << 4*/
& ~% u# g+ X% ^, i2 @* H77     else
: F" _2 @1 d9 s9 ~+ j6 |78         sum = delta << static_cast<int>(logbase(2, round));
& W5 L3 R& g1 s3 Z4 G; C: r' W& h& H79  
6 h. A, Z& V1 Q: _$ A0 G3 d$ G80     while (round--) {    /* basic cycle start */
2 o$ G/ ?4 [2 S9 L% E+ f1 O81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
! o* x- i0 s; b7 R8 u7 T82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
' G  G! Z" d+ Y" b, j) _, k$ k83         sum -= delta; * z7 K* T* J" @2 [9 v! Y
84     }    /* end cycle */ 5 F: f1 b0 S* t5 W. E* C& o
85     out[0] = ntoh(y); 4 I' \9 H: @( F) O$ n0 Y' R
86     out[1] = ntoh(z);
( u4 n. W1 ~% B& [' d. K( `2 O- @: X6 W' P87 }; N9 M% y2 z  g" L+ s, u8 ~6 E% |
6 d0 n; w3 o0 m/ I
需要说明的是TEA的构造函数: 0 m- J1 g: G, n& }
TEA(const byte *key, int round = 32, bool isNetByte = false);
; `8 L- J, d, F- e: L& a1.key - 加密或解密用的128-bit(16byte)密钥。 ) \0 O# {  m' T# Q
2.round - 加密或解密的轮数,常用的有64,32,16。 ; M3 J, z  @5 Q8 ]# z5 _2 r( r
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
- M8 Q7 `, N& I9 a  C& F
3 }; n# U0 ]) ?最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
0 e( B7 h( Z( _# G 2 #include "util.h"
1 p$ h% K8 y" q+ [ 3 #include <iostream>
% C% u! F2 x! _2 v% [& g8 B6 _ 4  $ S6 g/ K% O0 y/ f; N7 O4 x
5 using namespace std;
; C) \  o% h, ~6 y: Z$ z$ g 6  ! u: u5 B; G  h+ u) Y) }
7 int main() { ; O; ]0 T8 v4 h5 o. o
8  " G; A/ t" }( C' ^! f. \1 @& F
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
: M. ?8 r9 _  }% Q9 v+ |10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); / L' c4 v3 Z6 Z, ]
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; & b$ e; T( l5 ~$ I
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; % D8 Y) W/ |1 ?6 D8 r/ n
13  
# Z5 w- b! T/ Z) X7 k9 G& {+ N& |14     size_t size_in = hexStringToBytes(plainStr, plain);
' H( b' C! P9 u' f, P15     size_t size_key = hexStringToBytes(keyStr, key);
0 U0 j- k. ?* B8 h" d16  
1 {7 ~: |' t0 `& p) I% J6 _- R17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
. }1 S* b/ R. E- \' W& _( X& N18         return -1;
  \; i; d$ z5 ~( t2 D) a$ m19  ) s) L4 R7 H5 K: d
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
6 b' C4 D' W: p; x21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
7 z7 @0 S; c5 t6 P+ H9 I; Q7 `; K( N22  9 V3 v5 g& c  n# Q
23     TEA tea(key, 16, true); ( l3 g  D$ J" j6 r+ V/ A
24     tea.encrypt(plain, crypt); 8 l% o7 ]/ l' {
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 6 Y0 [0 j/ E* B' c& `
26  
* g8 N2 n9 q9 y$ F' \27     tea.decrypt(crypt, plain); 2 T, A7 h, r# T" V5 V
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ) K, D9 [- k6 G+ ^
29     return 0;
1 q- y& x0 Q2 _30 }
5 j4 v  g9 W9 _$ l# [0 F" l  T0 O; w  G
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx$ o5 B0 ~( q8 N
运行结果: / N& e& p! |, m; d4 [
Plain: AD DE E2 DB B3 E2 DB B3   K- g/ h$ h2 A1 w' h# l: t% o
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ) r% g( X- B! Q5 c1 Z+ R# l: Q
Crypt: 3B 3B 4D 8C 24 3A FD F2 0 ^! N) r# i  v0 ^' F6 K1 _
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-14 22:03 , Processed in 0.022175 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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