找回密码
 注册
搜索
查看: 37618|回复: 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轮):
: ?/ s& {6 _4 C5 g( w微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
" h; Y/ R2 U  j( o7 ~( oTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
; T; e1 h; ?- ]1 ?8 O之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 * s3 N6 S& h1 d
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 , K4 Y  Q% c& m. }) ?1 g
在 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. % h5 m7 c1 m3 W  e& H# f/ ^
  2. void encrypt(unsigned long *v, unsigned long *k) {
    % S$ x4 y' Z2 A" a  h
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    3 r* \1 ~- c3 n6 i8 _& `
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ , |5 D. d  U7 Q4 g) b
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    $ p# H* m+ @( y2 x4 X: P
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    0 ^' x* ~/ X" K- S) m
  7.          sum += delta;
    , B7 o0 E$ q! J6 l
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); # U, F) R2 ~, |2 X! A8 R' P! P
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    . t4 v& _) L4 c( T3 X  g
  10.      }   K$ S9 d6 x0 n  ?6 {/ p
  11.      v[0]=y; 4 }$ a8 U  m1 M& L2 f) j6 j- L
  12.      v[1]=z; 8 _7 U/ R& b+ V% N* A
  13. }
    7 X! K6 R8 k8 U) r2 j$ `. r4 d
  14.   
    7 I6 y7 _" ^% A3 ?; P# L0 _- _( Q
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ! R) k, P7 r5 x# ?0 f4 q
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ . @) u, Z6 u0 |* a/ K" `- Z& q: {2 L
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ( D& b2 z" y9 E$ L) y
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 0 S, U+ k: r3 W0 p
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ ' J6 m/ i5 {6 B2 F1 O+ }
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    * j/ {, [1 ^0 V' W# [
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ) H: C' G  L) l' P) k) i
  22.          sum -= delta;                                /* end cycle */
    2 T6 O& }, h0 V. `) H
  23.      } $ R$ q% h$ X2 f& K2 R' ]2 K. f
  24.      v[0]=y; / A& U% F2 h( q
  25.      v[1]=z; * j! s3 Q) ^! @) |3 B4 B
  26. }
    ; W$ m- ?7 v9 O, `6 B. j: h
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
3 X* }' m. ~6 t( q/ I9 p& j#define UTIL_H , X7 I( |1 h4 G: e( a
' F- k9 N6 o) ~% C
#include <string> , i  U0 a* Y1 x$ a% @3 s
#include <cmath>
3 c$ s# y9 M. |#include <cstdlib>
( x8 _6 J+ w$ h4 ?# @; _
( L" y9 P" `+ K9 [0 R' a9 W* atypedef unsigned char byte;
0 D& A  ], `! c" s# k+ ]typedef unsigned long ulong;
+ q8 D- t3 k" R / W+ [5 k5 d9 g. x8 X; x+ W( R
inline double logbase(double base, double x) {
! g8 Y# y- r7 i    return log(x)/log(base); ( r5 @  h# X7 t7 n: x
}
8 w# l. m% [% v8 u
6 ~( G! J7 M) E1 |/*
3 A% r0 O  A  R  S/ f4 k; [- }*convert int to hex char.
- j! q+ y7 B& O, P6 ~) f4 R- w*example:10 -> 'A',15 -> 'F' 3 Z2 K2 e$ B# P; h
*/
& e  ~/ Z$ O, G$ F! Vchar intToHexChar(int x); % {2 J% I1 Q* m0 m( q+ X; V
, }3 Q. Z- d6 s
/* ) A7 l8 R; Y- G% p
*convert hex char to int. ! l# t8 q; z& g+ `4 o
*example:'A' -> 10,'F' -> 15
# y7 ?4 c9 s2 T. @& ]' ]0 i, ^, A*/ ' D1 d6 A3 r, x' A0 p+ s
int hexCharToInt(char hex);
2 @* }  e$ p" A! O$ ~$ l
- X# y/ M3 i& I4 Rusing std::string; & [+ a: h2 a+ w" D
/* 7 Y, R! \' Q. ]+ C7 f% X1 b1 A/ ^) F
*convert a byte array to hex string. 7 k1 N# k* H% N1 m2 r9 p8 n8 {- P. @$ l. t
*hex string format example:"AF B0 80 7D" . D: T6 ~& k# H; D  c/ r
*/ 9 |2 f& `+ \- M$ Y2 t+ R9 J
string bytesToHexString(const byte *in, size_t size);
6 i% l8 G" \3 \/ I" `( y
7 H1 C4 ?& ?" l# V% S8 M/*
! Z& e; N/ X% {; B9 O( A, z- j$ V*convert a hex string to a byte array.
- P0 N6 j4 b) M% K*hex string format example:"AF B0 80 7D" 5 r6 c/ u& W6 Z/ L4 V: k
*/ 4 o" b/ q! P1 l
size_t hexStringToBytes(const string &str, byte *out); 8 I9 b6 M7 b( H( \) S1 {! |$ ^

1 v- ~% O9 V, n  I* U8 W( I+ I' e#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
1 b% a3 z$ ~; I2 N" X# ^7 e#include <vector> , k$ i; w  Y; W2 @) C
" e; c! H. U# v5 A2 i& ]# q! \' f
using namespace std;
8 C+ d3 x% g/ V2 n5 F$ k 6 q0 D) w! E8 o1 L/ I
char intToHexChar(int x) {
3 X* U/ [( C2 G" n3 I    static const char HEX[16] = { & @9 N+ E% I& F# Z- b; {- r
        '0', '1', '2', '3', " {* }2 U' t7 M3 V+ Z. w- z
        '4', '5', '6', '7', - A  `* A. S9 f) I( t
        '8', '9', 'A', 'B', 6 L/ e' H* p/ L' L, s
        'C', 'D', 'E', 'F'
' r6 H, c, x9 x* [; P" H    };
/ u& k% u. j9 I4 A    return HEX[x];
" [& n% x) r2 u& @}
# s! p: }6 g7 p' |& T
) _, a0 ^/ q+ I4 Q, }% v5 Sint hexCharToInt(char hex) { + _/ x' v1 V& ]1 {; \8 a/ Y& S
    hex = toupper(hex);
8 R) R/ w" m* [    if (isdigit(hex))
1 w( E$ W% J/ J8 P0 t: B1 r$ o        return (hex - '0');
# ]5 d" z6 f6 `    if (isalpha(hex)) " j8 f5 o  d+ |# q$ |
        return (hex - 'A' + 10); # S$ }1 ^' p- }: L
    return 0;
, T" e# \+ y, q& X- l6 M9 F: E}
6 O! T  @( [1 n! W' u  p+ Q2 }
4 g6 j0 o/ G6 h6 t3 R, ?1 }: nstring bytesToHexString(const byte *in, size_t size) {
$ A' M/ K# g5 g" D3 A! ?    string str; + Y0 _( P- l- G& P1 I+ _
    for (size_t i = 0; i < size; ++i) {
' `& E+ P0 x6 O# B7 X, `. E9 I- E        int t = in[i]; : s4 M" P' @6 m( q2 D
        int a = t / 16;
1 Q5 j- F8 q- C% ?" Q1 R0 P        int b = t % 16; 3 G9 m; b% z9 @% u; G" V6 x# t6 K! p0 ]
        str.append(1, intToHexChar(a));
+ I. P% m2 C# F" Z% D$ Y7 O. d        str.append(1, intToHexChar(b));
/ }# g" _; U/ |5 O: H; d' |3 q- u8 b        if (i != size - 1)
9 [5 H' Z* E) ^3 f0 {, n            str.append(1, ' '); ! b& S6 `1 ?+ t/ G
    }
+ o% A- i- a9 }# e, h5 w    return str;
1 {/ p) m  n* o3 s}
! N7 V2 R5 @( S) ?4 U. v: p $ q' T6 q/ p/ I1 S" k
size_t hexStringToBytes(const string &str, byte *out) {
2 z) x, _: o' z' f . x/ K+ e% |9 k4 r3 I' Z* b
    vector<string> vec; * v% d' U2 f1 t# B
    string::size_type currPos = 0, prevPos = 0;
9 `# n, g. c7 S$ J$ E    while ((currPos = str.find(' ', prevPos)) != string::npos) { ' k* n6 a+ X6 t8 n; _6 F8 m
        string b(str.substr(prevPos, currPos - prevPos)); ) H( [0 a4 e1 D& }1 E# E7 v. {
        vec.push_back(b); 3 D* o+ A7 @0 i. X( }
        prevPos = currPos + 1;
( Z! M! c' Y2 C. \    }
) P* s! \. {+ j' V    if (prevPos < str.size()) {
, V# A) M4 g# K        string b(str.substr(prevPos));
6 _+ A! o) C: r/ B! q7 `, g3 E        vec.push_back(b); # r! F3 X+ Z8 q4 T5 {6 D( C1 f
    }
& k* i; G2 v$ T3 V& J    typedef vector<string>::size_type sz_type;
' O% N- T6 ?$ Y6 m( P) k( Z    sz_type size = vec.size();   ]# T/ ?0 N, x8 V6 H  Z* |2 x! p' F
    for (sz_type i = 0; i < size; ++i) { 8 h# z: |6 |  e1 a" r5 M
        int a = hexCharToInt(vec[i][0]);
" Q- C8 f5 l1 L' Q* ^        int b = hexCharToInt(vec[i][1]);
+ f: ^) B* S0 V- L        out[i] = a * 16 + b; - v9 W+ z, X1 W; M* m
    }
- D4 A9 ]1 O2 `; s    return size;
. o3 t6 c. W) v' {, i/ }# m( J}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H + f. x$ {& m) M+ H, ^5 n
#define TEA_H 8 B5 z( {4 K7 ]  \" t6 m$ i

' \; ^+ p4 x0 N: }! e1 r/* . J5 {; V3 z* D9 G( f; l
*for htonl,htonl ! H: E* M8 s* O" c$ J$ U9 |! x
*do remember link "ws2_32.lib"
2 b1 A6 w* g, [2 F* U*/
; W5 ~) f5 `$ |! r#include <winsock2.h>
$ a% M% m% r" |#include "util.h"
8 F; Q6 T* [2 m; h6 J, c; h 8 n$ X. h8 Q8 t0 P* q8 Z
class TEA {   `3 s  H/ z) W7 g3 x
public: & {; x1 q7 T& \9 i. i8 M, S, p, J7 o3 ~
    TEA(const byte *key, int round = 32, bool isNetByte = false);
% c+ ]2 a. \4 m! T* `    TEA(const TEA &rhs);
# R* d( a+ d; s3 l; G6 Z' X* T3 {    TEA& operator=(const TEA &rhs); 7 h9 s, _' h5 Y0 m: F6 d, k( I
    void encrypt(const byte *in, byte *out); $ M5 S) o! O7 J! s1 z
    void decrypt(const byte *in, byte *out);
/ y5 s0 n3 Z! P& O' V9 C; b6 s9 nprivate: % [+ i( h0 g0 M. p
    void encrypt(const ulong *in, ulong *out);
1 b, `4 L( w1 j/ ?- I- D    void decrypt(const ulong *in, ulong *out); ) a- [' q2 \2 ]3 M, m* p1 H
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 4 @( W2 X7 R+ H1 d* g
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
# J" D, H+ B* U6 M2 T: Bprivate:
& d6 D4 V5 g" W    int _round; //iteration round to encrypt or decrypt
' v$ _0 E  V2 ?/ i( N0 s! }1 ^# O    bool _isNetByte; //whether input bytes come from network
9 h  T& v2 V$ n9 p4 |    byte _key[16]; //encrypt or decrypt key - B* c2 |3 V# j, r9 a6 u
}; 4 a- B1 n7 W- ~0 N
  S' Q7 [9 q: ]% h- Y; S0 ~
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" 4 r3 i* v. f6 {: p$ F
2 #include <cstring> //for memcpy,memset
. U4 J' u2 T' G; Y! Z; _* F0 d 3  9 i( n* A# j& Y2 ^$ \1 ^+ z& ?" Y9 C
4 using namespace std; + P9 t+ u+ E6 H$ u" w
5  
! v; K; ^6 f( w6 B% I. h- l& G5 j, e 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ' V: X6 f2 Z1 g0 x# e, \; O
7 :_round(round)
  b$ X6 ?+ L+ o8 K 8 ,_isNetByte(isNetByte) { 5 [! I8 N" D" G5 s
9     if (key != 0) 6 B: Y5 U& m- ?
10         memcpy(_key, key, 16); ) a! ?5 K8 y' T" @
11     else 8 g  B( S' v1 Z6 d& R
12         memset(_key, 0, 16);
% c& r& R. g8 ]13 } , T1 L0 Q  V; f3 z4 i* D
14  
" H! X8 i& M  U- W7 a15 TEA::TEA(const TEA &rhs) # [* O( J0 W0 X8 b0 }. L
16 :_round(rhs._round)
; y  t; Y5 s' R! B) g5 m- S17 ,_isNetByte(rhs._isNetByte) { ! C* T7 r5 A! L4 i! |! V6 i
18     memcpy(_key, rhs._key, 16); 9 b0 {+ E( u( {% v
19 } % D, I7 z. e# {, Z7 ]9 d$ G/ K* F9 z
20  2 T8 V3 L. r& x. M* \3 }" v
21 TEA& TEA::operator=(const TEA &rhs) {
- h5 T% S% K8 A1 X6 i2 K0 v22     if (&rhs != this) { 8 o. F) w+ y# p3 Q' I
23         _round = rhs._round; 3 j, n& X  g! v2 i( L1 v3 v
24         _isNetByte = rhs._isNetByte; & W# z; J. l$ f0 ~  X1 }
25         memcpy(_key, rhs._key, 16); $ c- t- z/ n8 D
26     }
) S+ f# R" V$ M  X7 R4 W27     return *this;
$ w: p3 B% U) q8 i0 ^: H# C28 } 7 B5 d) P( d8 `) D1 U$ A1 O; w
29  
$ ~/ o6 S; N$ L+ e30 void TEA::encrypt(const byte *in, byte *out) { $ u, W% P# E( n7 E* b0 X# {. r
31     encrypt((const ulong*)in, (ulong*)out);
5 p# ^) h! I( x1 R; c32 } ! x: f' B8 K* C/ L4 g
33    D) @; p0 y5 }% C3 L! {4 [
34 void TEA::decrypt(const byte *in, byte *out) {
- O' f* z) [  _1 m  ]# G, j% N4 B35     decrypt((const ulong*)in, (ulong*)out);
, |9 s/ @' q6 c" f36 } * C; X& @# G. O$ C2 L( c3 c5 H
37  2 A1 W! K& K& X5 e) _% j
38 void TEA::encrypt(const ulong *in, ulong *out) {
; [/ p  N& I; p% S$ X! Z4 N39  * k; w9 U! W% R3 V  @2 |, a7 s
40     ulong *k = (ulong*)_key;
% e' u. V4 J/ h. c$ {41     register ulong y = ntoh(in[0]); 2 o$ h/ `% T+ K6 ?' \; ~) \
42     register ulong z = ntoh(in[1]); . L, E' x% g2 r9 g" m$ }
43     register ulong a = ntoh(k[0]);
; {" Z1 A) r' @7 i) U" u+ d) S44     register ulong b = ntoh(k[1]); + X6 p+ D! |1 G* K" f1 }+ ~8 Q
45     register ulong c = ntoh(k[2]); - p* H' ~' F  r% P# O
46     register ulong d = ntoh(k[3]); , A  }8 L: E6 v: H" u3 {4 P
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ % ]/ n; H# H/ e, m
48     register int round = _round;
( ?% J& i5 H, ]( A$ _: @9 t$ ~49     register ulong sum = 0; 5 f. P7 [+ {6 b/ B3 I) v) \
50  4 @7 z8 e) z, \- Z& ^
51     while (round--) {    /* basic cycle start */
8 G6 Z" m0 v$ D+ a' [52         sum += delta;
8 O+ a, y% u9 }  g3 m  [' A53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
( s/ w( [* S8 L# G. i54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
* G3 r& W2 [* ^& G7 A/ }: `$ M55     }    /* end cycle */ 6 Q2 \% k, W$ x8 a# r% R& |0 G2 {
56     out[0] = ntoh(y); - a3 Y: Q* j# G
57     out[1] = ntoh(z);
6 |5 q  \# b) U8 }" e/ s58 } 5 f6 V0 O; p$ `' Z" X8 ~
59  $ z* g4 {" [% U2 \( e3 @+ _2 O7 S
60 void TEA::decrypt(const ulong *in, ulong *out) {
& i1 a: k3 p& E9 K' e) N61  
: ?/ q, a* g, }62     ulong *k = (ulong*)_key; 3 U' D5 ]6 L- f
63     register ulong y = ntoh(in[0]);
: @8 d9 w$ q4 t2 x64     register ulong z = ntoh(in[1]); . C. F% F# z" ?0 x1 o
65     register ulong a = ntoh(k[0]);
, [/ Q7 W8 p% {: w$ y1 d! ^( T66     register ulong b = ntoh(k[1]);
* S0 _! O9 I: |67     register ulong c = ntoh(k[2]);
; u& N, v1 d# M- z68     register ulong d = ntoh(k[3]); - r# r* p; }0 ~8 c# q
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ! z7 F3 D$ n' V" u
70     register int round = _round; , ]" s. }3 ]/ o" |+ s) W1 t
71     register ulong sum = 0;
$ }: w3 r. G% U72  - Y& S3 I1 h- O1 i% ~: x
73     if (round == 32)
* {, X6 `6 a0 |8 B2 ]0 H# ~$ S74         sum = 0xC6EF3720; /* delta << 5*/
) T; A; k7 w' X" U75     else if (round == 16) 0 k7 w! o+ i8 r: X& e$ K9 h; ^
76         sum = 0xE3779B90; /* delta << 4*/ 1 y. f& P6 V- |
77     else 2 S& C( Z+ X  h7 S
78         sum = delta << static_cast<int>(logbase(2, round));
- _; C3 w- s# h; R% v$ J8 M79  * v& ]. v/ H4 l1 D
80     while (round--) {    /* basic cycle start */
) w& T! @+ K9 L5 i# I! q3 E81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); / T- j# S0 z6 x# m0 k
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ( L# d/ J: n, K5 p0 X9 M
83         sum -= delta; ' K) H+ r: j' q. F% O5 G% N. b
84     }    /* end cycle */
$ ?3 u# x  p5 @  {8 i  k85     out[0] = ntoh(y); . }& T7 \: r: o4 }
86     out[1] = ntoh(z); , B* p+ W" m, F# E1 r2 {+ I% |
87 }
/ L$ q- I0 `; c# M. D! T7 U) x4 S
: ^: G- R8 u. y5 c9 i" r5 `8 p需要说明的是TEA的构造函数: $ u% ]: t; }$ `) D9 b, d6 w9 c
TEA(const byte *key, int round = 32, bool isNetByte = false);
" _2 w4 l( g9 N5 `1.key - 加密或解密用的128-bit(16byte)密钥。 ; }' N; c* U- @: E7 W
2.round - 加密或解密的轮数,常用的有64,32,16。
+ W/ G( H' N; s4 I3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
: L8 f% P% E/ J6 a3 P( U$ Q; Q" z
  q- X4 r0 |  s1 S4 Q最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
: Z# {* _$ c9 X6 q- T- G' s 2 #include "util.h" / `* q1 i( S" G! h: Y# T
3 #include <iostream>
2 I+ g& G% i( U7 p5 L; V9 M- p6 [ 4  
6 U; p9 {" \! X7 s/ ]. A  F4 C4 L" a 5 using namespace std;
1 N* L; j& P) M/ \9 [ 6  
8 [2 ?: B8 v3 x* Z* N$ \ 7 int main() { & Y# g; R" T# c3 k* n/ c
8  
7 X) `5 @9 p5 L/ L9 q8 A6 E 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); & X4 z8 X/ P* ^" b$ h4 P' g
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
. |2 T& n. G) n. h4 T11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; " r3 x' i+ P0 C0 v! ?* D
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
5 ?; D+ |# a. A+ w2 o) h: T) Q13  
6 }  `2 z! {  D6 \+ H( S/ j2 d14     size_t size_in = hexStringToBytes(plainStr, plain);
: f$ X. U4 K) W. t( Z  P15     size_t size_key = hexStringToBytes(keyStr, key); 2 [8 Q9 M+ E% l! G
16  8 {, ?. N& f* S0 @1 Z
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
3 a( Y. p/ Y5 H1 E18         return -1;
5 j; ~: N, j. z2 ~1 P19  # K8 @; q+ @; ]' R+ d' u7 o
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 9 g9 [: |5 N: h; c5 v" h+ U0 [. u
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; . S8 t7 |4 A/ Q
22  % {/ _9 t$ g1 Z1 U$ R& `! H( t
23     TEA tea(key, 16, true);
  q; s& H( a  j$ M+ w  \24     tea.encrypt(plain, crypt); . ?" m5 w% m( ~
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
8 Q. |2 l  W. a1 C4 s8 d4 e26  
' [+ h9 R3 D) N/ f% e27     tea.decrypt(crypt, plain);
% Z) v3 z  E5 ~+ s: C0 ]" x28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; 5 q  V7 E/ J0 r3 \( j
29     return 0; ! k9 T! |0 r, j, h3 s* Z6 G
30 }  x1 F; _. A: B, O  E

6 Z4 D) k; j0 g/ x本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
* n4 A, x8 H; R- R运行结果:
4 W; W- Q& `$ z$ fPlain: AD DE E2 DB B3 E2 DB B3
' N. q$ |( {. b2 Q3 e5 H: F0 xKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
2 o2 a% [/ C3 v7 r0 dCrypt: 3B 3B 4D 8C 24 3A FD F2
- t4 S% U0 V0 v# V0 S5 D0 jPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-8 16:11 , Processed in 0.019936 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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