找回密码
 注册
搜索
查看: 37375|回复: 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轮):
# ]" |3 t0 O/ B: R/ j) o8 T微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 + `# {9 _3 C7 Y$ @8 S9 j
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 1 J$ i3 j9 F+ C6 m" i8 g
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 9 ?, F4 v& E- v: V. K3 W$ L
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
! M6 E/ i: |: H" p- L$ M在 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. 2 J) B% O" L6 P" n* A
  2. void encrypt(unsigned long *v, unsigned long *k) { + }! _4 H* G+ X' E' Y' y2 Y  ?3 q3 ?
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 4 f, `' |6 _9 r: B+ O5 b0 b9 T, U& q
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ , Z) w& l6 u: k
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ / v6 |. _8 D6 z. a( j3 c; U' h
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    7 b8 w. A) E2 z$ P. ~$ z( U0 |
  7.          sum += delta;
    ; H# v% C8 G5 ^" {! c
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); " |+ G8 V: s5 G- z" x# o
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ' k+ D9 H! _: U! t: P1 O$ m- C( H
  10.      }
    3 W+ m, y- R( Z5 u( L! I
  11.      v[0]=y;
    % [4 n3 E/ y  |- v0 w' @1 D
  12.      v[1]=z; + @& z; i: G$ L. D
  13. } 4 X. E7 n7 R3 z* m9 M9 p
  14.   
    0 P) M9 I% h, C+ G' H8 A  j. Z
  15. void decrypt(unsigned long *v, unsigned long *k) { : O0 g+ l) V1 m! W
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ / p8 K$ @! d; A$ c6 u$ E( ~2 N* {
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    . Z1 _( ]9 J' p& Y1 U! P8 o
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    3 g# ^7 M; Y# s5 B9 r
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 3 g0 Z" ^( C* S& m0 }
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); # `  d5 H2 H0 U- j5 H" m
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
      k) V* J9 d/ l& p1 F
  22.          sum -= delta;                                /* end cycle */
    , L- X! U: f8 t8 q
  23.      } 4 s/ H# ?2 b; D" j
  24.      v[0]=y;
    % P( T# k1 W3 H8 l6 \
  25.      v[1]=z; ; S$ ~, S6 f/ b7 U, T
  26. }* G4 w* n$ P/ h/ t5 V3 m
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H - k; G3 f3 B6 L4 T
#define UTIL_H
0 }2 o, o4 s. r+ g" o
2 c* n4 O6 @. x3 ?#include <string>
. S7 h8 B, J$ \) \9 Q9 h#include <cmath> ! ^( E) Y0 p/ j7 K
#include <cstdlib>
) ]; L0 q" W# ]: c ( j" W! ~$ [% m& I# x! T
typedef unsigned char byte;
% I" Q/ n9 A* {7 Ptypedef unsigned long ulong; : t* S, V. ?* ^( m* m! J% c

0 u# C1 d5 H6 }" B, `inline double logbase(double base, double x) { ) x8 a: d7 q) h* t; T$ S5 R
    return log(x)/log(base);
. u  Z# F5 A) h& h: i) d, [  E}
- R, q" ^/ D8 y) b1 z 3 C3 n3 z+ J: b4 y
/*
3 e; ~* A& D6 D2 L. N0 a*convert int to hex char. ) n/ g. z; f4 z+ E! H( J  ?; G  |
*example:10 -> 'A',15 -> 'F'
/ a( Y3 i0 b) M4 V$ W*/ 3 H: F9 V$ h  J( {9 |% w
char intToHexChar(int x);
" K  E( Q1 m' W0 ?  F, v& j
5 G1 G3 {  r2 k8 U/* 6 o9 S: U8 Z- O3 a* X
*convert hex char to int. 8 V, \* M+ l% l4 N2 f3 a9 }  f
*example:'A' -> 10,'F' -> 15 ; s8 _- {8 K; I  _' O
*/ $ O* [" W: D* w
int hexCharToInt(char hex);
' U+ J8 v( Y3 P' l5 S
) z+ I( Z, [! x/ m% D& M8 Lusing std::string;
# E+ a# w. v" Z- m/* ' h2 G, z5 G" P9 W
*convert a byte array to hex string. 5 K2 [* |' q! H2 b
*hex string format example:"AF B0 80 7D" 1 D+ x' R9 o+ C/ n* m
*/
5 r1 y# C! t3 k+ vstring bytesToHexString(const byte *in, size_t size);
$ ?- q- i) d8 h  z & P' Y! i7 D1 ^) T, W, v5 s
/* % ]) }$ h: @$ O+ G3 m5 _5 |
*convert a hex string to a byte array.
( e; ]- _7 H& Z9 T" `) i) v*hex string format example:"AF B0 80 7D" 3 z. Y( _! x( j$ y; M* T
*/ + q( F: d  V, ~0 \
size_t hexStringToBytes(const string &str, byte *out);
5 y6 t0 v. l+ K# G. L: c4 n2 F& v9 A , R- m7 `4 ^! W1 R8 A4 u
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
  |) I: I6 J' i) o2 p#include <vector>
2 f/ H  g, x' E: H3 Z 6 J, D% C  f' j
using namespace std;
6 l- y5 n. ^& R5 D1 _7 o
3 ]' T+ W9 g" fchar intToHexChar(int x) { ! y# N: q+ @% S6 k; |8 X; S
    static const char HEX[16] = {
, X2 i5 J/ f& Z% Q, p. q        '0', '1', '2', '3',
: L3 l: G1 [  J) Q% H! o. a        '4', '5', '6', '7', 7 z' w+ \5 k4 F! ~. D5 w$ ]
        '8', '9', 'A', 'B',
3 K  u# z& v. A! V( f6 l; L        'C', 'D', 'E', 'F' / e, E. i* }" a' W4 o
    }; & @, `+ L, i/ R1 ^3 o0 ], ^
    return HEX[x];
! G  w  f! w& `. L}
* h* E( J# A+ L: i' R . _$ S' U& f9 j2 J  W5 A/ E
int hexCharToInt(char hex) {
0 {7 f& ~" X" }5 |% B; g) N    hex = toupper(hex);
! Z7 R7 `1 P) H1 Y    if (isdigit(hex))
$ J$ M+ a0 s" L7 Q, t, N& |- d        return (hex - '0');
. u  b; B7 C  B, |9 @    if (isalpha(hex)) ; F; f- _0 Z& W: D1 y7 {! {  ^
        return (hex - 'A' + 10); * m( ^2 Z$ ^. x: I: P4 G9 Y0 ^
    return 0; 5 n; T9 J9 O# |* q$ p: F
} 2 g+ H9 u4 P5 G  R
  b" ^& ~4 O# t1 c2 j2 L5 O7 V; b
string bytesToHexString(const byte *in, size_t size) {
8 Q; R+ ]% S  i/ m# W    string str; 6 P2 Y$ t& i4 P0 K
    for (size_t i = 0; i < size; ++i) {
* j" {& X2 f7 k+ v9 S. \- t        int t = in[i];
4 V9 J: _+ H% Y  J/ N% }        int a = t / 16; ; C1 m" C- f! z, }  \
        int b = t % 16; ' [: G! j" N" G9 v  c) _
        str.append(1, intToHexChar(a));
6 L# H6 v. a3 @. d+ p* Z0 }        str.append(1, intToHexChar(b));
- s" x7 U( J: I3 |; @2 f. v6 |        if (i != size - 1)
+ \4 f3 w& C4 m( }' o) D- U5 i            str.append(1, ' ');
9 V& K! K( M! B1 B    }
" H* e, e; |: Q( L+ f  r/ [0 d    return str; : Q1 D; U/ O" N+ f$ ^6 d7 ?* z
}
7 X6 Y$ t, ]6 P3 ~ + G" a7 N- h- P5 X/ X2 C% m  G
size_t hexStringToBytes(const string &str, byte *out) { ; N( ?' _# s$ {7 C2 f

% W5 c, V" R& J8 u5 r; N! B  \    vector<string> vec; ! s& X6 ^# G- n
    string::size_type currPos = 0, prevPos = 0; ! }9 b- h) l: J. I" H0 ?" Q% d
    while ((currPos = str.find(' ', prevPos)) != string::npos) {
1 C5 c- _  U% Q' E: D, d2 g$ _- X        string b(str.substr(prevPos, currPos - prevPos)); , v9 c' c% g- v* `; H3 J6 r4 \
        vec.push_back(b); : I- }$ H! |: L% K. Y+ M
        prevPos = currPos + 1;
% L% L$ H; Q* k" R4 }7 c# M9 Z    }
+ P9 [# \8 L- R/ p* L, [    if (prevPos < str.size()) { ' `* a+ P6 G& U1 Q4 J
        string b(str.substr(prevPos)); # [6 p" `  u5 [; _5 b6 h: s
        vec.push_back(b); * g9 }1 ]7 ~6 d% \) g; g2 \
    } 5 _$ n. P) w: A3 p9 e% A: y
    typedef vector<string>::size_type sz_type;   D$ Z5 _% g+ y# n% c
    sz_type size = vec.size(); 6 ^5 x, H+ G0 g9 }$ P/ i0 @7 X
    for (sz_type i = 0; i < size; ++i) {
" @% K, `) W2 h8 ]" w        int a = hexCharToInt(vec[i][0]);
' O3 M, {. Y' `6 Y        int b = hexCharToInt(vec[i][1]); - s; @% V3 v7 g1 V- O
        out[i] = a * 16 + b;
$ I4 a1 t* H2 S  }9 G    } * }" ~  b) _2 j0 t4 t  {  [9 M$ r
    return size; 7 r' d% Z8 h# z, \) Q
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
; Y- ~% A( \( g#define TEA_H 2 ^$ J  K# m1 u% ~2 A
6 P4 C9 I% X4 t: {# B
/*
4 ?/ l# w) ]0 w2 T+ U$ [7 j. g*for htonl,htonl
2 ]1 {9 r) _& F& X*do remember link "ws2_32.lib" 9 [' f3 T7 M4 N7 r0 u5 W
*/
8 c8 L3 j7 W2 c#include <winsock2.h> 6 q3 N  D( V: b4 z; C
#include "util.h"
8 U6 `5 f% b0 k( c0 o6 K
- y" B- v- w( W7 eclass TEA { : K  I* B5 C' a( _
public:
0 G( J9 U7 Q2 j    TEA(const byte *key, int round = 32, bool isNetByte = false); + s' }+ f6 j! O: [
    TEA(const TEA &rhs);
9 S4 l* @, z/ F- J    TEA& operator=(const TEA &rhs);
( U5 c5 u3 X6 z( Q  b8 \8 d% q    void encrypt(const byte *in, byte *out); * B  ?  ~$ J! b  N$ d% E$ n
    void decrypt(const byte *in, byte *out); # y. k- z  o- K
private:
9 n1 g3 x* W- E8 x4 l+ T7 |    void encrypt(const ulong *in, ulong *out);
- N0 X5 y0 i* n; c! s    void decrypt(const ulong *in, ulong *out); : l5 T/ T& V( M; y4 @. C2 J
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } * x' b- P& r; z
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
! |7 m  c5 }3 C1 B2 D4 j* {) l+ aprivate:
% i6 ?7 M; \7 t6 o( V7 Q/ G    int _round; //iteration round to encrypt or decrypt
9 c5 h* ~2 e5 {5 \    bool _isNetByte; //whether input bytes come from network
" u' z, z; i5 d5 e) I) Y! K    byte _key[16]; //encrypt or decrypt key
- T5 U7 Y3 @$ X};
5 Q; U  T5 w8 F  A# b1 l
9 d. ~$ e. p" W( n/ i#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 9 [: o8 x& K3 f: ~2 ]
2 #include <cstring> //for memcpy,memset
/ e7 |: r6 j% h" M) W 3  " H# y6 w& G+ ]
4 using namespace std;
2 \% Q& W( N" r 5  # c& s6 A  W/ p5 Z$ @
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ' u, o" p" X- u  k$ q/ A4 j9 H, d
7 :_round(round)
2 J( b3 W; \- v! {5 v: ~2 c7 X 8 ,_isNetByte(isNetByte) { 6 m: H" p! @0 }$ z/ F% {( f
9     if (key != 0)
% ~9 C( V: [! J, y* Y* |10         memcpy(_key, key, 16); - h! Z/ I* Q& _1 S8 r, c1 }" H
11     else
0 z) [2 L$ M: L4 B" q5 A12         memset(_key, 0, 16); - `9 V4 m4 K2 u" Q0 [, x  }1 o
13 }
- @0 V2 l4 Z2 K14  
, D2 i! u( u1 x/ D6 U1 J4 _+ E15 TEA::TEA(const TEA &rhs)
- Z1 P* P+ g; r9 A) Q7 J# o16 :_round(rhs._round)
/ Q& c) s% E' F9 t17 ,_isNetByte(rhs._isNetByte) { 9 m8 T+ n3 T6 i3 N- z
18     memcpy(_key, rhs._key, 16); % w7 `+ y* R# ]2 l2 Y/ z
19 } : }; E& c* ^4 l; E
20  
  e7 P: ]$ X1 N# c21 TEA& TEA::operator=(const TEA &rhs) { - d1 \% K9 H, C, _
22     if (&rhs != this) { . ?; B) W; g. I3 {3 I1 s
23         _round = rhs._round;
' R/ x8 D$ Y" ~+ ^& }24         _isNetByte = rhs._isNetByte;
# Q$ Z+ Y' j$ x! l  l6 x25         memcpy(_key, rhs._key, 16); $ Q3 y+ S4 p; `" V
26     }
3 ?5 ]2 j1 t: k1 g2 v, Q' Q27     return *this; . Y7 o- F- P6 ^( D' z; c
28 }
$ U* ]5 e, F# s- }6 z6 y29  
$ ^8 n7 G0 l7 l1 X) X+ \30 void TEA::encrypt(const byte *in, byte *out) { ) Q; e) W) }1 k5 ^$ y) D! c+ `) q$ g
31     encrypt((const ulong*)in, (ulong*)out); % G! K% U( F6 @1 n
32 } % E% m( s' ~7 _+ S% [" }/ }
33  ; L9 N$ u9 z! c0 S
34 void TEA::decrypt(const byte *in, byte *out) { : m, X/ p, z2 Z4 d
35     decrypt((const ulong*)in, (ulong*)out);
* Z" r. w( w. ~* [/ a' n36 } 4 k, |- ~+ a9 c% V
37  
' L) `: |% F5 F; o9 \) E5 o38 void TEA::encrypt(const ulong *in, ulong *out) { ) F4 K% `, d+ N+ D* M0 Z9 X, t
39  0 y0 _" {; B: X7 R  O
40     ulong *k = (ulong*)_key; ( D  [  |+ j3 |2 A0 V* ?2 l
41     register ulong y = ntoh(in[0]); . \2 z' s+ R5 i' t3 J
42     register ulong z = ntoh(in[1]);
) H* r" K( e7 E* k43     register ulong a = ntoh(k[0]);
2 @- \  f. ^4 Q9 ?! z5 W4 W44     register ulong b = ntoh(k[1]); * I7 x; w8 ]* j' u4 `& N# Q, E! m
45     register ulong c = ntoh(k[2]);
% B* U# D( O6 R) S2 k/ s9 c46     register ulong d = ntoh(k[3]); ; s( Q5 A* Y$ |* v3 ]3 A+ D5 i
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
5 X' n8 q/ w6 W% Q48     register int round = _round;
; _3 A4 U! n% L) Q( q" ~49     register ulong sum = 0;
! M! d" |3 R6 ^' _& S+ J# d50    {& T/ u1 s2 s% [% F
51     while (round--) {    /* basic cycle start */ 7 G% X' J* H& e- M# r, R
52         sum += delta; & x! z' S9 A9 P( ]' p
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);   c1 P( q% C8 m7 n- j
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
5 t: E. C3 O/ d: r55     }    /* end cycle */
3 B/ t+ }  k! r56     out[0] = ntoh(y); . s8 o8 {7 Q, N2 [( Z
57     out[1] = ntoh(z);
! Q. `7 Q$ Y& W$ J1 u58 }
/ F+ j, m" A  R: }+ ^$ H59  
8 h2 T% U4 E' @3 t9 w' L- H5 Q60 void TEA::decrypt(const ulong *in, ulong *out) { ' x/ {6 C5 e" J! U" Z
61  " J- V6 w) Z* H% |, \2 O
62     ulong *k = (ulong*)_key;
; _9 o8 z2 S$ f63     register ulong y = ntoh(in[0]); % g; p! A% ^; o( X! c" J8 Y5 t
64     register ulong z = ntoh(in[1]);
  Q# x# i  b$ D' k65     register ulong a = ntoh(k[0]); % A6 [1 R, ^, S- w. p% G
66     register ulong b = ntoh(k[1]);
( s* ~( \+ v. H  W  c67     register ulong c = ntoh(k[2]);
3 v! U/ i. g3 u" L- t68     register ulong d = ntoh(k[3]);
7 P/ g! K$ J" J( c2 P69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 2 }3 d  U. a0 A( t+ Q" v' `
70     register int round = _round; ! }9 P4 \" g& `9 k# W( e
71     register ulong sum = 0;
6 q- Q2 u) I6 S9 Q72  
$ A; H$ L* m3 I% ]4 `& F- A73     if (round == 32)
. W: i7 Q# c& L% M, R74         sum = 0xC6EF3720; /* delta << 5*/ ' s* p$ A/ \* y: A
75     else if (round == 16) 8 V" h2 y$ P' d; C) z; Z
76         sum = 0xE3779B90; /* delta << 4*/
4 ]+ }1 s; z  K2 f( R  Z77     else
4 j5 W4 R+ F+ \78         sum = delta << static_cast<int>(logbase(2, round)); * ?, g" [3 I; i1 U
79  
0 d& T+ u7 G3 u0 Z6 r80     while (round--) {    /* basic cycle start */
" f+ R/ w; K$ y2 q% t3 I81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
/ }  h$ \% z/ z( @4 F5 w  h: o% |5 P82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); / C9 K9 E5 w9 n, ^
83         sum -= delta; " d6 d- ^. D1 o" }/ t% R6 F* I
84     }    /* end cycle */ 6 Z# C% C' r4 W* a
85     out[0] = ntoh(y);
# u4 d- @& r; _# Q* t% x) S/ P86     out[1] = ntoh(z);
* r; w& C3 p6 w: A7 p1 r8 Y87 }
% w" z( f) x, H0 S
% g4 C( W' m9 ~2 o, l; `需要说明的是TEA的构造函数: 2 z6 y6 A) ~9 _" [5 r& ?
TEA(const byte *key, int round = 32, bool isNetByte = false); 9 ?; R6 H/ H1 y% Q& L/ `- Q
1.key - 加密或解密用的128-bit(16byte)密钥。
+ ]9 \1 e" Z! ?+ G- P- E4 a2.round - 加密或解密的轮数,常用的有64,32,16。
0 t7 u9 S1 ?! O9 r  n; M1 B3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
+ k. q, `# A" H) O6 q7 d, d3 x) S/ a1 `4 X" f' {' ?
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" + [) Y+ G- ]' }, V0 X. g& y9 u7 N
2 #include "util.h" % x/ a) F9 Y; C. y, {" g, B
3 #include <iostream>
* s0 v+ Q, t9 f) C& W* r1 A# z 4  + x: g( {- Q6 ~
5 using namespace std; 5 w. D5 e! t0 j# J( G$ i5 }
6  
2 L9 y# T" O& m) f+ Y8 J6 Y# _1 H& L 7 int main() {
* _$ @0 C* T. ?3 W, l 8  
4 S# _6 b  ]. r$ p 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");   y+ _: w& d9 D: c
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
" ?8 [0 I- F! E5 g9 h; C11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
& s) J& `% u2 N0 C. E; z12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
7 N+ ]% H- d/ ~& \13  
/ c# ^  w9 @) o5 @14     size_t size_in = hexStringToBytes(plainStr, plain); " g8 \0 [% |4 l' {; a4 ~6 _$ z
15     size_t size_key = hexStringToBytes(keyStr, key);
; @1 r6 ^0 l/ N! [16  
; V1 q7 F$ H+ ?17     if (size_in != SIZE_IN || size_key != SIZE_KEY) / u3 C8 o: y' S+ P# ]% c
18         return -1;
$ J6 M$ l& a) K. l& a) r1 C% {19  
2 @% {. s/ R! u20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; * D" a+ V( c. E/ U
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 0 g, L1 T. R% E4 e: N. G
22  
' y, M  {, u" k6 ?1 w23     TEA tea(key, 16, true); * {% i! L5 t! z6 ]  @2 k
24     tea.encrypt(plain, crypt); ) `* Q" R1 E- ^2 Q5 B
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ( _6 R. l0 z, l) V( r+ X
26  
& V1 S$ B8 W/ b7 h+ o27     tea.decrypt(crypt, plain);
) _2 T- S+ C+ X* z$ R  N28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 2 F; n; O  i, \$ W- n4 A4 n
29     return 0; 2 E. I( n# b. ?, u3 ?$ P
30 }- L/ e( Y8 W0 l! i9 o# r, u
) V" l* U1 C, f. b" ^. b
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx: r+ ~7 r# _/ i" a0 B( I( v
运行结果:
6 j" `' U, V- f5 |6 ^" l9 qPlain: AD DE E2 DB B3 E2 DB B3 ! Q8 r$ q3 z! C+ {4 x& f  r
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
% b' }. e& X: eCrypt: 3B 3B 4D 8C 24 3A FD F2
) w, C! r* t7 }# E1 M* NPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 18:51 , Processed in 0.021863 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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