找回密码
 注册
搜索
查看: 37756|回复: 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轮):, B; l4 V7 t0 |1 G6 p
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ) v# s7 w9 a9 `9 s; L2 H9 ]' `
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 ' u/ q+ b3 A1 H4 ?
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 , D4 N- t1 o2 `+ Q; G, h' z
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
% g+ ~# x: u2 Z& 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. & K) J0 }+ @; }" f" q3 x
  2. void encrypt(unsigned long *v, unsigned long *k) { ) w0 e( `8 N8 R/ G
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ * N0 j5 u; {+ \8 N
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    - a# _2 j0 B! ^* b5 M4 n9 M7 Y
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ ) b8 f( P6 r- V& T4 x  `
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 6 M. |, H! }/ g4 }/ G$ _& M0 J! O
  7.          sum += delta;
    * K6 J7 p- t/ O" [* p
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    0 _! v: v% E3 P' N" R
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 1 g3 P6 _0 G0 t0 }. T
  10.      } 1 `1 o) @' u& b: D( ~3 L
  11.      v[0]=y;
      a* r$ p/ |' R2 R2 s
  12.      v[1]=z;
    * t) ?5 Y; H1 m) j1 i: o  F
  13. } , E. p" v1 b: Z% A" Q/ R$ Q
  14.   ' w+ S# W6 c- {, [' U5 o6 k
  15. void decrypt(unsigned long *v, unsigned long *k) { # a8 M# @* T, N0 R) s# R- ^
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ - D9 |9 J0 {5 A- {; X/ w+ k
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ) j* q2 c1 v) q
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    ' ~, a5 B6 K  D% q9 N2 f
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    4 C  R0 g8 N6 W7 w2 U2 N  W! l
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);   O9 A' z: K& v. G
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);   F- z$ E, |7 A
  22.          sum -= delta;                                /* end cycle */
    / ^( F2 g* S6 J6 P
  23.      } & D+ V* A5 x- R  T
  24.      v[0]=y; 1 P- T2 O4 e! v% g" d2 z
  25.      v[1]=z; $ T- U% H/ g: R7 s: \. P3 D( H
  26. }
    $ S. D0 Q! W. M8 A3 O3 |- j* m
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H ( G, m+ t. z. x+ ]# L
#define UTIL_H
* m+ A. K8 o* i0 c9 U) Q/ Q8 ~
: ?% ~+ U+ Y1 C#include <string>
9 x8 J+ E, P' S" V& q#include <cmath> 6 Q: r5 G  ^2 |# J6 R4 N3 v0 a  u$ M
#include <cstdlib>
  l8 A0 s* M. Z; l- m9 b . _. T' R$ y! x1 @
typedef unsigned char byte;
* k9 v6 D- I/ v9 M+ G2 L  Ytypedef unsigned long ulong;
% Q* c0 }3 g# \) [( _& T3 j7 G! t
/ y9 t, E. J, Q0 h7 x# zinline double logbase(double base, double x) { ' M- T* }0 ]* e
    return log(x)/log(base); , R& q6 G9 s8 B' \
} 9 f$ I0 ~1 E4 [+ g
' k4 |9 U8 X* n; R/ Q
/*
0 P8 T$ x/ N$ }: _*convert int to hex char. , k& i3 z$ Q1 n
*example:10 -> 'A',15 -> 'F'
. \) J/ I0 C2 W*/
( a6 P% s# D+ M1 P3 t+ {; r4 V2 Schar intToHexChar(int x); 4 v( K( S/ h. Y5 D- Q! J
2 O4 s0 y9 ]* C5 n8 ?5 |
/*
: k+ K- x! P9 Z' g/ W+ ]# e& I4 N*convert hex char to int.
2 ^) C# }% m, p*example:'A' -> 10,'F' -> 15 ( h) A) [# R' Z$ W, @7 _
*/ , E7 z9 O9 L0 q, i
int hexCharToInt(char hex); 5 L# R! m3 j; ^: D  u
3 b. Q" V' V* A# @8 z' m! L1 x
using std::string;
' d) d8 ?/ K6 A, X& F/* 5 D6 X3 s/ V! W# `, \# S
*convert a byte array to hex string.   @$ b  ~* V- e: r* v( }( R
*hex string format example:"AF B0 80 7D"
$ D: \) n, h1 @/ b) C/ o( h*/ , U/ s  W. G9 q( K! h2 k! j  B
string bytesToHexString(const byte *in, size_t size);
0 b) h0 M# `2 x 4 i% u0 S7 M% |' t! {5 V
/*
9 b& [3 C" l4 F& [) K2 G9 z*convert a hex string to a byte array.
" f1 \/ C8 t; o) y*hex string format example:"AF B0 80 7D"
+ A% [. F9 X6 z+ X*/ ; K% ^6 b4 X; B) Y( r3 G+ \4 V, P8 H
size_t hexStringToBytes(const string &str, byte *out); & k2 G8 }4 L7 u) ^; w; C2 E

: P; P, @" |' I* b- ]1 H#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ( t0 j* r' R1 }0 i
#include <vector>
# C8 g  T6 x3 h3 d6 X
; @  v  A/ V: ausing namespace std;
# P1 @  ^, J/ W1 R- r' R; D- }& O
8 T2 ^$ Q# b9 d# v% hchar intToHexChar(int x) {
, j( L$ {# P7 o  J    static const char HEX[16] = { ! X& z& v8 ]0 @; |
        '0', '1', '2', '3',
; S) v- w- h# @. u% g        '4', '5', '6', '7',
" H% j/ b- A+ U; o        '8', '9', 'A', 'B', + [2 g" Q* b7 R, T
        'C', 'D', 'E', 'F' . W6 b) k( K( I  h
    }; $ \! w: z0 L0 K- \
    return HEX[x]; + F/ b4 n, {7 g& K- X) P7 o
}
( w% m; B! [( n( E 4 D2 U6 c( |0 }! l4 @
int hexCharToInt(char hex) { / e1 e  D- W9 r1 X4 m
    hex = toupper(hex);
" j1 a9 Y  K( x+ }: I0 s    if (isdigit(hex))
# k7 b# O' a; P        return (hex - '0'); 5 ^( P: [; X& `9 i- c# r
    if (isalpha(hex)) # D  U1 u/ O$ A8 i
        return (hex - 'A' + 10);
2 C* p! @" {8 A; ~* u0 _    return 0; * `' u0 e9 B9 N9 N
}
# d' a/ E/ ^% ?5 Y' U0 M' r # p5 Q  M0 y8 E$ ^
string bytesToHexString(const byte *in, size_t size) { 9 B2 r; x0 e& ^$ |
    string str; ! c, b3 T1 k3 g; ]2 U& f
    for (size_t i = 0; i < size; ++i) {   m" _, W8 L- g
        int t = in[i];
3 \0 a: [: T: z: C/ w7 |        int a = t / 16; $ y2 u8 R$ e* o: ]% ]
        int b = t % 16; / [6 V+ t, ~6 J! k/ f2 m
        str.append(1, intToHexChar(a)); + V6 @/ h( Q- L5 e
        str.append(1, intToHexChar(b));
7 O/ l" w2 L! q2 \9 B# G, z        if (i != size - 1)
8 ^' I% i6 M8 v7 E# T- @( M) K            str.append(1, ' '); 1 W7 m7 G0 T- ~9 j: ~! N6 I
    }
4 U( l4 c8 v" ?2 h* O    return str;
1 Q" I9 Y4 @% L( A}
# r8 p3 C" p5 K4 q. O
; G8 \* j4 M) Q/ B  l. U# Asize_t hexStringToBytes(const string &str, byte *out) {
, m) E, g0 I. [2 w
+ |3 M, C8 I. a7 P    vector<string> vec; / r, p+ y; k* ^0 Q2 X
    string::size_type currPos = 0, prevPos = 0;   `8 t2 g0 R' c$ `6 y
    while ((currPos = str.find(' ', prevPos)) != string::npos) { / T+ Z+ I/ y! n# x. s5 c  n6 {0 X1 Y" D
        string b(str.substr(prevPos, currPos - prevPos)); % ]0 w; a; T6 k8 I+ m7 h
        vec.push_back(b); 8 ~8 @9 A  h/ k3 @$ [8 U
        prevPos = currPos + 1; 1 m+ J) y, `, _; r4 X7 s
    } 6 I. P9 l1 `0 P* s) E5 V
    if (prevPos < str.size()) { " k: K1 k- q6 q# G; w# X& m
        string b(str.substr(prevPos)); % B. B  [& g; N" m
        vec.push_back(b); / Q( T4 X" k% I# }& L
    } : N3 O, G; Q. |  S( m7 N+ |( J
    typedef vector<string>::size_type sz_type; " b, I/ P9 [/ t# o
    sz_type size = vec.size(); . P0 A- ^! i0 }5 H7 y" B
    for (sz_type i = 0; i < size; ++i) { # G) v) J; O8 p; c" j
        int a = hexCharToInt(vec[i][0]); 2 y! M& \; p" |7 R# _- g
        int b = hexCharToInt(vec[i][1]); * q$ w) Q4 \. c  w7 ^
        out[i] = a * 16 + b;
4 G7 H% B% L9 J" `6 N+ E% q, n0 f    }
8 L$ m/ b, n" i! h+ C) U    return size;
' u; u  \! J! R( b; C9 @! j}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
( J- t6 }, p% p, _( U#define TEA_H
, n* Y1 S& T! M: \! w : X! Y; a3 {0 N2 V9 c; ]. T
/*
/ k( v5 ~9 ]  w*for htonl,htonl
8 l. U' @* a0 J6 w*do remember link "ws2_32.lib"
+ G0 t2 b5 f/ L7 A4 k9 a*/
8 u8 C6 W' z2 K2 s#include <winsock2.h> + `6 i7 S- D" {. k; k& O0 V# |' T
#include "util.h" # O7 Q( M2 G) H" c+ |8 F5 s

, F. N: _( W5 H  m! J3 yclass TEA { 8 N& i- E4 u" ^; O' P3 i0 p( t
public:
: w* }7 l: {+ u+ |2 T    TEA(const byte *key, int round = 32, bool isNetByte = false);
: ]  L0 [7 ?% W* P4 z; X7 s2 y* n% q8 \    TEA(const TEA &rhs); # I# q+ K  i' b5 n, N2 V
    TEA& operator=(const TEA &rhs);
, w9 w4 V' `+ B8 W( p2 I8 k    void encrypt(const byte *in, byte *out); / {/ C9 M" w- ?( ~
    void decrypt(const byte *in, byte *out); 9 F: i# q- X* F1 W+ @$ `3 p! v
private: ) U- a2 ?( ]) s, ]2 S
    void encrypt(const ulong *in, ulong *out);
$ D4 ?6 e, {. S/ |: D9 v3 G    void decrypt(const ulong *in, ulong *out);
# Q; _6 N+ i& h$ q0 y8 m9 {, d9 j" h" y    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
( O* `; y: K* s. @' }+ q    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
4 e% P$ l2 n4 {' z7 M+ Z! jprivate:
, _$ z8 i5 j& `2 o    int _round; //iteration round to encrypt or decrypt 1 E1 q; L" i0 ]9 K3 @+ X- n7 y
    bool _isNetByte; //whether input bytes come from network + Y8 X  G* s6 t& o
    byte _key[16]; //encrypt or decrypt key 2 Q; ^. F7 N: E6 ^5 y8 B
};
5 p: T# f  l+ V8 P0 {  H
. i% C" D. X; R8 |#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ' c: j& w3 O2 ?  R: }
2 #include <cstring> //for memcpy,memset $ X0 n; s9 D6 L5 O
3  ) U( b  [6 Q) j& X. K8 v; X8 E
4 using namespace std; 4 c5 J4 _: K9 d" [9 ~# Z% A  j; s: s
5  1 ^2 Y6 h; P2 w, V
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
2 w6 R8 y( x7 M& [ 7 :_round(round)
* T) p- X' S7 R0 t4 u: u% U 8 ,_isNetByte(isNetByte) { # e+ U+ p, d9 b
9     if (key != 0)   d' w2 b* E0 L+ F( o0 d: Z
10         memcpy(_key, key, 16);
" ?2 x% V9 C5 k2 U2 I" b5 e11     else
5 `+ E& s/ E1 h  f3 f12         memset(_key, 0, 16); " X7 ~3 |& Q: s; u  Y# d
13 } ; r4 e  v/ n6 B
14  & U+ s; y# k: |9 d4 l3 \; d
15 TEA::TEA(const TEA &rhs) 0 `5 R- c# q+ S3 }& H
16 :_round(rhs._round)
) H! ~1 h+ z, b- x: Y! J17 ,_isNetByte(rhs._isNetByte) {   N+ X3 N) N) R# q/ F3 K& u
18     memcpy(_key, rhs._key, 16); # {4 ]: p% W8 s( b  x% W# [
19 }
! s5 U. ?3 x8 R, W20  
6 M; H1 O1 G* U  y21 TEA& TEA::operator=(const TEA &rhs) {
: M" e, E+ t, e2 Q* K) ]; X22     if (&rhs != this) {
# f/ H% M, y; i) C* I3 Z23         _round = rhs._round;
% ]; ~1 C0 Z/ w( x& [24         _isNetByte = rhs._isNetByte;
; b& w2 G$ ^  N5 |% v25         memcpy(_key, rhs._key, 16);
2 j0 u+ x9 f7 q' L$ U( B26     } 5 m" R/ F( Y: \
27     return *this;
- T" i, X6 ]/ P& r7 l5 K28 }
1 F4 a/ a; h; A: m, j* f29  : ]. n9 E. \+ Y7 S
30 void TEA::encrypt(const byte *in, byte *out) {
# D0 K" _/ x% K" m% Y" Z31     encrypt((const ulong*)in, (ulong*)out);
2 T% J; Z6 t% Z/ i. w; r32 } " `$ d8 [1 V% h5 [: |8 R9 x
33  
  e9 U7 Q; }; P: a34 void TEA::decrypt(const byte *in, byte *out) { ! Z8 H. h8 l; K- b, `4 O
35     decrypt((const ulong*)in, (ulong*)out);
- k, r) ?# K1 s' C: h4 r36 }
7 h& O/ g2 Y/ G4 W* e. }5 I37  " P' k6 b2 B5 M5 c" V9 K+ b
38 void TEA::encrypt(const ulong *in, ulong *out) {
. `0 a. q/ G+ A" c39  
- h  [% G3 _# \2 J/ D3 K40     ulong *k = (ulong*)_key;
/ @% o9 C* W" i) A+ a( v+ Q) p41     register ulong y = ntoh(in[0]);
9 k5 k. b  ~; `0 d/ j+ g1 L) U42     register ulong z = ntoh(in[1]);
+ k* u, k( ^" ~& m& K0 y; {43     register ulong a = ntoh(k[0]); + j* I: N" H; i, w1 `8 c
44     register ulong b = ntoh(k[1]);
- F) ^% R# j& P- N, s% b9 V# r45     register ulong c = ntoh(k[2]); $ Y3 X3 v' u) R. B" q
46     register ulong d = ntoh(k[3]); % J/ R* X! Q3 u; O7 T7 h+ n
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ; W0 X- i6 z1 A$ w
48     register int round = _round; # v/ ?$ y( P/ f# U
49     register ulong sum = 0; 8 p3 V. {/ H9 u, K2 X
50  % z  M( C3 N: v! L' |
51     while (round--) {    /* basic cycle start */ % H6 ~  m6 I; ]; C, U% n# [
52         sum += delta;   P& r0 @7 w% m( U( [7 W
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
. J4 |+ j2 q3 l/ t  P54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
) C+ e6 D( S4 T% K* n* }55     }    /* end cycle */
% D& @8 p- y: ]3 V3 Z# c56     out[0] = ntoh(y);
/ I, r% I2 ]7 @% L) B57     out[1] = ntoh(z);
! S; K  y4 _7 w  \- ~- [  q4 }" l1 t58 }
7 g& U1 Q% i# n: ~) y59  ; t! k9 I+ H- W1 K8 @4 Z
60 void TEA::decrypt(const ulong *in, ulong *out) {
0 k$ N. R0 E$ ?. {4 e0 S0 j5 ]61  - P  G( N" x( I; C/ I' G
62     ulong *k = (ulong*)_key;   b& A  k7 b- q0 {- M
63     register ulong y = ntoh(in[0]);
$ l! g- K1 k  f( m64     register ulong z = ntoh(in[1]);
2 b) T) w7 l9 Z% P5 X9 r" e3 _65     register ulong a = ntoh(k[0]);
3 E9 D. M* F2 \2 i# _# x" H6 e' `9 ]66     register ulong b = ntoh(k[1]); - o5 Z2 K  N! a- [9 G! }& T
67     register ulong c = ntoh(k[2]);
6 W: F$ n: J! C68     register ulong d = ntoh(k[3]); 1 n' O0 e% m3 T5 U4 l! @
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
+ G) J& E# g8 K$ s" X: C9 c/ F, x8 `70     register int round = _round;
" ?. Z! |% I" K+ l71     register ulong sum = 0;
  F: C7 h' |/ t. S8 \7 R, l72  " |$ Z% [+ y7 Q4 k( s8 {
73     if (round == 32) 1 {4 K; E  f& s# n& Q% l
74         sum = 0xC6EF3720; /* delta << 5*/ : t; e' h) B* g
75     else if (round == 16) ; w! {  t+ i  d$ x/ K
76         sum = 0xE3779B90; /* delta << 4*/
& H: Q4 v& m! i# b  _: {77     else 2 ^, y* d) F5 p4 E
78         sum = delta << static_cast<int>(logbase(2, round)); , m3 y, U* F4 p% b* k& \8 W
79  7 b' |% B( D9 F# ?8 t, Z4 R
80     while (round--) {    /* basic cycle start */
* _, r) T3 U% \5 e) x81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 7 ~6 G1 o8 T" J" x) J
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
5 @% u# m6 U, Z6 i2 M83         sum -= delta; ! g" |8 A9 d/ q3 m
84     }    /* end cycle */
1 Z  l) B/ U5 M5 P3 _  `' f85     out[0] = ntoh(y);
: L+ I: F/ P  y) V# c* V86     out[1] = ntoh(z); 5 f1 i0 r' u6 `  v8 A$ \. F. @- R" [
87 }: M  E' V* w8 p

& M( Q% J* G( E3 U7 ?9 V1 J需要说明的是TEA的构造函数: & d3 I7 n/ `/ ]3 N: s6 v+ V& _
TEA(const byte *key, int round = 32, bool isNetByte = false);
4 w* E" W; R2 d( n1.key - 加密或解密用的128-bit(16byte)密钥。 5 E4 X! o1 B: S0 `
2.round - 加密或解密的轮数,常用的有64,32,16。 0 [, Z) w7 u9 n4 Z4 U
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ! k2 S) R& x. l1 ^9 d3 O$ U9 s

+ a; k. H- y. o: D5 z最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" / x: }) R: n8 _* b; i% d
2 #include "util.h" - i) o' C0 D' B& w
3 #include <iostream>
5 V0 m4 S2 g2 r% \5 C/ G0 p1 x0 u5 B 4  4 Y8 u4 h6 U' w0 b
5 using namespace std;
4 @6 r' F* I$ M' f1 O% k 6  
. ]2 D* ?  N) X6 y7 ? 7 int main() {
! U. k: t! i7 g1 Y& g( y% Z3 y' \ 8  9 |5 Y9 T' D( S
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
3 N. X8 z1 k1 b10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
" Q6 A5 g) _' V: }* _- @11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; + @2 D5 c0 t8 u, [' K
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
8 }* b1 E' ?5 ~" s( M5 w; h) u13  
$ b$ c3 W. p4 U4 \9 `3 F& D1 h* p" h14     size_t size_in = hexStringToBytes(plainStr, plain); - `9 F/ G8 w5 W; Z
15     size_t size_key = hexStringToBytes(keyStr, key);
$ G$ m+ Q: H7 l! a9 V16  - y1 p5 a. }8 _9 `4 \1 f- N
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 0 q; }2 G! \, J9 n( n
18         return -1;
. x4 B* L; f- @% t( G( w19  
- k; h9 z# Z4 _! S0 \. _20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
7 C5 l& h1 b5 \5 y/ q/ }& `; D21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
! `4 d0 V% u$ n- j4 r" G# l22  
! j& P' E7 V& F: G1 z23     TEA tea(key, 16, true);
" V( z7 o6 [) _3 C7 _& s  I( [* T( X24     tea.encrypt(plain, crypt); , t8 R# l+ T/ d
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
8 [' @3 ^! @, e- \% a/ `26  + {" `1 h. T5 d; c7 U% q4 M
27     tea.decrypt(crypt, plain);
* I) U/ G8 R9 c+ X/ j; g28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ; v! e6 H0 v( C# k# m: b9 b9 X
29     return 0;
6 @+ |, \) h$ p; \9 z7 Q1 Y30 }
, w; [  A, u' j* T( U2 k' `9 ~9 I& d' U1 `0 E9 H
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx/ c1 X3 w! Y- `4 }' |
运行结果:
! i" U0 t# [( _$ x' hPlain: AD DE E2 DB B3 E2 DB B3
" q, R) t5 X% Y, n1 ^' @1 X8 S; k* KKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 % B4 S: ]1 ~9 I! b
Crypt: 3B 3B 4D 8C 24 3A FD F2
9 N4 \, X" Z* W3 R) cPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-21 04:39 , Processed in 0.021622 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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