找回密码
 注册
搜索
查看: 37397|回复: 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轮):& k5 j+ w% `: y- G' x) J" y0 J, I" i2 g
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。   c5 ?/ v) E( y; y+ v/ M
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 . i- ^0 Q0 X9 a0 R, ~
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 1 c7 c, r3 x* h5 X5 l
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 5 R4 }% u8 G8 g- S5 P
在 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. / X  ^5 A& a( w. x* t  F5 X+ H
  2. void encrypt(unsigned long *v, unsigned long *k) {
    ; k% H; [( h3 Q; a# M
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ / _0 ]# j8 Z+ [- y8 P# U
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ $ O- [' v( k1 n& Q3 D8 Y% `
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ : i1 L6 g* `2 |
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 0 w, m2 h2 M2 _( P8 z4 i/ E
  7.          sum += delta;
    ) k$ `+ E6 b8 N: p: [* g
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    / C0 |# W6 z6 S$ ~
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    + [8 L3 t/ V& ?  @& _$ R3 H( R: n) f
  10.      }
    9 P% d, i" y; J6 c3 a& O
  11.      v[0]=y;
    , e0 K0 W( ?  B* d7 C/ f
  12.      v[1]=z; : G2 }4 O3 e0 V9 p; n3 A
  13. } 3 Z6 O! |3 |/ ?5 G
  14.   6 e" w  K" h6 p
  15. void decrypt(unsigned long *v, unsigned long *k) {
    4 l  r# s& H1 R4 c4 @; Y
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    2 R1 B& T9 S/ H8 t' V+ L# q
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    8 K2 E2 l4 ]) I# Y
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ & z  f# B5 |4 e& p" T& _) {
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    . d- o8 f8 W+ o2 \( q3 t& k/ S# \
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 6 S% P" j' ~. `& A  R; R" j
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ( Z5 N" `9 Z1 n& B7 b# ]
  22.          sum -= delta;                                /* end cycle */ : S/ e9 \' K4 C% A! B7 W
  23.      }
    " H! Z3 a9 H7 x
  24.      v[0]=y; 1 ~; f9 k* `) P# z! [9 p' J9 u
  25.      v[1]=z;
    % K6 q6 N! z' m3 o( f3 K" p: K
  26. }" i6 w2 H& _* e8 ^
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
9 U2 k. p# }0 l/ t9 H" T, e. l#define UTIL_H
2 T1 p9 P& n6 y5 J9 W; T. c
- d- }- u) [9 F/ B8 j% h#include <string>
+ ?$ z6 M9 L3 n6 |/ O#include <cmath> - v; T  l8 H$ \# \5 h
#include <cstdlib> / p4 }3 d2 ?7 g  i6 @3 n
( v. b" |4 E6 |& V5 N
typedef unsigned char byte; : v9 D/ w" k) z: {, g" m/ t% o/ M+ l
typedef unsigned long ulong; 5 ~" v5 q5 D" F6 y7 `
9 W- I$ F, D: L
inline double logbase(double base, double x) {
7 A; O' {6 m6 A  L1 R- O    return log(x)/log(base);
6 Q. p; ?* T; T+ l; D}
9 t# v9 q- i% t* a# B) o) h - o2 E& Z4 ^# y3 e: ], _5 ~
/*
. k3 S& t+ K6 y! c$ A*convert int to hex char. 4 U$ v% R( ~# j6 l4 B
*example:10 -> 'A',15 -> 'F'
# z/ e9 }  Z, o# b, o*/ & w; R7 ]- ^. L& O
char intToHexChar(int x); 2 w* ^/ s4 u" U' O

' r/ t% a0 y5 o# I/*
* e" O, f6 R0 d*convert hex char to int.
) }: c0 n5 x. }*example:'A' -> 10,'F' -> 15
6 C2 B0 t6 u8 S& d# _3 s2 v( g*/ 6 B, l2 Q; I; a5 O# m
int hexCharToInt(char hex); 5 q( O# Z. Q( x$ h! n" y$ M8 b

* V3 x" D3 T; z  a4 R& z9 P; M) Wusing std::string; + n8 j4 @9 }- K, _5 D! ^
/* ' n! @2 G% J4 a% B$ [5 y
*convert a byte array to hex string.
0 Q  Y) J& k7 z9 Z2 `% D0 V" Q*hex string format example:"AF B0 80 7D"
& l, l/ _3 P& y; `# o" q*/
2 K  j. R- D! ^3 p& D1 \4 V+ tstring bytesToHexString(const byte *in, size_t size);
: Q  G$ h4 F+ B! n/ t9 i
- }) @! M4 f- O1 U* H. P/*
) N% O9 n: v$ J5 P*convert a hex string to a byte array.
, ]  T/ n$ u( Q*hex string format example:"AF B0 80 7D" : j1 V) c6 m- V9 |) a9 O
*/ + k9 T2 |2 L0 _
size_t hexStringToBytes(const string &str, byte *out); 9 f) v" Y- r3 \, @' J
& T1 W9 v8 ~8 }% L7 k
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
2 ^; r, d: _9 V$ P5 t9 k#include <vector>
4 m( ]- o: [# l5 E 8 d/ C; D4 ], J- O0 [# Z- j; [
using namespace std;
) b4 A8 G4 Q) e" J
8 t1 {  ~7 F3 A7 c2 A& d; z4 Dchar intToHexChar(int x) {
7 J1 G; L+ I1 O/ o' S# \    static const char HEX[16] = { - C4 _1 R5 j) E1 h* A7 V
        '0', '1', '2', '3',
$ L& n( ?# P, K        '4', '5', '6', '7',
: k* z3 g* a! S- ]        '8', '9', 'A', 'B', 5 R7 @( F6 q. w7 [" L- R: v2 P& c
        'C', 'D', 'E', 'F'
; X4 t, u5 s" Q: ?    };
; ~( O' D  T, ^( z    return HEX[x]; * f( V. m/ O( t3 Y. g
} . w$ w. Z7 Z+ ]4 _- S2 j2 t0 Y9 g

! S( W' h1 \: L( ]4 M; Q. gint hexCharToInt(char hex) { & Y' e! `8 i8 }* `( Q- J. d
    hex = toupper(hex);
; w- W( f+ G, ~    if (isdigit(hex)) * f6 g0 j; ~; W, \4 A
        return (hex - '0'); / W' \, }1 L7 F$ H+ K3 T
    if (isalpha(hex))
1 e# r: Z7 n) V1 `        return (hex - 'A' + 10); + J0 z, @6 Q: n) R+ {
    return 0;
1 F/ G7 o. {! D* J* p' t: ~- Z}   |/ _, W" U2 |+ @# U+ [5 [
; b9 m8 w+ N- C
string bytesToHexString(const byte *in, size_t size) { - l3 x* Z6 p& o: ^* S
    string str;
9 m3 `' p( W; J3 q& U0 D4 y    for (size_t i = 0; i < size; ++i) { $ G4 D' Q& y: l$ v5 \' }8 P; u
        int t = in[i];
. ~( o3 _( m1 S        int a = t / 16;
( P6 }* v; k+ ]; Y- _        int b = t % 16; " j. {) ?6 c# S
        str.append(1, intToHexChar(a)); / J1 }8 _! n0 u6 B8 q: N9 N% z
        str.append(1, intToHexChar(b)); - d  A: O1 z8 V5 v" P" {- e9 h
        if (i != size - 1)
9 Y; M2 a. i4 B9 J) |3 k            str.append(1, ' '); % G% s& E7 v1 J: v1 a
    } 9 T1 R- l2 [/ |! c, |; E6 }
    return str;
0 }/ I: |/ W7 T) R1 p% p}
+ i& |, ~- p, [# P7 |+ m
( _; m, H# i5 H$ Fsize_t hexStringToBytes(const string &str, byte *out) {
4 b1 }+ o$ Y' N) e& O
6 j4 V1 ~* I2 Q# G    vector<string> vec;
4 P; m3 f2 ^) A% p7 R3 I; e' F    string::size_type currPos = 0, prevPos = 0; & F5 n& C( \2 W) ?
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
  Y, E+ E& E" e* \8 U6 Z        string b(str.substr(prevPos, currPos - prevPos)); 7 i7 X* B% V2 ?. P3 J
        vec.push_back(b); 3 E! ~& q+ m9 j% Y9 }8 W% e
        prevPos = currPos + 1; 4 ]  F8 x- `' F5 x9 O/ A/ ]
    }
' n! ^/ d( n3 T) p! L    if (prevPos < str.size()) {
; p- X; w/ j! T, q( C        string b(str.substr(prevPos));
, `. Y5 B7 B, ?# [8 x$ Z$ E( [        vec.push_back(b); 4 S& E. e* A+ a# F8 l" M* q
    } 8 H# w( S& U7 z, y2 E* L
    typedef vector<string>::size_type sz_type;
( H0 P8 c* D# c- V+ N    sz_type size = vec.size(); , u% d" D4 D( M' }' [2 J
    for (sz_type i = 0; i < size; ++i) { 9 W6 s/ N% ~" J1 ?8 ?2 e1 x6 L
        int a = hexCharToInt(vec[i][0]);
& u; L0 u. V/ U. P        int b = hexCharToInt(vec[i][1]);
1 G; b% N- Y3 s! I) w        out[i] = a * 16 + b; - k5 ^! z" W0 [# [, V3 t4 e. r
    } 5 ~0 a. d0 R  s+ M+ ]! n( ?
    return size; & {/ l9 [+ V, M* ^/ }+ e: K( t/ T1 U- M
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
0 H8 q/ w* o% J# ]* _( o% X#define TEA_H 8 F2 Y6 V7 k& u- n

1 d/ j, _2 Z* [0 e/* 6 o  Z) P) J5 a7 d) h  n
*for htonl,htonl
% G# W/ N8 e/ o% ^# @9 ^; H+ }0 v7 e! R*do remember link "ws2_32.lib" / N& r4 I$ K9 ^6 x
*/
6 |* `2 R6 ~" e* e#include <winsock2.h>
3 x6 J- x' f2 x2 ]#include "util.h"
& F* K1 E# N2 a/ \$ i  y 6 X4 _, I1 e! u
class TEA { . B# [" I+ I# _$ S& \8 x
public:
1 U3 r# u* s4 L* A, y5 M4 C    TEA(const byte *key, int round = 32, bool isNetByte = false); 0 R$ R# g: U4 {* \
    TEA(const TEA &rhs);
5 m  z- n& \; o* p    TEA& operator=(const TEA &rhs); $ j. _* A4 R% K8 I7 y% }: v6 s
    void encrypt(const byte *in, byte *out);
% D) F! @( d2 h* G# d    void decrypt(const byte *in, byte *out); & p/ M: W  h4 ~/ h+ o' N2 S
private: 3 Q$ j3 ]9 p( v4 u
    void encrypt(const ulong *in, ulong *out);
1 ]" f/ @# P0 r3 W- B! x! T' x  E    void decrypt(const ulong *in, ulong *out);
7 H" K+ `( X7 X    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
( @7 x. G, P& \    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } - \9 t2 m- D4 D
private:
8 D! g9 T- C' ]) w    int _round; //iteration round to encrypt or decrypt 6 b* R! c2 _6 d' _) ~3 a
    bool _isNetByte; //whether input bytes come from network
2 z& S9 N' `6 B, w# t& o    byte _key[16]; //encrypt or decrypt key ! {; @9 _) Y/ F: U- K$ {
}; $ e. L) [: c- }7 W

/ a7 G6 T, |8 l  P#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" $ d; j2 ?" X0 D1 I+ B$ {- u& W! i
2 #include <cstring> //for memcpy,memset
. H0 p5 O5 n- B, u% B6 X( G 3  . D% y" p7 }( z6 ^  @: ~
4 using namespace std;
2 w$ P: p- T2 y 5  6 t0 H( [8 e+ S7 M/ G# w) s
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 8 h* N5 P4 w8 r9 H
7 :_round(round) ; k+ k9 f, [/ t& Q+ ^' b
8 ,_isNetByte(isNetByte) { ; m6 E6 t6 r4 u( X/ j
9     if (key != 0)
2 g0 E( d! U0 E10         memcpy(_key, key, 16); $ H- X  ^) w: T+ ?9 k
11     else 6 r1 ]: d0 b) N4 D% O& |5 K
12         memset(_key, 0, 16); , H' x# i' _2 J3 {+ w
13 }
6 J$ g- g5 v$ q) S14  2 f. |+ x& R) a! y5 X) v* g4 \
15 TEA::TEA(const TEA &rhs)
% W! S2 Z1 Z) n* }" s" m, B16 :_round(rhs._round)
0 }) W7 n, h0 R, Q# r17 ,_isNetByte(rhs._isNetByte) {
, L) w/ L$ D8 A1 m* j' O% i" E* q; s18     memcpy(_key, rhs._key, 16);
# L  D% v' }1 f" F1 a1 U- M6 r) s3 H19 }
; n1 T; N" |/ K/ k5 W  ]20  
+ L, p; A+ A" N' [21 TEA& TEA::operator=(const TEA &rhs) { * o" ~2 ?- J) A3 U4 a
22     if (&rhs != this) {
$ z( q. p  ^' q; T' G23         _round = rhs._round;
' I% A- v5 J2 e$ i24         _isNetByte = rhs._isNetByte;
4 W# v: z3 ?8 F$ X- y# c$ y25         memcpy(_key, rhs._key, 16); , n' V1 `7 U" I" c, A
26     } $ i+ c, P6 b* e9 ], H2 p
27     return *this;
' z7 N- K6 N+ S4 z; Z28 }
! D0 }) m, u4 f  y* n0 R+ X29  
. {: V/ Z2 K0 k$ H1 K+ ^% A% f( Q2 l9 ~30 void TEA::encrypt(const byte *in, byte *out) { * [2 j6 A  |' ^- ^1 c
31     encrypt((const ulong*)in, (ulong*)out);
; g5 r9 M+ n( N: c32 }
$ y# d0 t; j( L7 a, U( ^1 `, U5 K6 h33  : T( A$ [! i+ i7 K3 e& w3 b5 O4 ?
34 void TEA::decrypt(const byte *in, byte *out) {
* L+ G/ Z8 V( r35     decrypt((const ulong*)in, (ulong*)out);
, t, o1 w6 A' c4 [" i36 } / m0 Q4 I+ ~9 X4 k
37  ' s) u. _9 o( y6 \- I$ P# G; p, z
38 void TEA::encrypt(const ulong *in, ulong *out) { 1 Z1 \1 K" Q8 I; V' f6 H9 Q
39  
' a9 o" J: h/ K0 _) R0 G, U40     ulong *k = (ulong*)_key; 0 M; I; a* j: e; n/ a( z) k
41     register ulong y = ntoh(in[0]);
8 d" \; W& m" O4 R7 e# W4 g42     register ulong z = ntoh(in[1]); & r# Z& a; P4 H
43     register ulong a = ntoh(k[0]); ) h9 x5 i' o. P5 x
44     register ulong b = ntoh(k[1]);
7 H& g) f2 F7 m2 `. d+ m7 H, L7 Y45     register ulong c = ntoh(k[2]);
% C- C* H; @( q8 X, t! I: I' |# x0 h46     register ulong d = ntoh(k[3]); 7 c2 l$ d# j( `2 K$ V
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
7 z4 [( R: W2 K48     register int round = _round;
0 Q8 v: P; R# s8 z0 O49     register ulong sum = 0; ; t- ?+ B; o4 b+ y: C
50  
* t6 z. T9 d2 D4 r0 ~% J, t51     while (round--) {    /* basic cycle start */ 0 _9 b  x: l9 j, l
52         sum += delta;
( A+ m6 u9 ^. J4 J7 r! f! t53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); / S9 Y: Q+ H% n( R3 F+ g
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ y& ^9 e0 A/ \0 P" d6 a4 H- R  `55     }    /* end cycle */
5 ^4 X1 Y) ?6 @56     out[0] = ntoh(y);
+ B+ B4 }: L/ [* `5 t( ~) A( {. t57     out[1] = ntoh(z);
9 R' c6 Q( _  b1 A) I58 }
9 |  F* n) L; r; V59  
0 O4 ?4 ]8 J/ r6 Q$ V0 Q60 void TEA::decrypt(const ulong *in, ulong *out) {
3 @2 Q' z- H, o1 n! [2 }61  ! N8 E5 r, F, t, n! Q, j0 {/ B5 c% j
62     ulong *k = (ulong*)_key; , F* g# z* @. n8 c3 Y
63     register ulong y = ntoh(in[0]);
1 y( a( o) o" O0 E- ~: E64     register ulong z = ntoh(in[1]); 6 z: A" C1 {% I# _, T* U2 }+ S
65     register ulong a = ntoh(k[0]); " G2 h7 n* j$ h' Z. F) p' t
66     register ulong b = ntoh(k[1]);
' \$ C+ e" M3 y* X$ [5 p67     register ulong c = ntoh(k[2]);
9 |/ i" b3 S+ e6 F68     register ulong d = ntoh(k[3]); % G2 ~* C, Z* V1 b3 u; r! c0 f
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ O2 v% N8 b; ?, Z" i) z% H70     register int round = _round;
& `. u0 S& E' w8 i. p7 P1 q71     register ulong sum = 0;
$ T  J( @( e9 [72  0 t8 F; ?' h4 Q0 w
73     if (round == 32) 1 u8 a1 u) q0 G+ a# v9 \8 u$ l+ X
74         sum = 0xC6EF3720; /* delta << 5*/ 8 z, P# ]! e' t' R1 |
75     else if (round == 16)
: L/ {$ I& ~' L# A" n1 E: L76         sum = 0xE3779B90; /* delta << 4*/
  {; J  W2 J1 J3 @4 G77     else   \3 P9 b7 |7 K1 c: j) o
78         sum = delta << static_cast<int>(logbase(2, round));
5 O; V  M) g- k  B. o5 M79  
! ?4 @3 T3 b& R80     while (round--) {    /* basic cycle start */
8 @  |- ~6 _6 q' H81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); & Q, l* F: {5 J0 z' |6 a2 x! `
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); * I. T. v( d* c5 B
83         sum -= delta; 5 L) _9 E* y% ]# u
84     }    /* end cycle */
/ b( U  L7 \, k& ~3 F85     out[0] = ntoh(y);
0 c, D, s9 i5 Z* K/ W86     out[1] = ntoh(z); ; Q  h5 m, d1 E
87 }8 W* F) i" X1 `+ m
; v, K; R# Y" W
需要说明的是TEA的构造函数: ! L3 x6 Y: o/ |! `7 U
TEA(const byte *key, int round = 32, bool isNetByte = false); 5 [8 @+ ^% c4 n3 J0 P4 D: d% o
1.key - 加密或解密用的128-bit(16byte)密钥。
3 o' h3 Q  G5 I, l3 b2.round - 加密或解密的轮数,常用的有64,32,16。 ( e) X# I: S6 ?. B9 t; x+ Z
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 3 f2 D5 K+ P1 H: U3 b! x- {- Y# R! K5 K
! ]+ a; c+ M5 d( s" Y) F* C) v
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
3 f  Z- H: V: o9 j( y. w1 H0 A 2 #include "util.h" # X" t; n! q" H! w
3 #include <iostream>
% V/ {$ x* q; t6 i 4  
0 t/ m8 l/ `' h 5 using namespace std; 9 e# ]5 \, ]8 \- F3 z  k
6  
) U: X4 I9 ]" N6 q) P& X 7 int main() {
. X2 ?: o$ I. c" b 8  
* z% x% F( [- Y3 h2 K 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); / m" D" W' Y2 _& c. |% ~
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
1 ]1 r; N; Z  A11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
0 T- |: L+ V; ~8 H/ n12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
  X1 `0 I0 X% _  ~13  , e* x) L- o9 R3 K) V# U+ w
14     size_t size_in = hexStringToBytes(plainStr, plain); 5 E7 j9 |" {4 I' t8 |% _- U' q
15     size_t size_key = hexStringToBytes(keyStr, key);
; W: R/ I; T$ l16  ) T7 ?1 N3 J) }- w
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
) G; W; X  a$ a- v5 A# v( d+ K$ H18         return -1;
) z1 P1 F$ z& U9 {: _19  8 p9 P8 P. B/ v4 C' K3 {; E
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
3 _9 `( ^5 M; G  K- t# O5 J0 ^21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
5 J/ {; [* W- \! N: K22  * T0 \' Z' z; O& M) p& ]
23     TEA tea(key, 16, true); , V6 M+ t% c- i. _) r+ S7 \
24     tea.encrypt(plain, crypt); 0 x3 f1 N2 Y9 J9 x3 [
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; & ~% R& C9 ^  r! [3 W1 P3 Y
26  
" F; ~7 y, q' P, {# A9 D5 I1 W# i, a) A27     tea.decrypt(crypt, plain);
' t, c( y' J$ Q28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; * V1 k$ {1 k( c" @4 Z
29     return 0; ( f( c: }& @  b# Y( L
30 }5 N2 C4 _- V% K2 T; v2 s% O
: y/ u  \" R. r" W6 j) {
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
. I) d  F2 X$ Z2 N& ^运行结果: ! E5 [% N/ T& R' ^$ d
Plain: AD DE E2 DB B3 E2 DB B3
- M# F8 W0 c* f$ FKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 8 u3 j$ w  R) b2 C
Crypt: 3B 3B 4D 8C 24 3A FD F2 9 Z2 U- x& v: \
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 10:49 , Processed in 0.023442 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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