找回密码
 注册
搜索
查看: 37394|回复: 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轮):
* t* c: K7 p- h% N8 m9 d) P微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
  [+ }! |4 k- z7 H4 o; d* TTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
2 _; a5 q; p  U$ ~9 q; j之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
$ ?% f) D" o; Z在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
. y" b; A  J2 D4 Y, \在 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. 0 I2 l: F- H2 D' h4 K0 d7 y
  2. void encrypt(unsigned long *v, unsigned long *k) { 4 F4 ]% y" R5 ?% n+ Q0 v0 D
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 9 R1 C/ z% H4 Q8 M  J& I
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ - m4 i3 u( m2 X3 z3 b7 e
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    1 A+ x- E( k( L; l5 v# k
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    9 R& |. x4 p; Z. g
  7.          sum += delta; ' @9 e) ?0 F: p2 O2 E  U
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); $ a4 c9 N2 U# g8 O6 o; @
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ) c0 m# P3 |9 Y; n
  10.      } ) I3 h3 p; D, s
  11.      v[0]=y; 2 ]' w7 K8 s; O, B  N5 ^
  12.      v[1]=z; ) \- x3 @- M3 g4 ]
  13. }
    $ U( E. Q2 t4 D! q
  14.   / v9 E9 c+ B/ g5 s4 X* S
  15. void decrypt(unsigned long *v, unsigned long *k) {
    + q9 ?. v: t" [0 \
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 6 u% F# p5 r# U) \9 k2 B
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    $ h% `2 a$ t) d5 l. N
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ & @! I' b2 ^/ Q9 a! D( h5 P0 L6 g
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    : N- n$ o% I7 f! r, G2 y2 G  Q
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    : A, R6 L! X( J
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 0 s; {, q, B6 p3 V9 z* [
  22.          sum -= delta;                                /* end cycle */ : D6 T( r8 }3 X8 ~4 j, N
  23.      } , M! g1 j. M" f! L% e
  24.      v[0]=y; 4 S5 g% J$ w4 q  H" B) d; [
  25.      v[1]=z; ! {1 C7 ]$ u" e, S6 h" a/ n/ N
  26. }% g2 E4 @" G4 @* c2 K0 _
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ! n  f! b( h, _; q9 C' z0 ~$ e
#define UTIL_H / S% G2 G& x7 N9 U

& x! C# P, ]% ]4 o9 m#include <string> / j+ K) ^3 q  n6 f& H) Z! [8 [
#include <cmath> ' ~3 D: N% C$ M: Y0 N
#include <cstdlib> % W# e' M3 f3 |3 z
3 \3 m, J& ~. D2 G. M" L& L% w
typedef unsigned char byte;
$ @! w, V- K6 o4 Ntypedef unsigned long ulong;
1 A9 R+ h( k) u/ n7 e: H
; }& F5 P+ H1 t+ vinline double logbase(double base, double x) { 7 r% ^6 A% K4 U- B  z: e
    return log(x)/log(base); : [. b) y; G* @+ H" ]
} ' a6 |' r/ L3 ~& {6 j

# s7 D& o; u0 n: ?9 P/* $ m( r" Y0 h4 Q; f$ I& i6 M! A
*convert int to hex char. * z' w5 |- ?: c
*example:10 -> 'A',15 -> 'F' % i9 q( h0 f8 @' M) y  Z
*/ / V, Q$ Z8 [: w$ B8 I
char intToHexChar(int x);
2 }3 H( r1 u- | ) C6 |( ^4 j+ p: W; k3 G- y* k# j
/* ; O2 \/ ~7 M3 J& n4 o( F) c1 y
*convert hex char to int.
) Y, A0 @* a0 X$ X$ b( I, w*example:'A' -> 10,'F' -> 15
( u+ G+ @8 F2 J# r, `*/
/ l+ c3 u  ^" Q% h" `( wint hexCharToInt(char hex);
4 e% L+ y" s; d% }: q0 }" K
. y1 M1 N0 A( n  k) y2 _using std::string;
$ E  |- Z; g- @5 v" R% |% \/*
& A" X) \8 h4 {; U*convert a byte array to hex string.
* t, C0 Q+ B1 T# F) z, N( p*hex string format example:"AF B0 80 7D"
$ U5 `9 ~6 i6 a" V*/ . j; }+ [. x& A; r6 ^
string bytesToHexString(const byte *in, size_t size);
- L9 m. H& O, c& l2 I9 p6 @
4 s9 C% g1 G6 T5 p2 v8 Q/* 1 ~  ^+ `+ }+ T8 n" O- ?# B6 C$ a
*convert a hex string to a byte array.   |, ^: `) A2 k, A/ k: G
*hex string format example:"AF B0 80 7D"
% O( Y- l. A/ q' p$ a  d" T6 j+ K*/ # y+ M: I9 P' n4 k
size_t hexStringToBytes(const string &str, byte *out);
7 N, w8 W0 X$ s- G( ^& Q3 @( p( ^
5 x6 r1 ?4 v; P. u#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" # D$ {* {, O7 Y0 C' Q$ [3 d
#include <vector> 7 K# v6 ?, ^3 ^! G( W- l

% f5 N! _- a# }4 s% F, H$ C- [using namespace std; ' y' f  l3 X- e% `' }) x

" b% @0 |3 Q& achar intToHexChar(int x) {
& |3 N0 Z  b3 B- K    static const char HEX[16] = { / U! u/ N4 ?- e, O( O$ A$ P, ~: }
        '0', '1', '2', '3', , V& s; r7 a1 D/ |: ~
        '4', '5', '6', '7', & O* M8 G, D/ v/ s8 A# ?
        '8', '9', 'A', 'B', + `+ T+ J' v+ w
        'C', 'D', 'E', 'F' 1 G  L7 i2 m# ]6 j' M% O( v
    };
/ N  @/ v% p4 k2 [  y9 ~5 W; ?    return HEX[x];
$ A6 D+ q2 k: L. M( b6 I9 l2 U}
. Y* [, R: Y1 E5 b( |# K8 }& l% _' U
7 F5 V6 ]" T4 x8 z! ^int hexCharToInt(char hex) {   d4 a! S* r  ~! f& e
    hex = toupper(hex);
/ [5 V# b+ ^4 Y    if (isdigit(hex)) 9 e* d8 f8 _- V" j. Z' Z3 B' y
        return (hex - '0'); 4 x0 D) {/ U, d. d
    if (isalpha(hex))
7 |# ?4 ?) V# \6 @+ M        return (hex - 'A' + 10);
2 s2 D7 ~  s0 L    return 0;
$ H, p. D1 M$ F# |. e, I}
: e1 ?7 f) ~4 Q6 C" s% L( `
# r7 Z2 Z7 v, R& A- ]3 |" kstring bytesToHexString(const byte *in, size_t size) { ( j# @) f0 o4 M; @. z
    string str;
0 s3 @1 t0 t3 o( }5 b8 j& A. Y    for (size_t i = 0; i < size; ++i) {
1 X; h, \" v* _1 E/ ]  {! N        int t = in[i]; * S* M6 B! P. b, R# g8 v6 s
        int a = t / 16;
1 c0 n9 n5 v2 F2 ?  O: u, d        int b = t % 16; / i+ k; G: A- v3 L
        str.append(1, intToHexChar(a));
- X' r5 d4 X: R        str.append(1, intToHexChar(b));
( t) U3 F6 H. d+ `; @        if (i != size - 1)
/ I9 ~( b. h3 \& C; `0 {' x5 l; o            str.append(1, ' '); 7 H/ O5 z9 R! x: I% X0 W3 J
    }
- L+ |. Q5 R& l5 T# e    return str; / w+ S+ y) n# u* C" g9 ^+ T/ _
} 2 M/ ~! E: f$ }' i; A: ^  d3 B* i
, d; i- q0 w7 z2 H! _2 E
size_t hexStringToBytes(const string &str, byte *out) { " j) t  g  L; K9 x8 _, q

% D  L4 Q2 x" b* ~  U7 J    vector<string> vec;
* _  D% M6 ?! u* |1 P( O, x* Y! ^    string::size_type currPos = 0, prevPos = 0; 2 _# q( z+ O0 A( l. x, o7 c% j
    while ((currPos = str.find(' ', prevPos)) != string::npos) { $ c; j/ O( L/ z9 i) ^7 e3 S
        string b(str.substr(prevPos, currPos - prevPos));
* b8 ~9 R, m- s* U. y        vec.push_back(b); % h1 \7 A4 P% W, c7 n2 o6 V% T0 m
        prevPos = currPos + 1;
3 C1 j* F# Q3 v* @" f7 A    } - c3 a9 O! w$ B3 L: x
    if (prevPos < str.size()) { ! a# v% k' Q* i$ _4 L
        string b(str.substr(prevPos)); 1 Y7 H% J9 e5 s$ [. Y/ V
        vec.push_back(b);   X, Q7 }! U  V  j" z
    }
4 K2 j* }3 Q- m- v5 G. a; U    typedef vector<string>::size_type sz_type; ) a) i. [7 y  k6 z9 a3 v# q8 U* J
    sz_type size = vec.size();
- a* o! i( X# j( Y$ f4 s6 T9 L; @    for (sz_type i = 0; i < size; ++i) {
; |3 F* C( m$ N( o# Z3 y8 K& T        int a = hexCharToInt(vec[i][0]);
+ o8 d( `1 e3 Y$ f+ _        int b = hexCharToInt(vec[i][1]); 3 e4 ^% r; w& Y9 w; h  A( v" p
        out[i] = a * 16 + b; 9 s4 a6 e4 a" u) ^  G$ |5 n
    }
9 ?" b/ S* ~/ ]0 L* g" L    return size; # B4 j2 j- j' U8 e$ o/ D
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
! y: k, D6 j* c#define TEA_H 6 y  F6 W% K/ {

; U9 \* l$ V. M/*
2 v5 |+ x/ ^7 U, n" x/ `*for htonl,htonl
5 U# C$ u$ e# T' l5 Z; Q7 Q*do remember link "ws2_32.lib"
8 N+ m' ~  `6 B: `7 u*/ " u: P. l# r$ X- j( {
#include <winsock2.h> 8 X' `7 q( w+ r& n
#include "util.h"
5 V# W' L% L8 L) V8 A8 g1 @ 0 E  Q. e" f3 Y3 j; ?
class TEA { & U9 @$ p* V, V! V
public: 7 y* P  n! U7 S
    TEA(const byte *key, int round = 32, bool isNetByte = false); 6 P% N4 R( f, M$ e' f7 M% H
    TEA(const TEA &rhs); , c7 x) c! o* `
    TEA& operator=(const TEA &rhs); ; S7 x6 j2 {4 @# S3 i2 e& U
    void encrypt(const byte *in, byte *out);
) s% N( N; l& M* O    void decrypt(const byte *in, byte *out);
2 \$ W+ o/ M( e, K9 @private: . }" [/ N# M5 Q  x" `) u
    void encrypt(const ulong *in, ulong *out); - ]  H4 q1 Q: I! ?- h
    void decrypt(const ulong *in, ulong *out);
$ O; x, d4 h7 w" t1 }3 Q+ x    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } ( c! y/ D# m, M. r
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
. V' l% x' ^/ R3 r9 d# ]private:
+ J& Y5 e" D4 m' S# D; V    int _round; //iteration round to encrypt or decrypt
! _) e& y& E! b- Q- o0 n    bool _isNetByte; //whether input bytes come from network $ ]* {4 T6 o" A* u8 f$ B% h3 m% S
    byte _key[16]; //encrypt or decrypt key
0 M# m( H5 C; p. d! a1 _* N}; & H3 v. w% k6 [3 i+ w( p3 ?
6 g- `8 y( S, k$ c) h3 N9 o7 o5 y
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
9 F- [% R; T  h, L/ @5 t' w( p 2 #include <cstring> //for memcpy,memset
0 {+ s! N3 t6 S0 U$ w  \/ Y3 D 3  
0 [7 }, x' g0 L/ \3 e4 O5 t. ^ 4 using namespace std;
; C, L5 J* }: X3 a/ r2 \ 5  0 y1 j5 G" u! w5 f7 h
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
+ J/ t! g0 p1 w, C, `3 a 7 :_round(round)
, H9 _4 g* P8 L9 }% I 8 ,_isNetByte(isNetByte) {
8 `1 B: n1 Y! H. _. z 9     if (key != 0)
6 B/ e8 ?1 c: q( n10         memcpy(_key, key, 16);
& _9 f7 f: I, H3 h" Y8 o+ M8 R2 \11     else 0 n2 |, s5 m" I4 U5 A; x& [
12         memset(_key, 0, 16); ! X2 J  B0 @( I* r
13 } 9 D% Z' F" R- k, l9 S
14  ) y, k7 s* O/ ~: b
15 TEA::TEA(const TEA &rhs)
6 }8 y# B7 B, a: J: b16 :_round(rhs._round) * [8 @" l; J& J2 s! n
17 ,_isNetByte(rhs._isNetByte) {
7 V0 l  l/ n3 |* F18     memcpy(_key, rhs._key, 16); ' n( N: Z; W, F
19 }
: `$ M7 {0 ?6 T5 A, t20  + }; ^9 \3 q. Y6 }
21 TEA& TEA::operator=(const TEA &rhs) {
% D/ |& [  ~* O& V1 g22     if (&rhs != this) { : B4 |& l6 Q9 ?" p  [/ a& J
23         _round = rhs._round; ) h+ r/ q) I6 P
24         _isNetByte = rhs._isNetByte; 9 j, I+ {* Z) n8 g  A
25         memcpy(_key, rhs._key, 16);
8 z8 g8 `$ X9 `/ x6 n26     } : \$ C& t. l1 Z
27     return *this;
9 D9 K0 V' \$ H' P28 }
7 K- \% Y* N! G29  8 s. H/ B% G5 U: J3 C, m" |" u
30 void TEA::encrypt(const byte *in, byte *out) { : g0 C8 K% p. @& T: C
31     encrypt((const ulong*)in, (ulong*)out); 0 f+ q0 Q# v  h  l: S* A
32 }
0 }% r. ]- O) E( \; j% D33  7 g, A' a$ N; E- x/ x+ F! Q
34 void TEA::decrypt(const byte *in, byte *out) { 9 W" o- |$ d9 m3 M3 r$ M
35     decrypt((const ulong*)in, (ulong*)out); 8 Y- r* Z# @/ M' V. e9 @! T
36 }
7 f2 ?4 U+ ~4 p2 M8 F  x; Z37  
+ D/ F* J3 N2 D, o# a5 @. u38 void TEA::encrypt(const ulong *in, ulong *out) { 3 h; P' `" `0 J3 R
39  * j5 v$ t5 n, ?% l7 E) s
40     ulong *k = (ulong*)_key;
9 @  R! I: U$ m3 E" J/ {41     register ulong y = ntoh(in[0]);
  q. r2 ~% q0 p) S5 l! W0 L+ g- y42     register ulong z = ntoh(in[1]);
- m' V( ^4 J# v8 y* p# p43     register ulong a = ntoh(k[0]);
) l6 O8 \! B  F% r$ f+ j% z44     register ulong b = ntoh(k[1]); # Q! r: E0 d; R
45     register ulong c = ntoh(k[2]);
2 V# k" l: s3 ~2 u1 h: W2 G46     register ulong d = ntoh(k[3]);
: y& U/ n: {  t5 r1 ~$ ]47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ % K6 Q" U* l; z, x" v! |9 D
48     register int round = _round;
& C, |) j: i9 h! y6 C! G  ?49     register ulong sum = 0; . O# H+ T, V. z2 [' O3 |2 ~
50  6 ^# I% j4 O$ }$ ?" T
51     while (round--) {    /* basic cycle start */
' N0 W" M! K7 J! H$ t' x6 |# |; f9 c52         sum += delta;
" U8 f/ Z( |6 {: B  I! l53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 3 {8 J2 Y# P) T5 E) f6 }$ t3 U. Q
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
( U0 g/ {0 d. Q, {2 d55     }    /* end cycle */
; i  u1 d6 A, s, k56     out[0] = ntoh(y);
' o# E9 L8 F; F* f' S$ G* p57     out[1] = ntoh(z);
/ s: B+ p/ a8 C5 D4 t  m. s1 d% @58 }
5 p2 n$ |, T9 G' A9 a, Z* t! l+ |59  $ q9 ~3 b8 ]# B
60 void TEA::decrypt(const ulong *in, ulong *out) {
! Z% M+ j1 `0 |3 j7 t61  & g  I2 o, p5 ?
62     ulong *k = (ulong*)_key; 1 l# d# {! r# D2 b( A) W! P5 F4 s
63     register ulong y = ntoh(in[0]);
) a/ d& O- u8 r. C- W9 Z: C64     register ulong z = ntoh(in[1]); 7 W4 P: a) ]0 l  d
65     register ulong a = ntoh(k[0]); 8 Q5 v* A- x1 o0 U; q
66     register ulong b = ntoh(k[1]); 7 ]# U4 a' O* D3 b
67     register ulong c = ntoh(k[2]);
: M6 j7 f' A; a  ]( a9 \, H/ n; h( y68     register ulong d = ntoh(k[3]);
) {7 K) U+ S: c69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
4 s0 `: X  F& ~3 W- n70     register int round = _round; ; f, c1 G$ k8 t4 t5 Y! M
71     register ulong sum = 0;
2 v; ^1 Z  J  x. H% j9 b) Y' L72  7 e. Z8 u' B& x) c- s
73     if (round == 32)
5 b% Y2 ?! |5 x$ P8 {7 |( {74         sum = 0xC6EF3720; /* delta << 5*/ 7 v: J+ i6 F9 n. Q3 P
75     else if (round == 16) ( S4 O+ ]6 l$ w2 P3 Y
76         sum = 0xE3779B90; /* delta << 4*/
7 h; i) x" u, w! E77     else , L; `3 y9 ^8 W# j* R; `
78         sum = delta << static_cast<int>(logbase(2, round));
; _, t5 s3 ~" F4 `- A  p6 n79  % O+ P9 t' I2 J$ `6 E' \* q& m
80     while (round--) {    /* basic cycle start */
7 r8 i; A7 ]% \$ V$ ~6 N2 `81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
6 U3 _( l9 j$ Y82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
6 c: w" h. r. c, p8 Z83         sum -= delta;
, U" P& b6 {4 C5 M84     }    /* end cycle */
4 |& A+ J* d! C85     out[0] = ntoh(y); : a: |0 b9 C+ ]/ g& G" i
86     out[1] = ntoh(z);
, O; w2 E9 @8 n0 b+ P8 s* ~87 }1 N  V: J0 |$ t1 c2 I

9 _9 H( l  I* D, h! M需要说明的是TEA的构造函数:
! \3 y( f+ ]0 d5 e- P$ _0 f5 U1 jTEA(const byte *key, int round = 32, bool isNetByte = false);
4 d1 @3 H8 S% {, q$ ~5 M1.key - 加密或解密用的128-bit(16byte)密钥。
4 z, _) k" D& [. Z8 D/ Q2.round - 加密或解密的轮数,常用的有64,32,16。
/ Z9 _) |+ q2 b( c5 l. i: ~6 V3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
/ Z% d8 ?3 T; g  v, D: \$ z0 t( w) k' }" m
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" / v- j/ p% \- m& @, B/ |; g
2 #include "util.h" + E7 N9 Y7 z2 g7 J) K# a
3 #include <iostream>
, ]0 N) K7 v; ~$ I  p 4  ; B( E# P0 i, O" N4 `0 t5 R0 J
5 using namespace std; ' K5 T6 Q+ j/ i) _2 S9 _. \
6  
; b( }: K. }2 W, M% F, Z. Z 7 int main() {
8 u- F: C7 X3 v3 e( n 8  - S) h2 {0 C# `1 Q3 B
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 8 H0 a5 e& W0 z  f, e# Y. t
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); . Z" S+ m1 Y2 u3 q, ?% [
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
' N  v5 X: }) c1 V* i12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
0 {, {0 y6 ?, {13  % t; U" l$ [- I- R- y9 g
14     size_t size_in = hexStringToBytes(plainStr, plain); : ]) t: M2 o$ H$ c
15     size_t size_key = hexStringToBytes(keyStr, key);
8 e; B4 `$ ?8 C6 y' u' l  F1 Y0 U9 U" U16  0 Z" H0 P5 L4 V3 W# Z& J# V
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) # i/ S7 N% f" f$ U( p3 H
18         return -1; % w8 W, f4 ^6 z2 f& _" C
19  
; q' U+ q: X, T2 g4 |2 ]  a; B20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; % T) |) j5 }; y: r2 w- N) u
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ( r* j2 S: S' U* P1 g
22  
% Y1 J4 ?+ J2 f3 M23     TEA tea(key, 16, true);
5 W* ]2 X* N$ b2 Q, i: X24     tea.encrypt(plain, crypt); 2 M! l7 @3 d2 R3 r2 R
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; % b& O4 l# J  F4 ], H+ q
26  / B- P1 b) A4 j" m% [  d
27     tea.decrypt(crypt, plain);
5 N9 X$ m$ w6 U5 n# E2 M4 g28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; . t7 c  J" ]3 |* ?7 @
29     return 0; - x. C5 Y1 c" j# [+ V! k0 f# }, t
30 }
% b; e% r9 f/ Q8 t; W" {/ _! J7 U. C
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
# b9 m, {- Z9 J0 W运行结果: 4 @. G. ?/ L+ {' }
Plain: AD DE E2 DB B3 E2 DB B3 0 @; j$ k! r  k
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 & f" s# x! s+ C1 n) A3 i3 a% I) H9 C
Crypt: 3B 3B 4D 8C 24 3A FD F2
7 x, k# X+ M9 l+ \/ |Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 04:09 , Processed in 0.020518 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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