找回密码
 注册
搜索
查看: 37577|回复: 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轮):- E' w3 d6 K: ~. m+ d0 M4 \
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
5 U& U6 l8 v7 ?3 o' {1 YTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
+ D, S6 Z8 l4 _6 K# ]' m之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
5 e% i8 P; s# B: u) B  d% k& G# {  u在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 % C3 Y) s  V2 q, t! J3 H6 j
在 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. . U- Y% B/ ]8 w# w+ d
  2. void encrypt(unsigned long *v, unsigned long *k) {
      G3 H/ v; C3 b; t+ H* p0 N3 w
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    " N8 g/ s) Y- G
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    . Q) F1 _+ M: ]- ^, F( ?7 Z3 Q
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    , G; K" j7 x5 L% H: o
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ - t& J: t5 E  Q. m7 D: a: s
  7.          sum += delta; 0 d2 n/ V' O  o4 v0 {+ t' A
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    9 ?: c5 V, x0 O9 Y' N; D: D
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    : A3 }& F4 [( D: I
  10.      }
    / y8 U' R, A5 |
  11.      v[0]=y; / b8 n* u; ^5 F0 a  r6 P3 J
  12.      v[1]=z; 6 N4 J: _( w3 ~% K! f* z/ O7 T+ k
  13. } " e3 B% i# ?6 d
  14.   / X, B6 h! P, s2 K6 w% s
  15. void decrypt(unsigned long *v, unsigned long *k) {
    + A( H1 H* E3 {4 K9 Q3 R
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 3 b, ^8 q4 f* @! R3 w
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 5 L& J& f) }! H7 e
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    9 S5 r0 G5 @, e  Q/ h; y
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 9 P# Y! W; G3 B' g
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    / U' \' Z2 N' y2 x
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 3 \. k6 m  {& Y6 T/ M6 w
  22.          sum -= delta;                                /* end cycle */ - F% l, y% q! d$ P! A2 b
  23.      } 1 j& L6 o  N# l9 K) R& i% D! U
  24.      v[0]=y;
    / f0 e. |% ]- l' M; J
  25.      v[1]=z;
    3 I3 \' q; d/ _" {9 _. `
  26. }( Q+ h, Q& j6 y' l' d% v
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 0 l% U* T. s  B7 Y$ t
#define UTIL_H
1 I, {. J' v/ \1 w) n6 M( {; x  G2 o3 q7 R- Y3 n
#include <string> 4 A) Q: e2 q7 x8 @* a( l: h
#include <cmath> % \  m' W+ I, A/ i) H# F" c% u+ e
#include <cstdlib> & E4 X+ L9 L$ ?" @# x. q3 [5 s
! j% {/ A. G. z! ~+ v
typedef unsigned char byte;
4 V0 |; B* S8 o6 c. ktypedef unsigned long ulong; $ b  v/ f& C7 I( j1 L* W$ D
/ Q' d, ~8 e. ]2 J. h$ B/ N
inline double logbase(double base, double x) {
2 N( X" ]; z6 b2 ~    return log(x)/log(base);
# h, f. l# h3 }* Y4 X( P}
- U" a- w9 ^6 j8 q 6 F# k' f4 N+ A+ z' f$ ]* Z
/* 1 i" p1 }+ O2 F
*convert int to hex char.
! f" {8 F7 Q9 i+ p*example:10 -> 'A',15 -> 'F' 3 s5 o/ F2 t( t/ K, `
*/ % {( o4 h, ?* c% h& s2 m5 U
char intToHexChar(int x); 1 ?3 `* `# D1 k& h. j' p
  i1 Z" E! v) L
/*
8 m. D5 L8 x3 {*convert hex char to int.
7 i' T1 N% ~9 ~) }5 [: @1 g  R*example:'A' -> 10,'F' -> 15
0 W! i1 F0 G1 ~, \" m; c*/
$ G7 ]* F3 E) c/ Z: p; H3 i4 Tint hexCharToInt(char hex);
7 u4 o( ~' o0 y2 {
9 b8 h4 r7 w% v; B. Cusing std::string;
, z. [1 }2 ~' W$ Q2 }/*
( @9 m% G( o0 h2 C" z/ v( u*convert a byte array to hex string. , B* x8 h. A% S  u, \, g
*hex string format example:"AF B0 80 7D"
/ [$ e" s! M0 m: v. Z0 n*/ + q* t& u7 ^- J$ f7 z! p6 \
string bytesToHexString(const byte *in, size_t size); # C4 S' @& V2 a# t
0 X7 L" H/ R( f2 |. i+ _
/* 6 a8 g+ R6 m6 t( u
*convert a hex string to a byte array. $ h9 p% V+ v# [/ a' U5 o. H
*hex string format example:"AF B0 80 7D"
: a6 n& V1 v6 o' L3 X*/
1 _* V2 ]2 b9 ~size_t hexStringToBytes(const string &str, byte *out);
5 T6 z; d% `# o6 I ! D+ @- V1 p: [0 S/ G$ l& L
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 4 U& [8 G3 y" g5 ?8 F: ?
#include <vector> 3 {, Q8 D4 `1 Q6 c" {) a  Q
% E" C% |& E! r  c; i
using namespace std;
  d' k- H, O2 h: S
0 u8 v8 Y1 q  c9 Zchar intToHexChar(int x) {
' M& Y) B. N( G5 t' c- o    static const char HEX[16] = { 3 `* i& D$ l9 n# y* p4 e
        '0', '1', '2', '3', - u: g  M* k' q2 X
        '4', '5', '6', '7',
" J' D( X/ Y" z" Z        '8', '9', 'A', 'B',
  ]# a- ?, c8 f+ I& H/ p        'C', 'D', 'E', 'F' 0 K* @( |5 U7 q  [" ^: f! V
    }; % ^" Y+ f- D! s2 j& o. M) [
    return HEX[x];
6 s3 m+ F0 T2 n  J" M; O* j8 D! B} 0 |$ ^# [/ |7 H0 f/ P
! V3 n1 s2 P, |" D7 b' ^: k
int hexCharToInt(char hex) {
2 z3 W1 O4 [5 x; P' E& r1 |  N    hex = toupper(hex); 9 q' t6 ]& v" @
    if (isdigit(hex))
$ r7 i- E1 d5 O) H5 m6 u* l, s, ~        return (hex - '0');
: w  ?3 {* C6 K1 A    if (isalpha(hex))
; s& M# A5 k' ^2 M        return (hex - 'A' + 10);
' A/ m5 F9 n! ?    return 0;
) T& u, |# F0 y9 e2 C}
/ ~) C5 f3 \, L, ]: _/ ^) w
7 F" w: o( {0 K; y. Y: zstring bytesToHexString(const byte *in, size_t size) {
; U" y$ B+ M$ x' X& w    string str; ( M* k. |( e, u" ~1 W
    for (size_t i = 0; i < size; ++i) {
6 g% u7 n# \% N        int t = in[i];
) g# w2 Z) ~  ]4 f0 a8 o0 U- y        int a = t / 16;
  V) k8 O9 }  |0 Y  G, e6 ?% y2 l        int b = t % 16; 3 B$ O' l. v: r$ }, @1 p; G
        str.append(1, intToHexChar(a));
5 [& F6 [& x! v' N: n( y! ~2 Y5 G        str.append(1, intToHexChar(b));
0 k4 ^; T# |  g( R0 Z! M        if (i != size - 1)
6 Q0 `6 r8 H# s. W, i5 m% O            str.append(1, ' '); 7 J, }/ }/ j" P
    }
1 _- `6 N$ |1 V+ ]9 D& @/ F    return str;
" }; Z$ c) I! z; `: R$ O, m}
3 Z8 u# K4 E4 L
1 d# T: U' V: ~- r  X( Gsize_t hexStringToBytes(const string &str, byte *out) {
1 F8 e% u- x" M& _
0 C9 a" o8 R8 g  n% n8 X" _    vector<string> vec; : l& p6 f3 h) u$ s+ s1 s
    string::size_type currPos = 0, prevPos = 0; 4 x$ V3 E; t% e$ A+ U
    while ((currPos = str.find(' ', prevPos)) != string::npos) { + b1 t" F# l0 w) o4 P! v5 v
        string b(str.substr(prevPos, currPos - prevPos));
" [9 ^4 ^6 z1 Q7 c0 Q# ?1 l! M        vec.push_back(b); 3 `$ T7 A& @; \0 D
        prevPos = currPos + 1; $ t8 ^2 N$ R. `/ t0 E
    }
! K! x* I, M% V# i* K    if (prevPos < str.size()) { " X% V5 k  Z* i5 q3 T
        string b(str.substr(prevPos)); & E( s9 y' y6 K, h0 K" @1 n
        vec.push_back(b); ' g, L3 V6 h) V1 w& i( G2 {8 c, w) y4 M
    } 2 P0 ]. J8 D1 [8 w' V: W* S
    typedef vector<string>::size_type sz_type; 2 z( i& A* W& {! X
    sz_type size = vec.size();
7 A- b1 u8 w1 x) I+ `! }    for (sz_type i = 0; i < size; ++i) { / I1 O6 B) r; f4 O7 E7 i+ `( k
        int a = hexCharToInt(vec[i][0]);
" i- D3 v8 z8 K2 Y1 d+ U        int b = hexCharToInt(vec[i][1]);
# q9 c( d) e5 Z  \* `3 T        out[i] = a * 16 + b;
5 a4 M. c; s$ u    } 4 \7 o9 m; N" L( p5 y' y
    return size;
- t) k' p7 T! @7 X. O  F}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
" m, l& t5 T" S4 x+ A9 v#define TEA_H 9 a) K2 C4 s' i  H$ ?% n

8 \' e5 A0 @( Z& f6 _1 M/* & b5 f$ b; A( }7 n4 u% X; h$ y
*for htonl,htonl
' d3 H2 K2 J* m" X& _*do remember link "ws2_32.lib" . f1 r& Y0 _$ M$ Z
*/ 7 b1 B4 h. d2 |& _
#include <winsock2.h>
' }7 x. ]1 _$ R; f1 Y) B( R4 q#include "util.h"
) v2 z: x2 M( Z3 c& u4 {
$ Y  Y, b' ^" _: e1 Yclass TEA {
/ X- f5 S% E  n4 z* H5 hpublic:   C, B  @( I; L& `$ @( r% D
    TEA(const byte *key, int round = 32, bool isNetByte = false); ( Y/ t  s5 P, i( s: K6 z  z
    TEA(const TEA &rhs);
0 ~3 C/ @# g8 A    TEA& operator=(const TEA &rhs); / W. e' T+ E. D3 A: Z
    void encrypt(const byte *in, byte *out);
2 e$ G- K! G2 I6 {$ }    void decrypt(const byte *in, byte *out); " F* V' u( Q1 e2 m5 K
private:
* _/ d( Q( m$ N1 i: Y' C# _    void encrypt(const ulong *in, ulong *out); ; L4 W; P. W! E2 A
    void decrypt(const ulong *in, ulong *out);
3 N9 Q7 J  g2 R  t. H    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } ( {0 Y' `: z; u7 u
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
, X: m3 s# v# O2 J7 Oprivate: 7 V# l# [6 y; R3 X
    int _round; //iteration round to encrypt or decrypt . M% y/ P) o) }- L
    bool _isNetByte; //whether input bytes come from network
3 u9 O9 ?- }) H$ g* m    byte _key[16]; //encrypt or decrypt key % f, v5 |: E  a# w' _: g; B' E6 V. V
};
! O- g) F+ ~) Z/ H4 Y
* O8 B& a8 I% f9 w* z: Y#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
' R3 k1 l, H3 X3 R 2 #include <cstring> //for memcpy,memset
; _  @: `8 t5 V9 s+ K6 S 3  0 w: r  [  E/ l; a
4 using namespace std; / A( c& n$ i7 L; C. N
5  
7 |* f  W$ p$ ^: @ 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
: L$ j8 u- I2 o5 P' Z- r& I3 r2 b 7 :_round(round)
; q: `% [8 d( {0 V 8 ,_isNetByte(isNetByte) { , L9 g$ @* Z/ d' b' J
9     if (key != 0)
" F9 P3 X  w& v0 M10         memcpy(_key, key, 16);
9 n. B% I: @% T/ N5 e7 h. T* n5 j11     else
! k, X: I$ r/ |% J7 \& s9 b7 C9 S+ ~1 R12         memset(_key, 0, 16); 8 G0 K5 _: T' R) D! r5 x  a
13 }
3 v+ L( `1 Y6 N! j4 |- |14  
! i& r' R  ~3 u& X; q  {5 F15 TEA::TEA(const TEA &rhs)
/ \1 W) B. C: t, @16 :_round(rhs._round) + l- s( n' K% ~4 C3 O* `) ~. m9 W6 T  s
17 ,_isNetByte(rhs._isNetByte) {
+ r+ F& p4 M+ t# T* V18     memcpy(_key, rhs._key, 16);
  G5 \# B- S6 t0 Z7 @# `1 m9 d19 } 1 M* T9 W9 n3 x! S
20  
7 T3 ~% H0 x# L, `, I$ q21 TEA& TEA::operator=(const TEA &rhs) { 0 z3 Q9 d) g& j  A# H" Y1 H
22     if (&rhs != this) { 7 k& ]* u0 O* T7 d: Z, E
23         _round = rhs._round;
1 X' l3 E" M& x' A, B24         _isNetByte = rhs._isNetByte; / @8 b9 y4 F$ N6 J0 _$ W
25         memcpy(_key, rhs._key, 16);
9 K( O, }9 k5 y26     }
, e" @% e( x! i8 t3 {27     return *this;
9 n) t; y, H' F& ?2 |. Q$ j# `28 } ) l% ^7 r* {) g( d! S" U! o
29  
  U9 ]0 g3 l! R1 c! k, |, {5 y30 void TEA::encrypt(const byte *in, byte *out) {
# v) n. m% P1 `- o" H5 T% X6 F31     encrypt((const ulong*)in, (ulong*)out);
. k( {/ Y' Z0 `' y0 Q32 } 2 ?( |) W% g' r  `- |
33  $ G# f5 b+ A  ^5 i6 |7 g
34 void TEA::decrypt(const byte *in, byte *out) { ( l( H/ Z+ Z8 I3 J7 b
35     decrypt((const ulong*)in, (ulong*)out);
$ d2 C8 K; _- J% |36 } ' t/ T6 |6 N8 O+ a( J
37  
" v/ l# _# z. {! ~% N38 void TEA::encrypt(const ulong *in, ulong *out) { / |& i$ n8 }% L; e. _( O' w
39  : L* s8 y3 k- a+ S; p
40     ulong *k = (ulong*)_key; ! L8 @2 T" b: T$ Q5 q0 D
41     register ulong y = ntoh(in[0]);
1 U! V# A! H3 i/ b42     register ulong z = ntoh(in[1]);
/ g0 O6 [$ i. ?43     register ulong a = ntoh(k[0]); . l9 ^% `: C  [, Z# M6 t# {
44     register ulong b = ntoh(k[1]); 2 x* t+ y2 {+ Q6 `5 B  G6 d: d
45     register ulong c = ntoh(k[2]); ( s* y9 d/ I$ a- |' x* R4 g/ @
46     register ulong d = ntoh(k[3]);
  b. Z2 ~$ k( P# r1 N% c3 U$ |47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: c3 Z9 A7 P" O+ t; s48     register int round = _round;   u4 p2 S6 n* E+ w" `
49     register ulong sum = 0;
" ^% K" g& z* v4 p50  & q7 B2 |  M# N2 u  O
51     while (round--) {    /* basic cycle start */ 3 k, A0 h* F4 E5 ]. r( Q( e
52         sum += delta;
5 @$ X1 b7 g# Y0 H  O53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
, G' p; L% @- ]( F9 C5 e54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
# l# C: P; m6 d  y: ?: n8 j1 g55     }    /* end cycle */ . ]  u9 C; R: j/ c6 Q) c2 n
56     out[0] = ntoh(y);
6 k( c6 [2 E( A# G$ p1 k57     out[1] = ntoh(z); . ~0 g; o( v$ j, a, D) b, P* s
58 } . Q* Z+ Q* j2 ?, h9 ~
59  3 a" a: }# ~; a! M. V: r. Y/ O
60 void TEA::decrypt(const ulong *in, ulong *out) { 7 C' c' h. H# v1 x& Z
61  ! D. e2 ^+ _! B9 }
62     ulong *k = (ulong*)_key;
) y% C/ M3 L' A. R0 i63     register ulong y = ntoh(in[0]); 0 g6 {8 j/ z! L) [
64     register ulong z = ntoh(in[1]); / j% s& _$ n# n) c" U
65     register ulong a = ntoh(k[0]); % x5 w8 {. k% x/ }- Z- [' Q
66     register ulong b = ntoh(k[1]);
; q9 m. Q4 p, A# c  ]+ _! w. s" a6 |67     register ulong c = ntoh(k[2]); / [5 j/ y# H* Q' m& Q1 p
68     register ulong d = ntoh(k[3]); & M' v* \0 o* c) A+ {, l+ A4 j+ N1 m
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
5 D) J% b, {* b70     register int round = _round; 3 }9 v4 N$ h1 P
71     register ulong sum = 0; # B. b8 }! |8 l7 q% N( j3 f
72  : x+ A9 F- q* |/ `
73     if (round == 32)
; `7 `& C$ e# h) H" {74         sum = 0xC6EF3720; /* delta << 5*/ 3 {9 X. r: a$ k+ d7 X, o
75     else if (round == 16)
: _$ @0 p0 x* G: a4 m9 T# H& {76         sum = 0xE3779B90; /* delta << 4*/ - t  f2 X: U: f1 E$ V& x/ S  ~
77     else - R( [- h' C% h0 z- ^: x
78         sum = delta << static_cast<int>(logbase(2, round)); ! M6 k+ B% M' ]8 A
79  8 M0 \+ K6 z% o
80     while (round--) {    /* basic cycle start */
/ @0 S/ o* K) O& ?4 r& ~, F/ R# w81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
7 R7 `5 i& j% J. c: ?2 a) m) r. F82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
6 d; j9 c+ o1 {7 b83         sum -= delta;
4 F8 n8 k7 o5 q: @84     }    /* end cycle */ + W% \) f- d# P& Q6 i. Y) m
85     out[0] = ntoh(y); ; s8 U8 s4 J+ ^
86     out[1] = ntoh(z); 4 l3 w( `3 |1 T0 v
87 }& u- c7 w4 i0 _- O
$ S0 _! }2 x5 e0 i
需要说明的是TEA的构造函数:   i; L3 Q0 I! [& p# l# g
TEA(const byte *key, int round = 32, bool isNetByte = false); ! X% J+ ?+ K/ Q3 Q  L4 ]/ C9 [( C
1.key - 加密或解密用的128-bit(16byte)密钥。
) w( O* a1 b* Z$ ?5 _2.round - 加密或解密的轮数,常用的有64,32,16。 $ V1 Y8 U  v8 d( Z- {  b) o+ Y
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
0 K, L: ]2 h* d! m
. F( @$ H* K6 c1 J, h4 ]( U7 j最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
* {9 g3 p, o8 ~/ j3 k8 I 2 #include "util.h"
' n( y6 G1 G! @ 3 #include <iostream>
$ W$ X8 J; J+ C- G 4  ) h5 p! J' ?+ W2 @. F, G
5 using namespace std;
# H* @) s+ o# c( ` 6  
  c8 s" C  w( A' ~% `5 N 7 int main() { " k4 R' ]9 K5 F2 u$ P) v0 c
8  $ j, a8 x1 |) K* j) Q. o. P/ ?
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); : j5 s# g, {. J$ y6 u! j
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); * T- t7 F- s/ m) T" a
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; - k2 e. ^6 M0 D0 i9 U7 Y
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 5 [/ d* b$ i  L5 L/ Y+ o& \
13  - \  @3 p+ v) |3 B1 g8 a
14     size_t size_in = hexStringToBytes(plainStr, plain);
7 B* k- i' \( O6 s0 [15     size_t size_key = hexStringToBytes(keyStr, key); % e7 ?  y* L. h9 L
16  
3 f2 \$ A3 S; D5 F6 p7 `17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ( T3 x7 C6 O6 c: r9 y  }% e  y* [! s5 M
18         return -1;
9 t, y8 U# Z0 k2 k, ^1 p19  * P* r' U" ]1 m! C" h
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
8 J& T3 ~4 C  i/ ^( n/ s5 Z3 x, J21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
$ Q  V- z) p" H6 Z* i- G22  
; e, ~& ?1 j$ u5 i* q* a23     TEA tea(key, 16, true);
/ I) _0 l+ M2 C24     tea.encrypt(plain, crypt); + o* g5 D! j  j/ ?# v
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
6 U5 M9 Y% ?/ ]- `+ J26  
' I7 t+ M8 g, Y( y" L* V+ p* _27     tea.decrypt(crypt, plain); 8 {) S3 J" \5 _- ^# @$ q
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
5 j3 S+ D+ K2 H* h! e29     return 0;
+ M5 i; M$ P+ z9 U- W$ Z& l6 v, F30 }$ J9 r% `. R, X; m

( C* p' h( r$ a; a5 d. ^% l: q8 j本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
) f! i9 u4 }% q3 f运行结果:
4 i7 v5 V( M  D5 @Plain: AD DE E2 DB B3 E2 DB B3
5 s9 D2 E8 @% y! vKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
4 s7 u! T% |/ T6 E$ k1 ]8 ~Crypt: 3B 3B 4D 8C 24 3A FD F2 % j$ P$ _: m! t! ]
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 23:12 , Processed in 0.021509 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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