找回密码
 注册
搜索
查看: 37331|回复: 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轮):
6 K$ V. V8 m. |* i微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 # T  }: O8 U, s$ j8 A: T5 N' K* w
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 7 s* F3 ~! g5 Y: h6 D) f, ^& E, v
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
# r7 W5 q. w' `在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 , t8 j5 e' n! m+ o, b
在 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. , H6 V% V& q5 c& M! }9 ]
  2. void encrypt(unsigned long *v, unsigned long *k) {   D6 y8 W0 p( Q" {  t4 {
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ( X) R; ?. D7 D. E4 Z6 L3 ?
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    / y  K0 V9 x) e2 b- t% r' p2 d
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    5 B, W; n" R- b) Q' u8 |
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    " V% Z5 o7 M2 T8 a) B2 n
  7.          sum += delta; $ _5 R# U9 B2 z5 D" S$ R
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    # o9 z+ `3 l$ o7 t% R6 e
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    " ?( A+ C) ^1 W5 w
  10.      } ) \9 ^7 n% F. l! v5 w
  11.      v[0]=y;
    + h) C3 h6 P' U
  12.      v[1]=z; 5 x+ b3 @# i4 i  J1 X! H
  13. }
    8 P& d, j- [* D, Q+ R  d
  14.   % y+ }& C8 o3 V' G
  15. void decrypt(unsigned long *v, unsigned long *k) { - T  o/ |+ O7 R. r8 U* Y- s" t
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 7 q  j8 f+ n# O; @, J  N- S( R! y! ]
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    / ?; G1 E/ e& M# U
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ * ]- B+ Z7 l- w: h
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ # B# i, U$ X, [, j
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ( \% D8 X' T& q6 z: [
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ! N% r* e' L3 o7 I
  22.          sum -= delta;                                /* end cycle */ % @5 _" v2 r# h5 U0 T
  23.      }   U5 @+ e3 `( W5 M" S
  24.      v[0]=y; 3 r$ ~4 w9 U  y6 X# f' Q  B
  25.      v[1]=z;
    : ^! g7 {/ G6 o
  26. }
    . B9 {! m' k2 L% R+ ]4 O# T" A
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 7 J3 H- D4 \- Z8 U; [; F* T
#define UTIL_H
0 X  L5 _  [8 a# k. [0 D
2 N  b5 }! }6 [* M) A- u#include <string> : |# N& N7 b( E5 F9 r* }$ b
#include <cmath> - [# ]" L# C: x
#include <cstdlib>
5 E# c) ~% n2 H& K+ C2 T2 v 8 O) ^8 `2 U6 J
typedef unsigned char byte; 3 @4 F/ c$ Z& x) C% G5 m
typedef unsigned long ulong;
" Z- H# d/ d1 k0 u& p1 @4 C' ] $ T, o+ Z2 P% M8 d, \, p, A
inline double logbase(double base, double x) {
) n- v3 w! B  m    return log(x)/log(base);
+ L& A6 U7 \' b+ h2 }2 _} 0 [% W- ]5 ?5 A
, t) G' Y* ~$ F" j& L+ E- C' F
/*
# L1 r1 L: e, H* Y+ o  D*convert int to hex char.
+ J7 m- {  S1 ~+ U( o*example:10 -> 'A',15 -> 'F' . Z: b: n, Q; Q
*/
6 |- ~% n' V' Y6 Bchar intToHexChar(int x);
3 o* F  g: u: g; c2 Y+ d8 S$ ^
$ g1 ]- k* R1 N! ~% S0 z/* + P$ r" ?. s: O
*convert hex char to int. 4 h! _( D& u7 B* V, s8 P6 V6 |. J
*example:'A' -> 10,'F' -> 15 " }: v$ l( D) N# j& f
*/
' z# r' l. p0 o" B# sint hexCharToInt(char hex);
- ]' r9 C% [8 o6 [. T9 t4 T
* @$ ^$ R* M4 f4 L, x1 susing std::string;
. ~' J* I# ^& k" D7 R& g4 i& _/*
+ A/ p% u2 ]) k7 X2 t. r1 h4 J. ^*convert a byte array to hex string.
9 |3 g$ }' k8 m*hex string format example:"AF B0 80 7D" $ H  L* i( f! ]' ?
*/ $ I1 |# S, g1 L4 Z9 O# v) a; `  D9 D
string bytesToHexString(const byte *in, size_t size);
6 [8 W8 _; i) q0 U
$ ^% Z2 W& A* g; z+ Y# Y/*
! R; N; h+ h3 p# o*convert a hex string to a byte array.
& o1 X6 Y6 d+ [; p6 R*hex string format example:"AF B0 80 7D"
( S. Y' T) m( g/ Y% q5 f4 e*/ ; T/ s% C) V/ ]4 f7 x" g* `
size_t hexStringToBytes(const string &str, byte *out);
$ N! w; o% d, Z$ D- i4 T0 i
. Y- p8 ]3 c( F4 B$ G. P$ z#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
5 k+ t, }$ h$ d# m) `1 X#include <vector>
2 V$ X; E1 p- m1 {
  L6 j6 ~5 @* m3 I+ P/ c, pusing namespace std; & W" p# S$ q, k3 \! |! e

& [  @& J4 B. z, J( N4 e8 U# lchar intToHexChar(int x) {
5 g' l) u  D  y( ~) |    static const char HEX[16] = {
5 D$ k- Y+ e2 q9 B# |) Z% h2 M        '0', '1', '2', '3', 1 ^: S( l4 Y2 y( n1 \# n
        '4', '5', '6', '7', 6 S$ d1 _1 p* E' ]$ P1 Q0 g; C
        '8', '9', 'A', 'B', # v. b3 H3 J" e  W* }
        'C', 'D', 'E', 'F'
7 H) t3 B* E# u! p    };
( s& p. m, p2 s* U- d8 a* g    return HEX[x];
& S* _  B3 {7 f# l# ]6 f$ E} : n3 L5 F/ A  _3 B, g4 T

/ p+ C; b3 o9 ?5 S$ t/ a) t8 ?int hexCharToInt(char hex) { 4 r4 ~: H* Z5 n6 F
    hex = toupper(hex); 1 _9 n+ c3 `/ p( W, g+ m" E2 {
    if (isdigit(hex))
$ w5 D" Z% T3 B! [8 Z        return (hex - '0');
. l1 B7 ?4 y7 P) ?' X, u    if (isalpha(hex))
0 x5 Z7 r2 d5 d' U0 S        return (hex - 'A' + 10);
* o$ ^1 z( w- H& N, s    return 0;
: T$ G3 {- _8 ?: h, B}
+ V: x2 }0 }% z# d- S$ ?
' q3 A& R9 ~; i2 H3 q* F1 a: y% Bstring bytesToHexString(const byte *in, size_t size) {
# x3 A  b) A! B: n- H    string str;
" K, n5 K! L/ r8 M    for (size_t i = 0; i < size; ++i) {
% f9 L* v+ o" Z        int t = in[i]; 2 o' K, D4 q: I7 E8 o9 y9 |
        int a = t / 16; # b, w5 F+ o' E7 H
        int b = t % 16;
& a9 \. k. u/ W" N/ ?5 V) O7 o        str.append(1, intToHexChar(a)); 0 _" D* x' K6 v3 ]  X1 n4 U7 c
        str.append(1, intToHexChar(b)); 9 t# n* s7 J4 u3 D" d
        if (i != size - 1) 3 t5 D7 V& A, l$ h. `! }& M8 s1 a9 |
            str.append(1, ' ');
: U5 i3 Q- g: n1 G, R    }
: F3 l( ~& j4 k1 c: K    return str; 5 T1 Y! P' T; p0 i9 K  |4 I2 \8 i5 |
} . u! z/ w. R3 v, @: ~' X2 x4 l% u- U
( y5 }$ W: C9 t/ d' \% c7 A4 r
size_t hexStringToBytes(const string &str, byte *out) { 0 ^5 s2 b" K- g1 G& l" I

8 i: Q. s7 \) k/ G( ?# J    vector<string> vec;
- ^" Y; ^& Q5 C, B4 Z$ x; k    string::size_type currPos = 0, prevPos = 0;
1 Z  U% U  P" h2 I    while ((currPos = str.find(' ', prevPos)) != string::npos) { " K$ T  V) p: I$ k# |8 N% f5 O4 o
        string b(str.substr(prevPos, currPos - prevPos)); ) {- W' ?# I: G' v3 k* f
        vec.push_back(b);
3 U$ f! |5 K* d        prevPos = currPos + 1; + E3 b6 n$ _0 D. ^% @2 H
    } + n2 i5 y: G4 c8 C/ e% P0 I
    if (prevPos < str.size()) {
" I5 G4 ]& H9 L7 K8 w* u5 D8 C        string b(str.substr(prevPos)); 3 |; r% V) n, m6 S  D/ X) Z
        vec.push_back(b);
9 R7 `! W! O/ C5 L1 O: A0 x4 D    }
; R9 X' h' w0 e$ K+ b% y: Y& z    typedef vector<string>::size_type sz_type; + c) F$ U5 Y% c
    sz_type size = vec.size(); ( b2 E+ O2 k# f3 M) |& n9 r) L8 a/ B
    for (sz_type i = 0; i < size; ++i) {
5 m* v6 s; Y9 D* b1 q0 n        int a = hexCharToInt(vec[i][0]);
' T* p! Q1 u+ y        int b = hexCharToInt(vec[i][1]); 6 |6 y9 i1 ^6 b( b
        out[i] = a * 16 + b;
' I- t" x% [# a- h" L% F- p    }
- t: |4 e8 S) y2 w7 `    return size;
* J0 _& W* b- S}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
. L. I% G; a) }3 e6 x; K#define TEA_H 4 Y' T: H7 q# o) \7 ^& k
' n# S0 d, ?+ J' @# e! R8 R
/*
. y( i" o# c- R: ~  v*for htonl,htonl 6 q& _9 e& g6 P* H) M' e
*do remember link "ws2_32.lib" 8 t  F5 b" i) r/ i1 n9 o; B
*/ : B  z1 f) \: {4 U4 n
#include <winsock2.h>
0 e9 [4 a$ E. H5 x#include "util.h" 5 F; E2 O) ?! T7 y6 W4 ]" B

, I. T/ k# G* m3 c# H' W. yclass TEA { 6 F* E5 i" s  a; R
public: % s; V& }, N  T" E; W
    TEA(const byte *key, int round = 32, bool isNetByte = false); ( ^2 u9 B3 U4 v5 D) I
    TEA(const TEA &rhs); 1 g% s9 C, V# ~( j7 R
    TEA& operator=(const TEA &rhs); : w6 u! I; _* G$ F5 q$ i
    void encrypt(const byte *in, byte *out); 6 W+ ~5 I$ P5 h  X! v: s. Z" O8 k- j
    void decrypt(const byte *in, byte *out); ) I( h) t- D7 w2 }3 X! n
private:
3 X! p" ?# P  a8 s- V    void encrypt(const ulong *in, ulong *out);
0 |3 A6 v4 B) l    void decrypt(const ulong *in, ulong *out); 7 k: q. |2 C2 D/ G8 K
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } & _; S, @. |: h1 _8 O4 ]
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 5 ^; Z) T7 Z5 |  [) K- d5 U
private: . o5 i  v4 ^" j, Y) ?, S: L
    int _round; //iteration round to encrypt or decrypt 6 b% W8 Z3 f/ |% u/ ?" x; J
    bool _isNetByte; //whether input bytes come from network
/ k6 |# t  ~$ L6 s    byte _key[16]; //encrypt or decrypt key 3 i: e; u7 d$ [0 J
}; 8 X, v# X4 j3 d( r9 a
1 o$ f. y  K+ n4 w* k% J0 n
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 3 p0 r* W. f, d4 Z5 |
2 #include <cstring> //for memcpy,memset 8 T+ U0 \/ }; Q2 ~8 I
3  
" u* a3 D' V) ~, T 4 using namespace std;
0 W" E" @( Q/ l- S7 c, M$ v5 \ 5  
3 Q: ^1 C5 V: e5 T& Q' s, v8 j 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
' v8 Z$ o) ~$ y2 J. f 7 :_round(round) % W& a2 K& \  [/ B: K6 f( K* `+ ~
8 ,_isNetByte(isNetByte) {
" r) i2 v7 d1 z, J( R7 p 9     if (key != 0) ( i6 ]$ b! a% o/ ~  N
10         memcpy(_key, key, 16); ; X- D) F/ j  C% X( z) v. t
11     else
, U; s# v' y3 y# T8 f) F% C& g12         memset(_key, 0, 16); + {2 u2 V+ H: }+ v
13 }
2 W' N' _1 h! Z! d14  
8 {' Q- {! n9 d15 TEA::TEA(const TEA &rhs)
9 I3 H: a' u; w2 q7 h, p$ P, P16 :_round(rhs._round) , Y* @$ ]" A/ |
17 ,_isNetByte(rhs._isNetByte) {
, ]5 o( B( t/ X: }- K# V18     memcpy(_key, rhs._key, 16); , d( Z+ j1 |+ R" ]- W
19 }
0 }9 E4 v1 u4 k5 w5 X5 s20  
4 C2 Y' L% K" Z7 `8 i+ X21 TEA& TEA::operator=(const TEA &rhs) { ! m" p: z3 L" `
22     if (&rhs != this) { & s' x$ I- D8 q5 f) K& }
23         _round = rhs._round;
: G& x) w: R. V( R; `, q24         _isNetByte = rhs._isNetByte; 3 [+ }* X) S2 {7 L
25         memcpy(_key, rhs._key, 16); 3 M7 ~+ h5 [/ y$ J, V
26     }
0 B/ D. `! e1 T5 Y8 C1 R) a4 K1 r; i27     return *this;
- l" N  p# Z! @" G) Z+ W28 }
5 ~. F9 n' k  L0 k  }  }29  
6 s; R. X3 o3 s6 f% P; B7 t30 void TEA::encrypt(const byte *in, byte *out) {
$ z- G- ]/ B# {3 l31     encrypt((const ulong*)in, (ulong*)out);
' V! j4 y* ]- W4 }5 i32 }
' r. x, z: i4 [/ Q& ^33  5 F* ^$ O* l' v6 n7 s2 e6 l
34 void TEA::decrypt(const byte *in, byte *out) { $ z0 S3 V2 g( c& w" [
35     decrypt((const ulong*)in, (ulong*)out);
4 }0 |% i' `) X: r, A36 } 8 G6 P0 m. h' e0 L9 p4 v
37  ) \( a$ T8 `; P( u7 a
38 void TEA::encrypt(const ulong *in, ulong *out) {
% T+ F0 ]9 k1 o. ^/ ^8 h9 w: @3 d39  : A" V: H) T( ^4 r2 V% `4 R
40     ulong *k = (ulong*)_key;
+ K2 m3 P! C/ w0 i41     register ulong y = ntoh(in[0]);
0 R. h7 A1 ~* F; X42     register ulong z = ntoh(in[1]);
" W) \; \! T9 A( p43     register ulong a = ntoh(k[0]);
" M8 X/ @+ `* D. e44     register ulong b = ntoh(k[1]);
2 r# j6 o6 T* f/ X$ q45     register ulong c = ntoh(k[2]);
  O& |( g1 B, n2 o6 A46     register ulong d = ntoh(k[3]); 9 Z$ s  v! j2 M  F( x
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
4 s4 o# `7 B) d) }9 B48     register int round = _round; 7 }( V" B$ A1 d% d1 z
49     register ulong sum = 0; + K% B$ H' s- E+ @' [8 V
50  
1 E$ t9 N8 X+ ~9 S* ?& }! C0 ^; \51     while (round--) {    /* basic cycle start */ . L- Z7 ^# B" f  M' n" b
52         sum += delta; ( Z5 L$ L& v5 S6 ^& C; P/ h
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); " F! j$ j: e' Z) U9 ^$ W  k
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); . W/ e: y( D# R' r/ s
55     }    /* end cycle */ 0 g8 s/ H8 }9 |' i7 a7 o2 H
56     out[0] = ntoh(y); 6 x- }. n0 [3 O4 K
57     out[1] = ntoh(z); 3 U* Y& E( ^* H
58 } 4 b; K) a9 O- Y+ Q; D: z
59  % v9 x5 z/ O$ U/ ~% I4 n
60 void TEA::decrypt(const ulong *in, ulong *out) {
$ m$ P5 H1 G4 q- B' f# F* t. [61  
' P$ u) O: ^; b1 T' B8 A5 k62     ulong *k = (ulong*)_key; : @$ H8 ?; b7 B+ f. [4 B$ \# [/ l
63     register ulong y = ntoh(in[0]);
5 j# r! j2 L. D1 q9 a$ ^# {64     register ulong z = ntoh(in[1]);
4 I! W7 T  q" }' I4 j65     register ulong a = ntoh(k[0]);
9 o) m- d; R2 j! Q66     register ulong b = ntoh(k[1]);
; u# z# |  F: I; ]0 S67     register ulong c = ntoh(k[2]); $ v4 q3 V$ {1 j5 n7 m
68     register ulong d = ntoh(k[3]);
  O# Q* R" M8 I+ E# o& X: E69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ - N6 t3 S* N% S7 d& Z5 _& t( N
70     register int round = _round;
  e; l$ W+ C: L% {4 X71     register ulong sum = 0; % u! ~: S0 n, p
72  
% W2 V7 I7 ~: t! S) _2 ~73     if (round == 32) 1 o, X( p3 c$ a! u3 Z# A3 x2 G. w
74         sum = 0xC6EF3720; /* delta << 5*/ # P2 A) L3 e5 q# Y+ r9 Z
75     else if (round == 16)
) X! m/ q* Q+ p2 E76         sum = 0xE3779B90; /* delta << 4*/
5 P7 R+ u0 o  \- F77     else
- e' w0 s1 r7 R$ n78         sum = delta << static_cast<int>(logbase(2, round)); 8 A, ]4 U$ E& ^2 l/ s0 `+ Y
79  - O/ x, B' z& l& [8 h- U
80     while (round--) {    /* basic cycle start */ 8 h( [: ?+ I( F
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ) F# |" L" e4 a  u
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
4 j; T2 ~* F2 B- e83         sum -= delta; # z" V+ E# B3 T2 D: z! R0 M  A4 D- w4 l
84     }    /* end cycle */
. |0 ~& \5 m9 R0 t85     out[0] = ntoh(y);
6 x; W7 ?  r6 Q86     out[1] = ntoh(z); # f) a, n: q9 r* m! ~7 d
87 }
8 ?2 a/ C) G/ F: |
, |# P7 Y5 _/ T  p需要说明的是TEA的构造函数:   d! r  p. ?. A9 o8 u  E. j. S# x" M
TEA(const byte *key, int round = 32, bool isNetByte = false);
1 a4 d1 l0 R2 M1.key - 加密或解密用的128-bit(16byte)密钥。 ; W5 w% T- a' I2 U, w) w
2.round - 加密或解密的轮数,常用的有64,32,16。 9 U& J) {  W% h, ~8 k! ?9 s
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
1 l) ?4 h. [1 ~& \* o* L/ m9 ^. d( R( Q6 H( s
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
0 c, @2 @" t* n; z9 d; [ 2 #include "util.h"
' `- U1 w# X4 ?2 F- R9 ]% D 3 #include <iostream>
  Q  v& Z; V$ F9 ^( P 4  , `; t6 Z1 O. A. O% g( C, }! V
5 using namespace std; % B1 A, U* t# [
6  
% r, B2 j' D  J" e# y* n 7 int main() {
5 Q* Y8 K0 s4 e9 s! t* j 8  
; |* ]% G" B% J 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
: ?2 ?2 _# ~8 T' @& _10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 6 G& U0 h/ A) w! H9 V
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
2 m7 u. m6 ]. N% u2 U$ j12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; # ]7 l# E: q9 ?
13  
8 R* M( U( [: l% t14     size_t size_in = hexStringToBytes(plainStr, plain);
% L6 G/ Y; v6 `3 K; [& _- r15     size_t size_key = hexStringToBytes(keyStr, key);
. t2 B; j* |7 X; q" v16  
: {( A: R7 y0 z( D% Z# `2 C9 M17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
- d3 [3 v# h) ~0 }, T: {+ q18         return -1; 5 }% j: V8 w4 r
19  
6 U) j+ E& l- H5 @& F6 y20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
4 b# t& `6 w0 [5 \; Q& R6 |3 z3 W21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; / J$ y, e  P: z" c. G) n7 Z
22  
) A' S! L$ K6 x8 P23     TEA tea(key, 16, true); 7 f, y( \% V# M- j
24     tea.encrypt(plain, crypt); $ q: t+ [3 ^5 _+ ]7 }: h! H5 j
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; / e. V  |2 e7 f5 b7 I
26  
- n" U$ c( n$ `" O27     tea.decrypt(crypt, plain); # l! u+ Z4 b7 {& I1 T7 y
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; % S/ ^6 i5 p4 V  k% [4 s1 P
29     return 0;
# z3 X7 c7 G$ E8 l* i30 }
" P7 h- R8 h5 [* G5 Y. V  v- h9 |2 u# O
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
& Z3 T$ J) [9 v9 r9 r运行结果:
2 [" B& ^; N" z) B. m& m: m5 X9 tPlain: AD DE E2 DB B3 E2 DB B3
' D) {$ \6 i$ mKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
/ l$ ^1 l7 g1 v; wCrypt: 3B 3B 4D 8C 24 3A FD F2 ; j* A" w$ a8 b9 e; t& ~" ^
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 09:26 , Processed in 0.019217 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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