找回密码
 注册
搜索
查看: 37604|回复: 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 V; T# |. i& Q* z  v1 J  j; s微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 2 f' Q- d) ]# L5 C
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
, ]9 L& R0 w+ C4 C) o- V' z! z$ o9 `之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
) I; r" [$ j- l3 E2 q% ?+ M在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
. c/ W6 T' ~! v1 x; ?6 J- z在 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. / c! y+ o) d/ e' T* z. p
  2. void encrypt(unsigned long *v, unsigned long *k) { " s5 ]5 ^: r" ~; ?# S2 r
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ # U9 o) W9 {( N& q, ]( S
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ 5 r6 f+ l) ^; [9 i5 R  }& @: V* F
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 6 F5 K2 n/ u3 o9 b; i( `
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    2 {. G' p5 u6 D8 N, T( Q
  7.          sum += delta;
    4 |$ [8 S& J9 h. @, V, c; D: I
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); * `3 [) b3 `9 W4 N( F/ j1 P9 }
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 1 z" T0 ~" k" F! F0 H% V
  10.      } + W9 b7 [$ J9 r; M! u- C
  11.      v[0]=y;
    ( z8 W+ Z. z4 M4 \( V2 B3 V  ?4 H
  12.      v[1]=z; , B( \4 N: r: O
  13. }
    ' }; J0 }" h, J, G, ^* M, m
  14.   
    ' M7 h" t+ h/ v% V6 F+ `
  15. void decrypt(unsigned long *v, unsigned long *k) {
    & D% q3 }; I# c- Z4 Q4 P
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    0 Y8 C7 }* }/ J3 S: U
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    2 d' ^0 p1 j" k
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 1 n1 ^% _9 o' V$ p. r( n  v7 I
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ . k4 N7 v  b! J4 g5 E6 {. [3 G
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ) d. _# ]& n3 X  V9 g1 W! P
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ' r0 C+ R) `3 H5 d; X% j
  22.          sum -= delta;                                /* end cycle */ : ^8 o2 o4 y6 a% z0 e$ o
  23.      }
    5 u" d3 g/ S. g( R' p
  24.      v[0]=y;   A7 X& b' D- a( V6 ^( Y+ g
  25.      v[1]=z;
    2 m8 U  z; `9 `0 P$ P. }+ W9 K
  26. }
    6 W. H1 X: Y7 T/ q2 P( e
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
2 M3 E# ]; M- s7 V8 s0 S#define UTIL_H 2 f: e4 w( Q5 F+ a- F- C& u$ i, g) q
' L& V) T$ P9 A+ n5 J' g7 p
#include <string>
, f% u2 O' t* g6 K#include <cmath>
% `* ^- \* U# N: b#include <cstdlib> $ t" F& F  b3 j4 j6 G
8 q9 f- m/ o1 O* ^: H" x' y
typedef unsigned char byte;
* ~6 F. l. G; P* Q* @typedef unsigned long ulong; 3 s# h% J( x/ K

  c  M" j# E$ r" P+ ninline double logbase(double base, double x) { * V3 v) Y$ F  J/ |: E
    return log(x)/log(base);
) e* B; e1 o2 T6 j# o, b}
. q1 {% Z6 s  j3 o% w4 \4 b  a9 A $ Z3 \8 N  d2 D* a
/*
: ?3 f. c6 j- t, I*convert int to hex char.
1 h) ~) P9 K, h# C0 l5 f*example:10 -> 'A',15 -> 'F' ( b$ o. \, r8 u1 F' `7 V- T4 X
*/
( w% Z+ g" B6 F+ Qchar intToHexChar(int x);
' v$ J) b1 y0 U8 V" ~5 V- I/ | # Y* k7 ]2 [* m: Q& u/ C9 w7 o
/*
9 B+ w" J  o8 T! o' u; Q3 P*convert hex char to int.
" Z" ^( ~& f2 J) C8 ~: V% A# f*example:'A' -> 10,'F' -> 15
3 b5 e' v) A7 m! k& X  V*/
" I/ {- C$ w. ^; B7 Y( u9 `- B5 mint hexCharToInt(char hex);
% @3 c/ U! |( a' M5 |, Y  o0 e
) Y% _- `2 a4 k; R6 }6 K3 X3 C) cusing std::string;
) T# U& ^1 Q6 h/*
2 h- M3 I3 O# ]& G6 ]  Q! f4 R*convert a byte array to hex string. 1 f$ U  X3 R/ c3 U2 T6 F0 \
*hex string format example:"AF B0 80 7D"
9 O+ e- @0 t8 ~; m* \*/
0 X6 k0 q, ?+ k( X* estring bytesToHexString(const byte *in, size_t size);
1 ?, d! K/ @8 r  @/ W
/ z5 y. b# t4 }' U; X5 H. n/* / q- w0 g3 _2 q. I
*convert a hex string to a byte array.
+ |. {5 n; E( e5 h0 C*hex string format example:"AF B0 80 7D" 6 t, o, v  ]8 I& X6 F" ~/ W
*/
9 r3 W, _8 |) h; @8 Rsize_t hexStringToBytes(const string &str, byte *out); / G5 o" r" q" r3 }5 ~
  c7 N( R2 y. E' M- [
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
. A! a) K5 ]# j7 v0 Z( O#include <vector>
7 q% s2 r9 u6 b7 h* {3 @: j
: \  e+ t3 E# t" V- b& Xusing namespace std; * S1 n! L: y" w" L3 S6 _! t: ^+ n+ j: e

6 y( D! ^+ c# v! E5 z; Ochar intToHexChar(int x) { 9 B0 u2 P# G( p8 g
    static const char HEX[16] = { # C" j  @4 a3 l3 x
        '0', '1', '2', '3', & ?( v5 _3 o4 r5 J$ Y/ `
        '4', '5', '6', '7',   N2 a9 e' s, l, ?# Y2 `# I3 E
        '8', '9', 'A', 'B',
: ]+ \5 W/ b% W3 }4 I        'C', 'D', 'E', 'F'
+ F$ |" g0 O' `0 O  i. y/ o    }; 7 p8 c7 h: q, n) t
    return HEX[x];
  ^' d- }5 _4 x8 w* G7 q+ k}
) `& b1 X& K/ ?" a * `. @0 f, C% K8 c/ Y! K
int hexCharToInt(char hex) {
9 W+ \, W' P$ v, t( H    hex = toupper(hex); / }' |) m9 R$ K* Q& d1 ^$ ~: J- i
    if (isdigit(hex))
) h# F1 i& [, e1 ^% `3 @        return (hex - '0');
. k& V. K6 L* k6 h+ P    if (isalpha(hex))   K! I# A; W: m( k" Z! D- [
        return (hex - 'A' + 10);
8 [/ }0 f3 ]' H: i1 u    return 0; 8 M3 S: y* }. t1 W
} - C6 j+ v1 I, a& y# m

3 Q  T0 I' v( `$ s% [. P. H  vstring bytesToHexString(const byte *in, size_t size) {
) w9 J. O9 ?8 A/ y5 Y    string str; " ?( x% j, k: C8 E, u4 w. j7 F
    for (size_t i = 0; i < size; ++i) { ; ?; z( o1 M6 R4 a& J" x5 D
        int t = in[i]; . N$ E9 K( y+ j% I# c0 ]
        int a = t / 16; * P: i; _! J4 N% c; s! ^
        int b = t % 16; ; d% y9 Z+ u7 v( j) b
        str.append(1, intToHexChar(a));
% S" V7 u  _1 S. i+ w        str.append(1, intToHexChar(b));
) B6 E8 g9 h) B- _: H        if (i != size - 1)
3 t5 w; `6 y1 m/ j9 J            str.append(1, ' ');
# D3 V1 m7 g/ A2 Q0 K. x    }
1 t) H  h8 b- G$ ~3 C: E% R8 j    return str; % k" s/ ^% S$ N% o8 S' o
}
5 ?- P: \7 W% z0 {) V: ?! ^+ {8 s
" n* j2 Z+ \* k8 bsize_t hexStringToBytes(const string &str, byte *out) {
, C: Q8 f5 @& e& V; N5 F
% U: l1 k4 d) [! ~, _" t    vector<string> vec; % s# \: k7 Q% i" y
    string::size_type currPos = 0, prevPos = 0;
1 B; {+ y8 |# f/ E    while ((currPos = str.find(' ', prevPos)) != string::npos) { # c- p  c3 M' p  R; y1 X- f
        string b(str.substr(prevPos, currPos - prevPos));
, i$ S8 ~/ {1 ~$ N; s" t        vec.push_back(b);
; G. Z: [  n! y; D& i        prevPos = currPos + 1;
4 }2 L- c# a# X# f3 P" s! D. x- L8 l1 O    }
! ]0 R) R7 `3 r8 U# h    if (prevPos < str.size()) { 7 N6 o/ j9 b4 g
        string b(str.substr(prevPos));
6 K$ C) y& O7 L: f3 n  ?# q        vec.push_back(b);   D9 g* V8 ~) W. G' ?8 O
    } ( R  S' {& t$ L9 {( x: X* P
    typedef vector<string>::size_type sz_type;
+ K" Z8 |: y+ R! q7 Z$ H    sz_type size = vec.size();
2 }& e2 p3 l, A    for (sz_type i = 0; i < size; ++i) { ' W! }8 X3 }$ @1 z7 ^1 X- d
        int a = hexCharToInt(vec[i][0]);
$ h. W1 f6 j. V: M! R        int b = hexCharToInt(vec[i][1]);
) {0 n  V. c1 O) A* g5 g! W* c! V        out[i] = a * 16 + b; ! E) v& B! m+ W) p# W' `# e
    }
7 \: X6 J! g" ^6 o* X    return size;
6 y+ U& a( V1 z- t9 F}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
; O7 _8 R6 K2 s# l#define TEA_H
4 B3 y+ q, j5 _3 |* j 7 @' U. d& x; S$ c' Z
/* % q5 }" K9 T1 C3 O8 [
*for htonl,htonl , F+ A. S; t5 f) w5 r8 J. v' G6 Y
*do remember link "ws2_32.lib"
# m* `8 I1 |" J2 w*/ 0 O  ^) J* o+ H% B
#include <winsock2.h>
7 m& @1 {" L; Y4 B+ }: `: Q( M# c5 D#include "util.h" ! k/ |: G: C9 d

3 ]5 e; z/ W/ \+ [; iclass TEA {
- {" I5 p$ d; a' j9 z2 Hpublic:
& s- z- L% \. ~, F    TEA(const byte *key, int round = 32, bool isNetByte = false);
! O. ~, r& @* Q, ~& [    TEA(const TEA &rhs); / F2 D8 C- I1 L# t
    TEA& operator=(const TEA &rhs);
3 i# `" d( H- m- w: o- ?4 ~    void encrypt(const byte *in, byte *out);
- \0 H  o5 U1 ?3 Q# C" C    void decrypt(const byte *in, byte *out);
$ w8 x; X1 y2 _1 J! m5 {4 |0 v# [9 hprivate: & j# h$ R$ q; P' \+ \* a
    void encrypt(const ulong *in, ulong *out); - ~2 N/ A  G, s
    void decrypt(const ulong *in, ulong *out); : @* @! [* P5 Q0 Z' F1 m
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
  C# B9 h7 I) Q3 U% o1 W% M    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }   T6 x- J) O+ \1 }2 H/ l$ ?0 o
private: , M' P6 V$ Y% U0 |1 A& g
    int _round; //iteration round to encrypt or decrypt . K8 y" b1 ^# x! m% P0 }
    bool _isNetByte; //whether input bytes come from network # Q- a5 R/ A, {. g* D( R
    byte _key[16]; //encrypt or decrypt key
; `7 \0 O# i5 m3 ]* P}; ) O  S/ M% C" w' ~/ H

; q9 @" ^5 q3 {  X#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" + L1 Y1 z  Z0 E  `$ i, Z3 \
2 #include <cstring> //for memcpy,memset
* }$ E6 J0 ?; m- u 3  4 [+ V, ^$ C" z4 E  s
4 using namespace std; 5 X& W$ r* t9 ]) @7 i7 u/ m6 a" I
5  
/ Z- z" N" j/ n7 r+ U2 j 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ! g% T/ a5 l& B- O" o1 Q! W
7 :_round(round)
1 C6 S* Y. `1 ` 8 ,_isNetByte(isNetByte) {
6 T7 e3 v' |' y' K2 a4 J5 J; W 9     if (key != 0)
' m% B* L8 R* h10         memcpy(_key, key, 16); ) e' r# l7 ?/ E, \& R
11     else 1 q# T% \. p4 m. ~
12         memset(_key, 0, 16);
" w% j8 X5 e1 c/ O  e8 a" x0 J13 }
' r0 g7 Q9 F7 H+ s" h- \5 e3 E14  
) }- |2 M3 x4 q) j15 TEA::TEA(const TEA &rhs)
6 [% _4 I  j7 a( A7 \! T0 Y- {16 :_round(rhs._round) ( l! r7 z% ?2 v* {5 |+ r# F. l
17 ,_isNetByte(rhs._isNetByte) {
8 g, J' K9 \; `3 V( n5 _( L) R" z18     memcpy(_key, rhs._key, 16);
' o: O% P/ u0 J7 `$ x19 } 9 y" M1 Y+ C  N$ Y$ A  b) [- A
20  - n# S, a& k: x3 [+ A
21 TEA& TEA::operator=(const TEA &rhs) { 5 B' C1 S0 V6 b5 N, ^- h  H
22     if (&rhs != this) {
5 `9 a# O- e; ?23         _round = rhs._round; ( I2 N3 {3 y% r  b& ]
24         _isNetByte = rhs._isNetByte; / f& X7 _& {9 {! T% s! o2 V0 Z- d
25         memcpy(_key, rhs._key, 16);
- T8 }7 T3 [9 X' T26     } . K' f0 `! f% D$ L4 b2 x6 \
27     return *this;
( {0 ~4 j3 P& m+ O1 O28 } / P9 J" Q& C. ~2 d
29  
' j( Z7 e/ d. O, `/ I( _% e30 void TEA::encrypt(const byte *in, byte *out) { / v4 H# @4 A: k- [' s2 `. q% `
31     encrypt((const ulong*)in, (ulong*)out);
4 O1 G( B* V! s5 T2 ?9 [32 } * G0 q' Q- f+ V4 h* ]4 U
33  ; X& `* ^( [" L% ~4 c3 L
34 void TEA::decrypt(const byte *in, byte *out) {
; X' i% Q- ^' z+ ^. y# d35     decrypt((const ulong*)in, (ulong*)out);
5 S! s$ X1 q1 e) d2 u# k( s36 } ) P4 B$ ]! o; z9 S0 V+ K) M
37  
1 f  n" {5 T" p3 }6 K5 ]38 void TEA::encrypt(const ulong *in, ulong *out) {
# `5 M1 k, m8 Y' f39  4 p9 k$ l/ V! i
40     ulong *k = (ulong*)_key;
1 i' F: Q8 h: f% N, i  m0 a1 J41     register ulong y = ntoh(in[0]); & O9 c& r- M* _7 Y6 f5 ~
42     register ulong z = ntoh(in[1]); : z% l; _( ]% w1 M7 Z  n' _3 `; G1 R/ p
43     register ulong a = ntoh(k[0]); " m9 c! J* w7 X$ P, l
44     register ulong b = ntoh(k[1]);
6 s: A  l: j7 u45     register ulong c = ntoh(k[2]);
) X2 E: O/ w% n6 N46     register ulong d = ntoh(k[3]);
  g3 r! F! m8 ^47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 0 x1 n0 T+ T9 ~- i8 z1 ~7 ]5 H. `0 J
48     register int round = _round;
" O! n9 K) Q3 C- d. S9 I49     register ulong sum = 0;
) ~( }, z; @# ^4 l50  ' h% S0 ?1 V2 C, D6 @  s# L2 z
51     while (round--) {    /* basic cycle start */
6 ~2 T, R9 u5 r52         sum += delta;
3 n0 w2 E( \9 O9 K53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ; p( X/ O( p) ^- C
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ) P+ d. v2 W1 x0 ]
55     }    /* end cycle */
1 U+ M2 |, W( g- ]56     out[0] = ntoh(y);
) e5 \* G( N5 m4 P57     out[1] = ntoh(z); $ A& Y9 p/ ?8 z8 n  {: V8 {
58 }
& b; z$ T3 H3 k% b# J- Z% l: {59  , ]! C$ k# H; u/ e
60 void TEA::decrypt(const ulong *in, ulong *out) { 1 h( ^9 |) H" r; ]
61  4 O- @7 X" t! `4 [
62     ulong *k = (ulong*)_key;
& y+ j- j  ^# q0 E0 L63     register ulong y = ntoh(in[0]); & E) y4 b0 }* _. V" B, c5 ?  n
64     register ulong z = ntoh(in[1]); : p9 y! l" t* o' c
65     register ulong a = ntoh(k[0]); 7 |8 q9 T5 t  j3 A
66     register ulong b = ntoh(k[1]);
$ e1 ~" c2 K. `9 D. v7 T67     register ulong c = ntoh(k[2]); 5 p8 F' o: i* R  L0 [% m
68     register ulong d = ntoh(k[3]); ! V, \7 q8 {" }7 M0 i, ~
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ $ P1 A( A7 J( y. F
70     register int round = _round; & O+ y# s" t4 A# Y7 K& R
71     register ulong sum = 0; $ F' }1 Y+ ~! d6 [" k  c' K4 z
72  # ]* {7 r/ e' S3 X
73     if (round == 32) 0 ^* t5 W9 k, I! K9 b! {- @
74         sum = 0xC6EF3720; /* delta << 5*/
& Q! j0 M. E( f3 L" |75     else if (round == 16)
& I; |, o# l* O8 X/ }76         sum = 0xE3779B90; /* delta << 4*/ 9 _( T3 g/ i  V: m9 P
77     else 0 {# D6 s* W+ x4 ~* @
78         sum = delta << static_cast<int>(logbase(2, round)); 7 p5 I1 P( {/ G0 r: Y4 g, |
79  
! V4 R4 m* i1 I80     while (round--) {    /* basic cycle start */
! _- b7 [% T3 ~+ ]* a- Q81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ! z% p; J1 |  N4 j- P$ ]) k
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
4 p/ U5 y* Y9 L. h83         sum -= delta;
' g, Z& g: m! k9 r84     }    /* end cycle */ * k: P# U! E% W) g7 n+ z
85     out[0] = ntoh(y); 4 `. X) [( M# S+ v) g
86     out[1] = ntoh(z);
0 O% ]) d1 ]; {7 o) s( p! R! X87 }
) h) {, W# c7 H( \2 ^& \2 F0 ]* \' X1 c
需要说明的是TEA的构造函数: # Y/ T9 X; e! I" p. z5 Z
TEA(const byte *key, int round = 32, bool isNetByte = false);
! l! e: d' Q6 ]* {8 C7 Q1.key - 加密或解密用的128-bit(16byte)密钥。   l. m6 S5 |7 f- O
2.round - 加密或解密的轮数,常用的有64,32,16。
# T& j. u7 ^. d- n3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 5 ]6 v( j6 o9 t
7 ]4 R. i- u2 r8 |* Y3 S) T
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
2 z* n" _* \: _8 Z1 k" _- H% g 2 #include "util.h" $ t5 @/ q' r" z. d% m/ B4 K  G
3 #include <iostream> 0 c/ q  T: ]' J5 u$ }1 t
4  
1 ^7 K. D% |5 R+ Y4 \ 5 using namespace std;
7 _8 z: G; q5 I2 E) p 6  : _5 q- e! ?8 a# E. Y
7 int main() {
2 ?" [; N% Z! H4 V5 M 8  
4 `1 v! R1 j: O8 i' r 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); ! t9 r4 K; L% A1 w
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ( H) H8 f. z+ Q: q2 U& a- y
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; ; l% H0 N, L3 R3 D1 N$ A
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 1 ~, b' r* P& L9 i( F5 N  W
13    x' U/ s( L  x  s0 S$ O% v
14     size_t size_in = hexStringToBytes(plainStr, plain); 3 W% K! V' X# j8 g6 A, y
15     size_t size_key = hexStringToBytes(keyStr, key);   m3 `4 ~) V0 f; b0 G
16  
, Z& N, ^# U; @- o17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
6 F# y3 I6 K$ E. E+ w% S18         return -1; , c! X# ~2 P8 k9 R0 d2 K. O# h7 {
19  
2 m2 }. r4 F) T" [0 t20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
: F4 N1 C. E; |+ ?21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 5 t( S- `% b0 x# ]# J8 q
22  
# a& k7 @# E7 c+ Y" F* `6 w7 n$ ?23     TEA tea(key, 16, true); 0 i. D; c0 ~4 t( V. i
24     tea.encrypt(plain, crypt); 7 _# D# c- {5 O5 k( T. i
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 3 x2 H# z. n! X5 G7 G1 Z; D
26  & U1 V% @  a4 C
27     tea.decrypt(crypt, plain);
& D0 o( z( d2 P/ |& G28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ) K# A# k& V6 w
29     return 0;
  U* z; w0 ]; ?. H* L, Y" ?30 }
+ \$ w) |) I0 ]3 R' H- v  A% t1 I% p* i
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx/ L" z; ^# _( _  h/ y
运行结果: 1 a* B- |) \# M  W5 f6 X
Plain: AD DE E2 DB B3 E2 DB B3 1 b" p+ {: {  s* |9 v! d+ q
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
' d: p9 T" t/ p& P* bCrypt: 3B 3B 4D 8C 24 3A FD F2 ; o$ L& F" I" y  H5 q! m
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-7 07:52 , Processed in 0.024625 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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