找回密码
 注册
搜索
查看: 37827|回复: 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 ^! L. ~. y2 w/ n) d. }% p
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 , f! P  I+ Y  v' k
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
- c, |1 X( [; g$ i) q: x! d% x$ y之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
1 m, W1 f$ M) s2 \在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
4 C% f4 ]. m1 G$ u1 u- E. G# V在 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! a2 _( S3 ?8 r/ O
  2. void encrypt(unsigned long *v, unsigned long *k) { ) Z+ v+ y1 B! L3 q) F5 e; N& |9 e
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ % k3 P3 Q1 j2 a+ g  G. K
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ / ^9 f) v+ o0 v, j2 M% w, F
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ % j8 q, ~4 C5 S! T" U2 B- R% }
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    9 h1 l9 M9 q1 L( ]7 w6 y
  7.          sum += delta;
    2 O' k, w3 S0 a6 C! |3 a
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ' B2 A. X! @" o" O* g4 x& X3 k
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 8 \# y) c% D) F% n9 `* ], ]( k/ C
  10.      } : V# E& E" x- \( G6 \2 D/ X
  11.      v[0]=y; 9 N- s. o" U4 I: T/ V% q
  12.      v[1]=z; & @+ |2 p, a: h; Y: s
  13. } & C! J6 a  ?0 \. c" C% m
  14.   
    % a+ s' V2 d5 Q
  15. void decrypt(unsigned long *v, unsigned long *k) { ; r7 p3 a* K# @5 v# R, Y' y! u5 p
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
      _% x6 V8 W, c1 `! j
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    2 x( C7 V7 b/ u9 t
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
      \) U$ q! D1 o* M" g+ C# |
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ # }3 P  I% u; z7 o% {* h
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    6 K" d3 P7 n  Z% `7 {
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    1 q* B$ k7 W0 m3 b8 _' q/ e' V. f
  22.          sum -= delta;                                /* end cycle */ 1 D- E, _: A" S' r8 l
  23.      }
    7 V  x( h) \$ a# G3 r
  24.      v[0]=y;
    6 O  c9 T8 n- [: p& p* z, o: q
  25.      v[1]=z; 0 k+ w3 o/ T& r8 `" u5 \( |: B
  26. }
    + y& V$ q, |+ Y1 b# I3 l- P/ l. n
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
; V0 R5 j1 P4 k; u% I# |, j6 e6 X#define UTIL_H
/ y: X& Y" y% x. D' {  T" m+ m, S  n% g9 L
#include <string> 8 J; C, h$ A* H$ r/ u
#include <cmath>
  M) x" o# I7 y#include <cstdlib>
3 w  E( I  S. `% {3 T3 h9 k
6 M& W. _9 d/ ]6 l6 h$ g6 Wtypedef unsigned char byte;
2 M3 F1 S* ]7 Ptypedef unsigned long ulong; 9 [) H6 n% Y, o( y' a9 z: T% Z- t

# x/ f0 u8 m) A2 c( I: v+ z0 Uinline double logbase(double base, double x) {
, {% i. D: w: g4 j' {    return log(x)/log(base);
; S4 G1 P! W, P}
! T' u4 _1 F0 k# [4 y7 t) \1 P6 j ( y, e4 y2 w2 J2 A, z3 }8 p
/* 4 {7 S2 Q" j) q1 {( M2 Y* ]
*convert int to hex char.
/ ~! `( a( ~+ @! |*example:10 -> 'A',15 -> 'F'
, W( \, f+ n# [, S1 @/ l% f4 N% v) o*/ " S+ @; k$ ]9 n2 n2 n- X9 _# X1 W9 B
char intToHexChar(int x);
2 E- x- @/ m9 c7 \& Y) S. j * q# f. x. b9 X9 w* P( v5 Q
/*
/ E- q8 ?/ o9 V0 p9 i*convert hex char to int.
7 H8 Z8 N' l  @$ `  H$ Q- ~% \  ^" _*example:'A' -> 10,'F' -> 15
  s  L3 i; f2 `4 Y*/ 6 q" C( k# \, f- s4 N
int hexCharToInt(char hex);
4 E: M/ c2 X! W( G9 L" G$ a * B- [/ J, T9 ?2 Z3 N" Q
using std::string; ) n  W, m/ Z: ^1 Q6 f; \, A' _
/*
: m& e( o+ w! l1 [+ j*convert a byte array to hex string. " Q+ B) [" p8 d+ i: B  Y
*hex string format example:"AF B0 80 7D"   {. u( L+ c$ y% U9 k  m! H, _
*/ 0 X# s: d3 q/ w* _2 S$ K
string bytesToHexString(const byte *in, size_t size);
' h' l. }+ c, x7 {6 }3 p; U6 D % \/ v5 b' F4 i$ u7 U  N* \, c0 t
/* ) L' S+ a) q2 B2 |
*convert a hex string to a byte array. " J( R9 N' ?' n$ T2 ~
*hex string format example:"AF B0 80 7D"
6 T7 ~2 z- D; F1 f% P0 I*/
9 N; q. |# M& t+ h6 t. Ysize_t hexStringToBytes(const string &str, byte *out); 3 e/ k1 Y" a3 j& X6 D6 V- U
% N; O- S+ B3 J" p9 N
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"   a$ ^0 t5 R8 H/ c# c9 M3 H
#include <vector> 3 _2 `/ B9 z3 I* `3 D, I  _0 M
9 c3 Y' `9 d' z( S, s; u
using namespace std;
6 z- i" l8 [" a" @7 g+ \# O
) z$ R, M" `3 M+ M  o- Achar intToHexChar(int x) {
2 w8 \, a, K8 D1 g9 p    static const char HEX[16] = {
: X8 y) ]  ]( N! G        '0', '1', '2', '3', 1 w: f3 R  w( Z" y" {' u6 x2 P( S
        '4', '5', '6', '7', 1 A) `* q0 o6 c: v$ G
        '8', '9', 'A', 'B',
! S5 g: Q* B0 I; z        'C', 'D', 'E', 'F'
% t3 r1 v/ S0 v# _8 T    };
6 e7 W$ D( _! Y    return HEX[x]; + u5 i( I( K; U" ^
} 5 G# `3 E0 O" ^; I" U
' W* N8 l' w( g/ C
int hexCharToInt(char hex) {
( h. k7 B( f" X/ k, L& g    hex = toupper(hex);
* Z& ~( q# B# }    if (isdigit(hex))
1 D3 s& a( Q/ d# E% ^7 {        return (hex - '0'); " U: m( ^% Y- O& r* r: r
    if (isalpha(hex)) - Q6 V& Q& P0 `3 P+ Q* B
        return (hex - 'A' + 10); , M  z9 ~. A' [3 N( X, _
    return 0;
. p3 l, L  n3 v/ R7 A} / L3 c5 m9 A5 ?, @: ^& B" L9 o' @
+ M/ {4 y  q" C8 u* v  {* |5 g8 ^- a
string bytesToHexString(const byte *in, size_t size) { . w2 A% i  J6 H6 ~
    string str; + L3 y: }( Z$ B
    for (size_t i = 0; i < size; ++i) { : K# ^  W0 {: T) c3 B5 }% x
        int t = in[i];
* g6 B3 R* x2 J        int a = t / 16;
( G. A7 w& \( P" t        int b = t % 16; 1 Z+ K* h# f! t# Y8 R# I6 r8 n
        str.append(1, intToHexChar(a));
- e7 R+ G9 F' j        str.append(1, intToHexChar(b));
. e8 Z, ]0 q6 L. E' M* T0 m, Y        if (i != size - 1)
* I) @6 x' ~6 [: R) S            str.append(1, ' ');
  P* L2 a  L- t' Z" h1 S' ?    } . J1 F1 E4 x4 ~1 W
    return str;
+ ~# \2 S9 ]2 P( G9 B- u9 N* w} 7 `/ J+ X1 s% b3 ^
5 T  n* [- R& f
size_t hexStringToBytes(const string &str, byte *out) { 6 U2 I; L2 V9 ?1 s
& s2 _* G; E/ z# x; s
    vector<string> vec; ! ~$ Y6 _2 O0 C( z$ _
    string::size_type currPos = 0, prevPos = 0; 0 \3 c* v: A1 S( }( C- ~6 g
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
* \! T" }4 i( A' M        string b(str.substr(prevPos, currPos - prevPos)); 0 Y( S8 A4 `! J# o1 v9 t
        vec.push_back(b);
1 j6 l$ C0 M$ n, i% X        prevPos = currPos + 1;
. g+ [: l6 c' I8 C6 [! t! f* i6 n    } : l$ X, X  s" l: R* l- I; x; F
    if (prevPos < str.size()) {
! i/ r$ e. F2 f! k5 r3 u        string b(str.substr(prevPos));
: D; f7 ?% m$ w! P) T$ p        vec.push_back(b); ; A8 J( P8 V' k5 ?& Y
    } # t9 |1 n" j) [# D. n. W, m1 U7 t
    typedef vector<string>::size_type sz_type;
5 y2 b9 \9 w  g    sz_type size = vec.size(); 4 E/ H. x! F5 ?/ R. w
    for (sz_type i = 0; i < size; ++i) {
. d5 e# ?! }& m4 _4 a        int a = hexCharToInt(vec[i][0]); $ `9 z9 ^/ |9 \, U% x! i
        int b = hexCharToInt(vec[i][1]);
/ u: B2 w6 f" h5 T" \' `  n        out[i] = a * 16 + b; ( p# C# w2 M& m7 v6 j
    } ( ?+ d0 c% @: k, e" E" @" W
    return size;
+ s6 z# `4 J0 D1 {- e}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
5 i; p; n  U: _- ~& q#define TEA_H
! E- |$ r2 B% I
' v! e' P3 b9 H9 ]* @! u" l' t, b/*
: L& j2 s+ v7 f( f# I6 M*for htonl,htonl & l' f, X0 O5 V% W
*do remember link "ws2_32.lib"
# Q3 H3 n5 p' Q7 g, ?1 @  j*/
: U( e8 w( w; Z4 @4 C% l#include <winsock2.h> ( T3 n  B! E* P2 t: b; b
#include "util.h"
- Z6 h1 P& b, {2 U0 j& P6 V& q * P% @. u: w& e* y
class TEA {
2 m, \7 @; e, e0 q$ d4 X, Zpublic:
- F0 @  E5 J5 j" f  R1 ~# ]    TEA(const byte *key, int round = 32, bool isNetByte = false);
' N$ o0 G& j' P- I4 c5 ~    TEA(const TEA &rhs);
* x8 b/ s9 F9 G; ^" t8 C5 T( I    TEA& operator=(const TEA &rhs);
3 ^  M( {( w$ A8 b5 N. h- f    void encrypt(const byte *in, byte *out);
' y8 g) z5 ^& f5 u    void decrypt(const byte *in, byte *out); 1 N7 j7 v, a8 A9 A6 H4 k
private: & ?2 N  H# v5 B& V
    void encrypt(const ulong *in, ulong *out); % t. d: {6 i8 u$ c9 C
    void decrypt(const ulong *in, ulong *out); 7 }8 |; Z$ p' r  q& V5 m- r4 @
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
+ r1 D: |7 w+ z5 E    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
) Y2 F; ~9 j+ S$ W. aprivate: 3 [& x0 }8 X: |6 @
    int _round; //iteration round to encrypt or decrypt
1 L9 O; G: q: H    bool _isNetByte; //whether input bytes come from network
$ F% s" ?8 B8 I" |; K& `    byte _key[16]; //encrypt or decrypt key
) m/ }# i+ i, s" B5 W/ p}; 0 C- {: F; H/ [

. L3 ~% G- u0 L) g. j- ~& D#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" - w8 F5 f5 K5 H5 }; P. r( a3 b
2 #include <cstring> //for memcpy,memset 8 I6 h& {. o9 a3 ^' ?6 P4 Y& H
3  
7 v/ D' }% M( G3 D2 \ 4 using namespace std; . O. G8 V' l0 i; w& e; V+ r
5  / Y% L2 j" q/ l
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
# L! S' K  Z$ g2 g) l0 O& U 7 :_round(round)
  Q+ A2 c6 A/ y* L( I* ?( i 8 ,_isNetByte(isNetByte) { % s; [$ W  G) O3 E9 |
9     if (key != 0)
9 J) U- C5 f8 c: q' b10         memcpy(_key, key, 16);
" P+ Y4 R, l: E$ F6 [11     else
- w1 r9 I8 a; h: C% s) g12         memset(_key, 0, 16); 2 ^8 X  Q" n1 I5 S! A) u! v% P
13 }
) A) V7 T# c+ h6 N. c. W( n14  
3 I) {5 ?2 {: r* s9 g/ E6 O4 I15 TEA::TEA(const TEA &rhs)
( v4 H, b5 }5 k16 :_round(rhs._round)
: H7 z9 A( ~* O7 l' M% V17 ,_isNetByte(rhs._isNetByte) {
! s* a* w  C2 q0 P18     memcpy(_key, rhs._key, 16); $ _4 |8 O) q% b/ a
19 } 8 ^, ?5 V% O! q2 q
20  
. Q: K( U5 E$ I! T21 TEA& TEA::operator=(const TEA &rhs) { $ J) _1 i: B9 \" X6 M
22     if (&rhs != this) {
: o! p6 t2 `" B23         _round = rhs._round;
+ a- K* L7 C) p8 e8 r! Z24         _isNetByte = rhs._isNetByte; 4 U: @3 r" l5 D0 d" {" W
25         memcpy(_key, rhs._key, 16);
% {9 T$ \' n1 i- T( _0 ~$ N26     } + u- L" P" I1 V0 H
27     return *this; ! M8 z4 m/ R+ H7 h2 e/ k5 D0 A
28 } % Q6 F5 K: Z" A$ T. f3 Z4 ]
29  8 h% j& ]2 X* u4 R
30 void TEA::encrypt(const byte *in, byte *out) { 1 g4 D" r& P" m  ^
31     encrypt((const ulong*)in, (ulong*)out);
6 b. F: o8 m5 {" H: ]' z32 }
& m8 i& G& ~5 x5 t- _- O7 Y33  1 x: N) S' T% M0 W+ ?0 ?7 F
34 void TEA::decrypt(const byte *in, byte *out) { 4 c" l* U0 @% V: }' J
35     decrypt((const ulong*)in, (ulong*)out);
0 V  D. u- M6 H) _8 ~36 }
: G) P3 v% m7 z: N( q' B37  
% @# N& o0 _- U$ M& K3 A4 O8 I% R38 void TEA::encrypt(const ulong *in, ulong *out) {
0 l' z. t8 x3 v0 _; i- G0 p7 K39  
6 A/ t! k$ ]$ x/ y9 `/ t0 I* d40     ulong *k = (ulong*)_key; ' G! K6 T0 ~$ a2 B
41     register ulong y = ntoh(in[0]); ' Q+ L9 p1 t5 P7 i7 a1 B) }! [
42     register ulong z = ntoh(in[1]); # G, {$ V7 e; Q& |6 ^
43     register ulong a = ntoh(k[0]); 6 i, m* P- {! f, k- u5 y: ^" x# F
44     register ulong b = ntoh(k[1]); 5 h  Q( E# b# t; v/ m- q
45     register ulong c = ntoh(k[2]); + a7 e( }6 d& g" n% e
46     register ulong d = ntoh(k[3]); ! P# R7 D+ S, b
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ # G- X9 E8 \% Z) D# d
48     register int round = _round; 3 B: G& h: p% e5 q2 Y% T- _8 C) _
49     register ulong sum = 0; 7 u" U  q, `9 O
50  , D$ G' X) {9 u; E9 I
51     while (round--) {    /* basic cycle start */
" `3 o* U6 ]' Y, a$ ^2 X52         sum += delta; ; N( Q) k+ \; C! L, m4 y3 a
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); . y, Q# ~! ?8 P! E" C' ^( d. X
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ! {6 g3 s: t7 U) Z& Q
55     }    /* end cycle */ ' u5 O% l, x! t0 @( R2 e$ V$ ], E
56     out[0] = ntoh(y); $ V3 N! K) L6 d( W5 }3 P
57     out[1] = ntoh(z); & a' S7 S, c3 P& k# g: B7 n  H
58 }
: m8 d& V! l) v6 D9 p5 g59  
8 u, _8 |9 b4 |9 u% z60 void TEA::decrypt(const ulong *in, ulong *out) {
' {3 O/ ?' U/ j2 R* `; e61  4 N/ k  p* Y/ D2 @1 P7 X3 e
62     ulong *k = (ulong*)_key;
; t9 j: f6 a1 K% |7 }  U63     register ulong y = ntoh(in[0]);
! D6 t/ @0 ?- d0 P: V! |64     register ulong z = ntoh(in[1]); % M: @/ S' n* i% h) t
65     register ulong a = ntoh(k[0]);
" V* v, e" z5 |- V5 `. f66     register ulong b = ntoh(k[1]); ' D+ f' s6 j4 [5 f5 P4 N: |1 S' z
67     register ulong c = ntoh(k[2]);
  x" S& l3 F& ?% q68     register ulong d = ntoh(k[3]);
& E( J; R6 ~/ x5 g1 E( o% p69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
, ]  q0 T$ ]7 i* z# A1 S. a6 w70     register int round = _round;
) e! D5 N9 G9 o) c71     register ulong sum = 0; $ f$ u) ~& C6 M6 Y0 p4 e+ D
72  
. J  i4 D* n( j) @' O# h9 X73     if (round == 32) 4 t! a4 W% @9 m
74         sum = 0xC6EF3720; /* delta << 5*/
" \5 e6 N$ K, O! a. K75     else if (round == 16)
# f& O3 `: R/ u' ~76         sum = 0xE3779B90; /* delta << 4*/ 8 m3 E: y) u# R8 L) e% H1 U
77     else
6 r* C3 J  [* i9 k5 Z78         sum = delta << static_cast<int>(logbase(2, round));
2 Q; d# h! E8 l6 B" I8 Y8 [% y79  
* {3 A$ m" D8 B$ o% A/ x# h80     while (round--) {    /* basic cycle start */
1 f9 @( J7 M( [6 D4 K+ \  X8 N6 Z81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
$ F3 |! R7 S( g. W" r# a7 O82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
9 A6 [, j1 S" O2 e83         sum -= delta;
7 ~0 [# `5 y3 L, h84     }    /* end cycle */   U4 j# g4 S3 O/ g
85     out[0] = ntoh(y);   d5 s8 S% t/ Y7 _, \6 j! p
86     out[1] = ntoh(z);
+ C+ N1 Y( Z5 p! N4 l87 }
; @% l, D# s' |$ [# b# p2 G( [* l+ R. a% S8 Z- D5 A" F& I/ \
需要说明的是TEA的构造函数:
, C+ w9 U) X- N* [9 gTEA(const byte *key, int round = 32, bool isNetByte = false);
6 \! }* V" k1 W/ ]- ]9 f1.key - 加密或解密用的128-bit(16byte)密钥。
" K; N4 N; D/ l7 c2 k+ m2.round - 加密或解密的轮数,常用的有64,32,16。 % Y5 G3 H* X6 N+ P
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ; C( Z8 M- U) j$ B' a
3 ^. P& [! h) F' l% g! Y2 y
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
% Y) o1 ~& \! p/ h5 d 2 #include "util.h"
( v2 B7 p2 l) P: ]' X 3 #include <iostream>
$ Y" O5 v- J0 y2 y1 H  k 4  ; \4 e& E( Q) K3 _7 y7 v' Q& e* Q
5 using namespace std; 9 ^6 |$ g0 w% C) ?
6  
4 C0 E1 p; L0 R# P- c& d 7 int main() { 0 D  x9 f$ m# l  y# l
8  
4 a; m, c* {) d* B: @  A) n 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ' s# G2 \6 x% e. X$ R0 d
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); : Z/ C7 c! c2 P6 n/ g8 \
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
- o' p' u8 h! x& k" O12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 3 F- X# ^. E! p, T6 Q: ~" [
13  
! e* t4 B* {9 u) E/ m9 d14     size_t size_in = hexStringToBytes(plainStr, plain); 4 |/ ], l5 O' Y; m1 O5 ?
15     size_t size_key = hexStringToBytes(keyStr, key); : O% b$ j  _+ H7 e
16  # _% e3 ?5 n* l8 a
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ' ?6 D6 x7 z# T8 Q( P, Y
18         return -1;
: K1 C+ o2 s6 \* s3 h19  . d% B8 T& ~9 B2 L9 n, s
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 8 l! T9 M" m/ k7 P
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
, m4 u3 `& w+ D22  
  R( g3 i; f( w& I8 }% i2 G23     TEA tea(key, 16, true);
. ]# x& G. T8 u24     tea.encrypt(plain, crypt);
1 A+ I/ D8 S" O" F25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ( g* ^0 M6 x# l7 \; ?4 v
26  
  z' G. N* h/ e; N27     tea.decrypt(crypt, plain);
: D' d" j! W+ A# H  @28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
" V2 X. ~! R: C& }29     return 0;
' S7 b# u& b7 W1 t, _/ w! c30 }
6 v! U; ]* T% X7 _, M
9 Q0 `4 Z- l( i% {  Z- z本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
. g2 A/ r0 {$ v* [5 k. J运行结果: : N" }0 s* |* V. R
Plain: AD DE E2 DB B3 E2 DB B3 4 |9 w& J0 h' U
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 - `. R5 K. O+ ?9 `& I) s  k' f5 X
Crypt: 3B 3B 4D 8C 24 3A FD F2
4 j& w+ @8 [# w' p! x- tPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-30 06:01 , Processed in 0.018757 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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