找回密码
 注册
搜索
查看: 37477|回复: 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 C5 t# i+ _, z9 X5 A' R
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 % D* [2 O. C0 L8 C1 c6 l. E
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。   c7 S  s; o& \& H: D9 ]* E
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
& i" P# Q" W* m# \$ ^9 ~在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 8 W7 ?% W1 Q  t: f
在 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. + b$ N& d0 L0 q4 Q  R' T2 @
  2. void encrypt(unsigned long *v, unsigned long *k) { ( O! z* S8 o% U  u
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ # Y( \! k8 m9 x1 i- ^0 u. H
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    # Q& ?- A( c/ d( U; o
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ & h# T4 w  }/ x+ G" f0 ~
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ , y# N; }# s9 {, Q6 t  h* r, B! P
  7.          sum += delta;
    7 l! Q5 a# \  R0 {% u
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    + `; [9 s/ T+ J) O5 i
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    : d& h7 N9 N0 P$ f& U
  10.      } ( m* I- k- ]$ S# z: {" w7 o
  11.      v[0]=y;
    ( J* e5 ~( ~# n' ~4 B; n. x* z6 l* L
  12.      v[1]=z;
    ) a1 @1 g, p( X7 q5 g2 K, b2 O; I
  13. } / w/ n7 M/ F8 D. N7 Z
  14.   
    6 R0 N# C; `, Z; B6 ?) u: t
  15. void decrypt(unsigned long *v, unsigned long *k) { ' H8 h2 T  O/ D) R( A; C0 o2 B+ r
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    / Y  \7 V) `& q
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */   h% Q. d1 M; I( `
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ # O6 Z) T( r% n5 u4 w1 I
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    " H2 [2 B7 g4 B0 X3 x9 B0 U
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    6 O7 j5 j9 Z% m/ z1 P0 q
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);   H4 ?5 @6 \1 j% x( ?/ M' h
  22.          sum -= delta;                                /* end cycle */
    , ^. v3 e8 x& G3 B5 z$ I
  23.      }
    3 E+ V2 z/ D- }# s( X
  24.      v[0]=y; 1 ~7 s/ j* V, u$ j
  25.      v[1]=z;
    5 U+ K, ~$ t4 K+ _- g; Z
  26. }
    $ i" a' m0 y* t3 s- h. U* W' W5 i
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
' H/ ~# ]- g: V/ X8 V7 N( r#define UTIL_H
4 b3 D; H6 }6 }# j5 P6 {9 t# N+ Z# V  f
#include <string> & E6 F, {4 n7 G) ?
#include <cmath>
7 h6 d1 F, q% V. j* M% c+ _4 B  ^#include <cstdlib> % T2 L7 k+ [" I3 d+ Z
8 W4 L0 H: l6 R& _: C$ b
typedef unsigned char byte;   ^4 W2 R) Q6 h: V8 r: o
typedef unsigned long ulong;   S/ ?$ W: @4 x5 ?4 k* V6 ^

- p( S: a3 ~' o( d/ Q8 m' D) Iinline double logbase(double base, double x) { $ X& s! q7 G2 e6 Z3 w$ V; C
    return log(x)/log(base); 0 D) I. R) C& H/ L- a; s3 ?. D
}
9 W2 Z) \1 B3 k: Y% F+ \" V
2 y( N$ [7 a  B9 t! a9 Y3 T/* ' D% D! h' t  R2 w1 m& b
*convert int to hex char.
  S" W3 W* t  m6 @. M1 F, c* R, f*example:10 -> 'A',15 -> 'F' 2 t7 P* d1 @% ?3 H: z: {. l7 h
*/ 5 Z, O" V- ]) j- W; U& |, k
char intToHexChar(int x);
6 v. [* P1 [( U/ }( I   J6 K) y! M$ \: X
/* , H, _& [4 h, r' [. Y
*convert hex char to int.
9 A# c9 `7 n. M2 ?*example:'A' -> 10,'F' -> 15 : L) [4 q* X# I% \& H
*/ 0 J& n  r+ B& _$ m
int hexCharToInt(char hex); ) a5 E9 o( @. |4 Y8 y
( a6 A8 l( e) o+ A! l  n
using std::string;
* V3 v( l7 {2 R7 Z8 o' E/ c/*
5 h4 y6 b; z+ W9 c- M*convert a byte array to hex string. ( \8 I/ G- H/ k: N
*hex string format example:"AF B0 80 7D" ; h9 Y8 o  j4 l, U% R# ~$ J3 Y1 J
*/ # ?/ g5 R- t) B$ {# ~7 M9 `( K$ v+ h
string bytesToHexString(const byte *in, size_t size);
# }) V; R" _! p+ g6 _
& c- {4 a4 O8 ]5 o/*
+ m7 V9 G- P0 z! P9 r1 P( b, w*convert a hex string to a byte array. 3 S. |9 H8 M' t' O
*hex string format example:"AF B0 80 7D"
/ x5 n/ Q9 z# s0 |*/ ' x6 e+ a. n# k3 q, W5 z: k. e
size_t hexStringToBytes(const string &str, byte *out);
# I, ^5 u9 Y  Q5 b' h' v; {6 ?
& D: f: C! _4 o+ J$ P# {" J#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 8 s  [1 M8 M( b9 d) \" g! o9 o
#include <vector>
3 u* b% a2 T# Q7 X0 P8 N
' x# t) D# Y1 a2 C/ i' @; Musing namespace std;
7 q& T5 u- u# }# e( |1 s! ] 9 O+ N$ }5 x& p, w$ h
char intToHexChar(int x) {
/ y) q3 ?9 u- e! ]- t6 P    static const char HEX[16] = {
* k! b) l2 r* C/ v6 F/ k        '0', '1', '2', '3',   ]2 C. J8 W2 [9 Q: g% M
        '4', '5', '6', '7',
' Q* f2 M% h" m  J4 [; \( \        '8', '9', 'A', 'B', ' Y# }; Q3 p. K- x# k
        'C', 'D', 'E', 'F' ( x: S8 m" r* ]( j
    };
# T8 ~' U4 D# z3 T+ W    return HEX[x]; $ h% o9 h9 G9 B' m% Z2 H
} / }: }  Y. _6 V+ ~1 V

' u7 J' `7 |1 S/ c* a& e4 aint hexCharToInt(char hex) { . N- r& P' s: q7 P& j7 ~: j
    hex = toupper(hex); 0 N# D; k4 S0 v- R1 L. q' E* m
    if (isdigit(hex)) 3 Z1 x5 C6 P3 B2 k1 e
        return (hex - '0');
3 a7 i. I& U8 L0 p    if (isalpha(hex))
) u3 K, K& [. L; ^& C/ ^        return (hex - 'A' + 10);
+ e/ v4 b1 q9 q# t. [    return 0; ! M9 [0 V5 ?! h2 x! H7 r
}
) o: v/ d9 a# R6 `  s7 W, o& c
) G; R: ]0 C( D+ _' pstring bytesToHexString(const byte *in, size_t size) { 1 b  m7 Q0 [* [3 ]
    string str;
( H0 Z. H1 i8 z% l7 z* V' y: k9 I    for (size_t i = 0; i < size; ++i) {
+ B$ R( [! b* Q$ J7 {0 q        int t = in[i]; : w/ A$ Q% G. t8 T
        int a = t / 16; 3 W% L1 H! ~" T2 N/ ^( H
        int b = t % 16;
( b* P0 T0 k  u  u" [1 G        str.append(1, intToHexChar(a));
0 p' b) m' @5 |! X        str.append(1, intToHexChar(b));
0 r+ B9 Y8 y3 t2 h5 \        if (i != size - 1) 6 }: V  e- @8 q4 D* }
            str.append(1, ' ');
2 G% i4 X/ K& j7 p1 \! F! T. p    } * T. A* W' F' L; r
    return str;
' z. r5 U! V; f# E" S% H" ?- K}
9 y6 [5 x6 d- k% g+ \; Y6 v
- V  g5 S3 w# o. Psize_t hexStringToBytes(const string &str, byte *out) { 7 p3 x! v! @' Q) t. e1 d0 h2 _  _
6 ^9 X$ g$ N8 M! p1 z- [, s0 j
    vector<string> vec; & w! ]3 f. m  _* O6 Z  j: [
    string::size_type currPos = 0, prevPos = 0;
1 U+ S+ @6 t/ E4 c  i- J( d( _6 i    while ((currPos = str.find(' ', prevPos)) != string::npos) { $ k# ?: b- `! {& L
        string b(str.substr(prevPos, currPos - prevPos)); $ i. l  _3 j7 p
        vec.push_back(b);
5 ?7 }3 {: x# @9 I0 q        prevPos = currPos + 1;
$ Z8 ?4 O' o; z6 M1 f+ H' [    } / ?: u2 ~: N! x
    if (prevPos < str.size()) {
! I  g8 j5 C& u& J) g2 P        string b(str.substr(prevPos)); 0 ]% @+ Z+ x1 h: |) Q  x, R0 q
        vec.push_back(b); 9 i% J- g: G+ ^( ~0 N
    }
% R! x9 }3 ^, H! L# }0 `  N    typedef vector<string>::size_type sz_type; - f, V) ?8 p8 V8 ?9 e7 k3 w0 K
    sz_type size = vec.size();
, N  P, |( u9 }! b$ x) p& d    for (sz_type i = 0; i < size; ++i) { 8 k* o- `, @2 S
        int a = hexCharToInt(vec[i][0]); 8 p9 i1 Y5 ~( g+ }& K5 B4 I1 M' \
        int b = hexCharToInt(vec[i][1]); # U* O! E' @# M) c  v* M5 V6 c
        out[i] = a * 16 + b; * K; s* y- k& M+ f
    }
$ c7 }; \4 Q/ I" x4 o    return size; - v8 _6 {) `0 i+ r: `7 Y
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
  q" X% _% ~  f4 Z! Z#define TEA_H   ^, `% y5 b4 }9 _# g; C

, w( _; X- O4 b/* / p  X( X8 |, O1 o- y
*for htonl,htonl , n! ^- h  z6 G' c1 O
*do remember link "ws2_32.lib"
( Y( `9 _: M! D$ [9 t8 q2 j*/ - f# B8 Q0 z- ~# A: I9 w
#include <winsock2.h>
9 M9 E; ~% w. ?#include "util.h" & F/ O3 v$ Z$ t+ M; j

/ q& e* V& [$ v/ ?% _5 mclass TEA {
; U4 C6 B) Q. S8 H: |public:
/ m- G: v, ?  q    TEA(const byte *key, int round = 32, bool isNetByte = false);
7 l* a; s, k" D: d: X    TEA(const TEA &rhs);
: w% M" H8 g2 X0 W    TEA& operator=(const TEA &rhs); ' z& `" J/ M7 c0 k7 f6 w
    void encrypt(const byte *in, byte *out);
9 _7 d4 \9 q! n    void decrypt(const byte *in, byte *out); 6 J: v8 |) ?# C, l2 R$ m2 Q
private: % G/ x# N2 j- }% b& Y
    void encrypt(const ulong *in, ulong *out);
6 i, F- T- L# B3 K2 K7 r; z    void decrypt(const ulong *in, ulong *out);
2 f+ P. {0 ^- X. m6 f) t0 _/ f& z    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }   _5 G  ]0 Y1 t9 A2 B% U& e0 g$ h
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
* M- @' Y, X! D- F( V  Aprivate: . t0 b( z. p0 \
    int _round; //iteration round to encrypt or decrypt : y  d' T. P8 @) q4 e
    bool _isNetByte; //whether input bytes come from network - d  k! l3 g  ]2 T
    byte _key[16]; //encrypt or decrypt key
7 Q8 m4 j: i  `7 B& K! g}; ' n' p3 m1 _' L; `7 R. K
4 ^5 j3 p3 s1 a" K
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
7 o% s* S! s, E5 J 2 #include <cstring> //for memcpy,memset 3 H) e8 K5 O8 l
3  0 P9 I( [" K# u* I
4 using namespace std; 4 Y7 l1 C- ~; I* b& R
5  
0 Z  ~7 S% o! |% k" H. ?1 a7 g! [ 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
4 y0 a! S7 Y5 r5 ?/ W' ] 7 :_round(round)
( s; [3 L% Y5 t9 k. C0 G% T 8 ,_isNetByte(isNetByte) {
6 S' }5 q! N% L& V 9     if (key != 0) 9 H/ F2 l6 b2 ~
10         memcpy(_key, key, 16);
. x) X" z+ q! `4 p% u0 R11     else
/ l, p* _) f. B; x( D% y* B9 q12         memset(_key, 0, 16);
* ~8 Q+ i2 p5 v5 g  _: _6 F$ k. j6 l13 } $ a9 `* d9 ^0 F. t# \1 N& Q8 V$ g
14  
6 \  ~% x# X, ~15 TEA::TEA(const TEA &rhs)
7 U- g" B; v* j% S5 T- f" J: a16 :_round(rhs._round) 6 e3 O0 ^9 g2 q# o6 ^
17 ,_isNetByte(rhs._isNetByte) {
( o, Z% N& o6 p% q3 R18     memcpy(_key, rhs._key, 16);
+ L- w- Z/ D2 u% @, T4 B* X7 g0 J19 } . C+ ^. M" j; o4 f! R
20  
, U5 q' X! d2 h& p9 D' Y" T21 TEA& TEA::operator=(const TEA &rhs) { , x: ^2 j2 A, T( [: h+ O: `
22     if (&rhs != this) {
; D% n4 w+ M8 d) A# C+ r23         _round = rhs._round;
9 d$ p8 ~6 I- V: s& D9 b; x! P- I- f24         _isNetByte = rhs._isNetByte; 8 a1 v+ m) A# Z; }8 f3 J
25         memcpy(_key, rhs._key, 16); ) y9 L/ T, H/ v, I' ~# p
26     } 3 c/ B) x9 I4 B
27     return *this;
9 p2 ^6 R( Y& O5 ~28 } 3 \- Y0 V/ l' ^+ W2 Z+ p8 E8 Y- |& j
29  % Q5 X5 I9 }$ [9 @' a
30 void TEA::encrypt(const byte *in, byte *out) {
5 H# l/ U2 [' l8 z& p31     encrypt((const ulong*)in, (ulong*)out);
9 U4 v( m" m* T) u' u5 n" O+ @8 F( p32 } " O. A3 e4 S0 z5 b  o) a8 ]1 |+ o/ }
33  
; p" T" L2 _9 a5 ]1 G, T34 void TEA::decrypt(const byte *in, byte *out) { * f" L) j1 B3 T$ @% \- v
35     decrypt((const ulong*)in, (ulong*)out);
1 ^% }$ C, ^9 P2 C1 }36 }
9 X$ d% B1 j' W" o9 `37  
3 \$ a/ g' V" g3 b# U, c  L6 q38 void TEA::encrypt(const ulong *in, ulong *out) { ' E: M4 p  z% V# g: o2 }' ^" Q
39  1 i6 {; }' ?; `* c
40     ulong *k = (ulong*)_key;
) s& v% w- m6 G3 _) M41     register ulong y = ntoh(in[0]);
8 @. P( w+ u; A, \0 d) ~42     register ulong z = ntoh(in[1]); , L% R8 J* v, M# M
43     register ulong a = ntoh(k[0]); 3 p2 f  Z$ e8 Q/ I6 N& V
44     register ulong b = ntoh(k[1]); - M7 F# d7 k& Y
45     register ulong c = ntoh(k[2]);
' s, p. p1 A) H% J" Y: m, k3 L46     register ulong d = ntoh(k[3]); 4 A* ~6 ]; x+ L
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 2 }/ G2 v6 X# d1 r; q" {
48     register int round = _round;
6 E5 ?2 ~# N. L% Y" A1 `7 y' V! P49     register ulong sum = 0; # }- d: W7 S( b' a" L7 f  f
50  
8 a" w8 i' m3 a1 }  M" [; D; z0 j# f1 g51     while (round--) {    /* basic cycle start */
& _! @" }3 w. P4 U6 _) {1 s5 Q52         sum += delta; ! z9 @$ F* l+ {+ n
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ) O# J" ~9 }" b* p) h/ X: Z
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ' u8 M( u! [- c) u6 ~- e6 c( K2 a
55     }    /* end cycle */
$ z- C$ m- w$ T6 z2 n56     out[0] = ntoh(y);
5 z6 i* O0 B5 G57     out[1] = ntoh(z);
+ d; n: I& p: Y0 n  c* B; H7 Z58 } 3 }- _: E/ ?$ P# Y' z
59  8 F" d/ A7 x. J3 l% L/ C( a
60 void TEA::decrypt(const ulong *in, ulong *out) { 6 L1 k& ?: ^" u. ~4 J% R( r
61  
& f) t, n* {7 [& C& k1 n62     ulong *k = (ulong*)_key; : \; T% Q& X$ S2 A8 u4 f8 C
63     register ulong y = ntoh(in[0]); 1 X/ ~7 |2 r( [7 ]# E" Q! y
64     register ulong z = ntoh(in[1]);
! a+ p8 P" B% F+ ^. H8 z65     register ulong a = ntoh(k[0]);
. ^; P* l  [7 B" H! z  B+ v66     register ulong b = ntoh(k[1]);
% @6 [: D; f- J1 t6 A$ J1 _67     register ulong c = ntoh(k[2]); + @) d8 r. X$ i% X; N& B- ?
68     register ulong d = ntoh(k[3]); 0 D- A2 F. U' v5 H: _) H% O
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ # E& C  X7 j7 g
70     register int round = _round;
, i: |( T; u& r& O/ v6 b/ t71     register ulong sum = 0; 8 j1 i- ]6 w& h* d7 f3 q
72  9 r# ?& w, B. {3 i5 Z+ U% F
73     if (round == 32)
+ v  G) L# U) o- w74         sum = 0xC6EF3720; /* delta << 5*/ ! W( |+ i6 d& U" w: j8 Z) F+ p% ]
75     else if (round == 16) ) q3 b. }8 y, {6 X
76         sum = 0xE3779B90; /* delta << 4*/ : k9 m$ |3 H7 J
77     else
2 d- d4 H$ k0 x3 Q2 p  f% _! q78         sum = delta << static_cast<int>(logbase(2, round)); ; s; _6 ^  D9 U& ?, N
79  
( o! e/ r+ Q1 _4 |4 W80     while (round--) {    /* basic cycle start */ " v. t+ g" b6 Z$ C) U0 u- O% d
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 7 M- {5 f& |$ `. T
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 0 m6 R9 d5 b6 _. H$ p
83         sum -= delta; 2 l: `7 \' Q! d2 R
84     }    /* end cycle */
; G" J" k+ C8 S# |2 S' K! x85     out[0] = ntoh(y);
  b( j; j+ S# R: z6 K86     out[1] = ntoh(z);
6 `$ n  D4 |6 o. [% v87 }
7 F+ }7 ?* \& G0 ~
0 j' P2 R5 h: {1 X7 Z" ^4 r需要说明的是TEA的构造函数:
+ G  p$ n& i; a5 PTEA(const byte *key, int round = 32, bool isNetByte = false);
8 ]4 q6 D: X% R1.key - 加密或解密用的128-bit(16byte)密钥。 0 C7 a' \. D2 ~8 y
2.round - 加密或解密的轮数,常用的有64,32,16。 5 E9 d, {2 X) i( E4 a
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
! J# u; v% J- Y0 g0 _9 C( r. O, a: i, w$ Y; D( Y
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
, e+ V, V6 U  Y1 u' W: Z 2 #include "util.h" % [0 l! r! U) c5 z
3 #include <iostream>
9 X+ I( u6 I9 g4 ~! |( `9 M 4  
% J* g( i! L# D8 h+ q) H% J& Q$ U 5 using namespace std;
: D7 l. d, `$ M4 p% h" H0 h" B 6  
: ~- @& A: s" s( o+ [1 O6 k 7 int main() { , [8 o8 C' J! O! g
8  1 E  H3 w% Q4 A
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
1 ?# V. A, j* c5 v9 `, i10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
  {; A# L3 M  }( z11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 1 _% r* `% y, c+ h& S/ r3 e; J
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; ) b5 m. m8 q! a7 m9 S2 B" T$ L
13  
: N+ v8 c/ J# b9 G( m( v/ E14     size_t size_in = hexStringToBytes(plainStr, plain);
3 r2 w6 n, ^' @1 {- [15     size_t size_key = hexStringToBytes(keyStr, key); ; @% l* J" d7 E  Z
16  
8 H/ Z1 K$ I( \) `% u9 p6 ]17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
7 V0 n# W+ O  I2 I3 s% ?18         return -1;
* T* M# ]# g+ T# ]19  ( n! k. M, ]$ |
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
. L$ h/ B7 x" v21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
/ v& {8 w* |' M22  ; S' @5 |0 O3 y% ~
23     TEA tea(key, 16, true);
4 K4 e+ U3 O2 X. V% x9 p24     tea.encrypt(plain, crypt);
( N& S$ J# o0 U% p+ \/ G5 r" A* D( P25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
5 X5 C" c% G  {% @. e" v3 C26  - Y5 [0 L0 Q- D. M( Z
27     tea.decrypt(crypt, plain);
9 v% a  s+ |& G5 p; ~28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
) J) @) {  |* j' d7 f$ w29     return 0; / Y- g/ i4 a) [) I5 ?
30 }
& C- W  P% E& g" E8 _/ u5 a2 p; `. Q% l  `- G+ j% M
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
4 R! L; b3 C8 A. W  Q运行结果:
3 Y' k8 {( o3 e5 p- p- {' bPlain: AD DE E2 DB B3 E2 DB B3 ) G6 @$ J  Q: w) `  B
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 % g# Q) k+ \  y' W
Crypt: 3B 3B 4D 8C 24 3A FD F2
. ^/ ^4 R( z) U5 I8 N; [. uPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-22 12:41 , Processed in 0.022998 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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