找回密码
 注册
搜索
查看: 37796|回复: 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轮):
; g+ a7 n6 ~, C: i1 k9 R) }1 z微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
2 H/ N8 \/ J& E7 t( H/ O' ~TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
2 p3 w4 h: _: r- @1 ~之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 3 N% y9 M9 J, [! j& J  A
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 , B! u7 o% J* Y, M5 ~
在 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. & w7 m: G! R1 i& F6 H  z# A; x
  2. void encrypt(unsigned long *v, unsigned long *k) {
    / K  j7 \* J  A. B
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ( \1 Z1 K+ |) U* h
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    + A, F$ a+ E+ k* t
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ , C5 D+ e4 P% H* Q/ B4 [
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ! D! U0 h3 R1 ^5 E4 G
  7.          sum += delta; 6 y4 S2 p) t! h) Y
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); ! J* w0 L2 R: H0 Q
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    - n' k- K3 m# v$ g0 U
  10.      }
    ( H& W3 j, N& R$ P
  11.      v[0]=y;
    + }. n3 {, d7 E2 g& q% t- g
  12.      v[1]=z; 4 N" F5 c. b8 u9 E5 K$ R. x+ B. m
  13. }
    7 Z" F* a  j" k0 V/ c
  14.   " [; X2 Q* V# A0 l, e2 N8 G
  15. void decrypt(unsigned long *v, unsigned long *k) {
    * L! \6 a" t, R5 }, Y. Z; e6 D
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ . t, R( c7 G" u2 a5 [. X2 a3 Z' r
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ + i0 }3 Q: w7 R4 x' O6 [( G
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 7 ~7 x+ Y* m  {8 X1 @. c; j
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ / P7 ?# S/ _5 H
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ' S9 b5 f+ Y+ S9 G3 E' A
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    , ~$ Z# P, H# C9 k
  22.          sum -= delta;                                /* end cycle */ ( x1 t4 c; j' N$ ]
  23.      }
    / C: a) H* f, }
  24.      v[0]=y; : j) k& f8 x7 n6 l2 q3 K
  25.      v[1]=z;
    + |$ W- `$ Z8 m3 l! U5 A( N
  26. }) `' e9 A+ I$ J  R
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
/ q* ?# Y2 X/ H7 }0 i- H#define UTIL_H / w# ^) p. k2 N6 f3 G3 V( Y& ^

' z, O( ^# I6 U5 k) A#include <string>
. P$ n; ]. u9 F  X' k& Y#include <cmath> * j$ N( f$ i' v; {
#include <cstdlib>
3 [8 R4 n4 Q6 m/ l5 a& v ! _4 N3 N$ h, g9 x
typedef unsigned char byte; 8 x" }, ~4 F6 F) |
typedef unsigned long ulong;   u' _# F4 s0 ^6 D

& Y" b% J& \+ T6 J7 A' L% ^inline double logbase(double base, double x) {
- b3 s! j- a. {1 o    return log(x)/log(base);
( l: b# S4 e8 N0 m0 A1 `- q5 y} ( I* W6 ]3 p+ r- [4 l' I  W
  e2 G+ j- Z) G+ h+ s/ X) K
/* ; t! P' G) O& t1 P( a! _' ^
*convert int to hex char. $ ]1 V( Z% y! d* i) j- C9 S7 Z# F+ z" L7 Y
*example:10 -> 'A',15 -> 'F' 7 _$ e* c" X& u. l  G
*/
& F3 a+ f% U, ~3 Rchar intToHexChar(int x);
! t' A2 N! O4 V3 M9 d3 ^& s6 G - Y" o2 ~* J, `1 V
/* 7 P) P  a; ~) K2 B  ]
*convert hex char to int. + g+ N( Q% C% D3 x; r5 M( _9 z/ s
*example:'A' -> 10,'F' -> 15 ' R$ M; ~6 x7 y2 m1 d- D
*/
9 C  ]' f3 {4 s% |" [. I7 sint hexCharToInt(char hex); - X) l; ~, M# D2 q5 s

! j5 j+ M/ Q, \; Y  nusing std::string;
/ U* T6 e, ^, n0 F+ J/*
( R, A  F5 [4 P8 X*convert a byte array to hex string.
8 D1 b4 M" g- @( K4 v* L4 s*hex string format example:"AF B0 80 7D"
- X, ^, [! A  b1 P8 }4 @1 A8 U* F*/
( t) L! ]' j" s9 F0 x, a& lstring bytesToHexString(const byte *in, size_t size);
6 N! o! h6 N/ l& ?, N# ` 3 }; {3 D! A! I5 c5 _5 Q1 e
/* ) Z5 C; i, R' B5 P" ?. O1 H! T
*convert a hex string to a byte array. . K2 ^( j+ [4 ]$ l
*hex string format example:"AF B0 80 7D"
# v: q7 P- S0 C: V8 J6 K9 S7 y*/
' {& s( J" V8 T1 Y. Osize_t hexStringToBytes(const string &str, byte *out);
% _$ I" \$ h6 f' u& \  ]1 P3 i
) v6 Q1 w# ?# n# {3 j4 U. A, c#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
, N4 t( N& }* J; y$ \#include <vector>
; \8 Z, O) a2 B3 ?- V 2 A. a' p8 o' C+ r# X$ ?3 B
using namespace std; 6 k2 m+ m. B! y6 u; E1 H
! K5 b# {! x# ~: ?
char intToHexChar(int x) {
$ o2 C6 y% }  q: q2 D* p+ m: V, [    static const char HEX[16] = {
; E- h1 a! u2 c7 ^7 Q% c        '0', '1', '2', '3',
. w' J) [' |' ?4 O0 r7 f        '4', '5', '6', '7',
1 }$ h% V1 M+ V7 I3 F( e        '8', '9', 'A', 'B',
5 y9 W& e: Q) {2 h        'C', 'D', 'E', 'F'
/ Z$ k) ]) E: `3 z# f5 |    };
8 l6 P$ R( L6 h# h    return HEX[x];
/ M# I/ j0 h6 N( r6 N6 Y% W} 7 d! ~1 u  U$ [* Y& b9 d
/ X& O: ]2 }3 b7 q- B: S
int hexCharToInt(char hex) { & W, ?! A  {1 R* i+ E
    hex = toupper(hex); 2 b" ]: `! `1 _& ~& F' y" {6 N
    if (isdigit(hex)) 6 I) y- y1 B/ n5 v+ G$ B: J
        return (hex - '0'); ' t: _" |7 p& Z' S3 }/ ^/ l
    if (isalpha(hex))
5 i, `' O+ p/ D        return (hex - 'A' + 10); % N. g2 F" ]. s$ x& G: _
    return 0;
% w! s; l' Z7 e5 c: {5 X, ~} % Z9 F# o4 F0 y/ J

) `, W& j1 V# M6 v" fstring bytesToHexString(const byte *in, size_t size) { 5 @% R" m! B0 M
    string str; ) J% {5 ^: B2 q  h9 k& l, |
    for (size_t i = 0; i < size; ++i) {
, B8 h) r/ T% {        int t = in[i]; " G, N2 }2 o4 P2 }  K& c
        int a = t / 16; . }* Y$ L- e0 P' q
        int b = t % 16;
' K; U/ ]2 N$ b3 c4 ~  Z7 y        str.append(1, intToHexChar(a)); 6 M( B. g8 P7 D2 l
        str.append(1, intToHexChar(b)); + s  m9 B6 J" N7 _9 Y6 v. R
        if (i != size - 1)
% i% s0 K; ]% A9 S+ e            str.append(1, ' '); ' w/ U' p/ \4 O2 X& p' X' b3 G
    }
2 h2 C) f1 v+ l+ H* Z! W    return str; # y+ ]9 z( P' O
} ' m+ }, ~. E/ k+ H9 n

4 \$ N3 U1 e: Fsize_t hexStringToBytes(const string &str, byte *out) { # G; K+ T9 w9 V; {% d6 m% G7 D2 `

7 c& H; ^+ s; E3 z2 M    vector<string> vec; % z; G. `4 A8 M
    string::size_type currPos = 0, prevPos = 0; ) B4 c% J- L# y; |1 J8 N
    while ((currPos = str.find(' ', prevPos)) != string::npos) { / N" ^/ _* \1 S" g
        string b(str.substr(prevPos, currPos - prevPos)); ! s* w  N9 _/ B1 G
        vec.push_back(b); 2 e' r" b: J' }& l
        prevPos = currPos + 1;
. ^: y3 Q9 p' g* j) ]    }
8 a% M. o* [4 S; C. u    if (prevPos < str.size()) {
; g/ d! i' f: f, f' R2 T        string b(str.substr(prevPos));
. b2 o" y! O) P5 H$ w/ ^3 ^        vec.push_back(b); 0 c  A0 N, i" h! }4 A' N9 Y
    } 6 L$ Z3 h0 a8 k' P
    typedef vector<string>::size_type sz_type;
5 h* V" U  x8 z8 q' Y& x* z    sz_type size = vec.size(); ( T+ T8 p+ B' n7 j1 e
    for (sz_type i = 0; i < size; ++i) {
6 K' ^7 P! d) |9 _: G, ~* i* J        int a = hexCharToInt(vec[i][0]);   d/ ]# Q: s$ R3 a$ I2 n! w8 N
        int b = hexCharToInt(vec[i][1]); 6 `& N) d. X+ W  F
        out[i] = a * 16 + b;
% f( z& Y+ l% T- a6 R    }
% h* g- ]  e7 y+ ^) @. V9 v    return size;
! B: i! Q3 ]" q7 {}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
* ?: D6 [% s  q7 i, B7 J#define TEA_H 6 e3 }$ g, @+ X6 m: e
7 ], ?/ |$ \/ h
/* / G3 I0 z$ [+ s' L, S  {* m
*for htonl,htonl $ `" E/ \1 Q: D
*do remember link "ws2_32.lib" ( y) y; v8 {! P0 ~: Y+ Z% D: F
*/ : P2 k" {' }  e8 J
#include <winsock2.h>
3 w& w; d5 ^5 N" ?% G#include "util.h"
2 X! s$ Z6 g/ }2 F4 i
! D& \( r  a8 B7 [# i4 v% o' r* fclass TEA {
; d6 b+ m3 r( F8 }' Jpublic: 0 K3 O- q& a5 M. @
    TEA(const byte *key, int round = 32, bool isNetByte = false); 3 i; D' j8 I$ d' J3 j4 M  B  C
    TEA(const TEA &rhs);
  p/ r7 N. `; f0 l3 J5 Q    TEA& operator=(const TEA &rhs);
% p' _4 W3 L& R$ a. t# x    void encrypt(const byte *in, byte *out);
( X. |* J7 |/ y0 }( y. b, v    void decrypt(const byte *in, byte *out);
6 o' _7 l+ T: u1 I! Q9 T2 [$ I# S2 Dprivate: ' H2 q* o0 w9 C
    void encrypt(const ulong *in, ulong *out);
9 J: L6 g4 u3 N; F# g  [2 l    void decrypt(const ulong *in, ulong *out); 9 [2 a4 g  {, n
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 6 U4 T7 b5 J2 n$ k
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } . R2 l& W$ r0 a$ f  I  j
private: 5 j/ l: H$ r& ?
    int _round; //iteration round to encrypt or decrypt
; e+ D9 |8 N0 T% t- s4 l    bool _isNetByte; //whether input bytes come from network
* }" J' Y1 T: j; l    byte _key[16]; //encrypt or decrypt key & i- h: o4 W, O4 h
};   i2 g7 L  s% U4 G4 ^+ d9 y

! h5 b- j4 Q2 q8 `0 q3 m' {* x" X+ u#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
" ?& U2 ~% e7 K 2 #include <cstring> //for memcpy,memset
8 ^( W0 K5 S/ h/ q 3  4 _9 `; h5 a0 L4 \- g' H1 S
4 using namespace std;
! C& H1 ~) C) o5 m7 v  }) ]/ \ 5  
" f% k$ b  C+ c 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) , `3 G9 T' }5 f# V+ k0 q& \
7 :_round(round) , y" i. H' C+ E3 }, x$ @) R0 S
8 ,_isNetByte(isNetByte) { + c) F+ K$ A- s% W# m# K" I
9     if (key != 0)
4 q/ F) E" \6 Z* H5 Q3 F7 b10         memcpy(_key, key, 16); 7 m+ Q* Y# R( L! C/ l9 S# P
11     else
  e  z& C5 e7 N# n/ l12         memset(_key, 0, 16); 4 K% I0 j+ ?( F8 B+ b  {% L
13 } ) C2 X5 _+ [  \: r! S/ I
14  
* m. E; J& _8 q+ e# t2 B% Z$ V15 TEA::TEA(const TEA &rhs) 9 O+ O6 C) l  ^) g1 _
16 :_round(rhs._round) 2 ?, o  `4 Y2 ?, d4 |' h# f
17 ,_isNetByte(rhs._isNetByte) {
% b0 _3 A( |2 m0 S% r18     memcpy(_key, rhs._key, 16);
6 g* \8 l& E4 t2 g; U) A1 \19 }
/ C5 E! Z1 c4 @* R" \20  
# P# S1 D' ~, a% S21 TEA& TEA::operator=(const TEA &rhs) {
  [* z2 N# }# q8 ^* M22     if (&rhs != this) { ) Q% Y' n9 E) U7 i7 s% q6 Z
23         _round = rhs._round; 2 p' d0 f4 ?0 k. C9 b& i
24         _isNetByte = rhs._isNetByte; 4 Y0 |( P" A7 f+ {3 L
25         memcpy(_key, rhs._key, 16);
3 ?$ ~( C- t% {26     } # `% O7 {0 H: g" X$ a
27     return *this; 4 M' d4 N- n8 _) i" @& R# G' U% v5 j
28 }
2 t# l" r. H, x; B3 d# _) y6 H* T29  
* a% ]( d4 Z, b* [( `0 p30 void TEA::encrypt(const byte *in, byte *out) { 8 T5 d7 M+ _* \& ]; l0 H
31     encrypt((const ulong*)in, (ulong*)out);
# U$ R1 o- l6 N7 F2 E! s$ L32 }
' e# i" e# z" r33  ' T9 o" |# R6 F! q1 y
34 void TEA::decrypt(const byte *in, byte *out) {
6 `7 F7 [5 l: z7 S* p35     decrypt((const ulong*)in, (ulong*)out); # Y: z/ b+ \5 ~5 j" q. g6 ?
36 } ! Q& c  ^' }7 v) ^7 w" C: l+ I6 E
37  
0 l4 `, o$ E( A2 l1 @38 void TEA::encrypt(const ulong *in, ulong *out) { % r; H1 @8 D. S* {, Y
39  
, v+ |# @8 x. X* A; u5 F0 n40     ulong *k = (ulong*)_key; ( t2 p; `3 w' h5 @% }5 c4 ?
41     register ulong y = ntoh(in[0]);
4 F; L! p' I1 g3 m4 N$ q1 f" Y4 d& t4 K$ z42     register ulong z = ntoh(in[1]);
$ G9 v4 E9 @& r  `6 x5 c; z8 T: [43     register ulong a = ntoh(k[0]);
6 _4 I$ ]( ~& R% z* o* S44     register ulong b = ntoh(k[1]);
7 v% s. d5 r: ]9 W* O45     register ulong c = ntoh(k[2]);
1 _$ K. B4 b3 |+ H$ |46     register ulong d = ntoh(k[3]); 7 U; N& H5 X# r% v/ w( Y
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ / f* ?7 W4 @: L8 {, {; d
48     register int round = _round; 1 l' q! |" q8 B+ U3 e
49     register ulong sum = 0; 9 m4 J3 g9 l; k
50  
5 `  R6 ]" ^' i7 e* T% e51     while (round--) {    /* basic cycle start */ 9 M4 O. ^- a$ V! z
52         sum += delta;
! p$ A8 ?8 r' A( U8 A8 z. k53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
" _( y. Q, O9 @1 h; C0 w. i54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
/ s6 n3 G3 w4 O1 z- s' d2 q55     }    /* end cycle */ 2 `1 o6 v/ M! I' V% ?5 z
56     out[0] = ntoh(y); ' h" k) f% v: F$ k4 U
57     out[1] = ntoh(z);
- X3 d5 C$ J/ k/ y( o! \58 }
1 }, p9 u7 j: k: Y4 P* T59  : a# ?7 }# G/ U! @/ K2 }0 p
60 void TEA::decrypt(const ulong *in, ulong *out) {
/ b  X  W. C1 K3 Z" e61  
9 E3 l, w$ x, b. Z/ O; l62     ulong *k = (ulong*)_key; 7 B( c+ r% _0 ?
63     register ulong y = ntoh(in[0]);
7 W, T8 N" a4 `! P2 C; a64     register ulong z = ntoh(in[1]);
( r5 b) I0 B* ]0 q5 U65     register ulong a = ntoh(k[0]); . [' k" d* ~, z; p
66     register ulong b = ntoh(k[1]);
0 o2 f* x, r& n, U  J. M7 m9 I67     register ulong c = ntoh(k[2]); + Q: @- P7 L/ n
68     register ulong d = ntoh(k[3]);
% l; @" u. p- P+ X6 e69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
3 s# b6 P! B5 p; s" U+ R2 z70     register int round = _round;
8 U3 A6 P  l; J1 R71     register ulong sum = 0; # a8 `1 E0 Y- P$ t, U4 J
72  
8 ?+ \4 t9 Y9 n) y1 m  ~+ }73     if (round == 32)
/ c4 u( {0 k, D2 s74         sum = 0xC6EF3720; /* delta << 5*/
+ A5 K% [9 T0 M  X75     else if (round == 16) - q2 o! W+ Y, l1 s5 J
76         sum = 0xE3779B90; /* delta << 4*/
# N/ z- f5 p9 Z# c2 h" A77     else ) x6 c% K% }) B2 ]* [
78         sum = delta << static_cast<int>(logbase(2, round)); $ Z$ G- G2 }6 a( O+ ^
79  , f& H9 x, b& A3 _
80     while (round--) {    /* basic cycle start */ 8 K) M8 H6 k/ l) \
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ' }, q9 b. V$ U& H. a
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
0 m9 O- v( B+ o$ g  X  m+ k83         sum -= delta;
4 B4 ?7 B% D- Q9 V84     }    /* end cycle */ # i% c2 S. i$ u1 c8 t" d
85     out[0] = ntoh(y);
5 m* I! ^& t( a6 G) \% B86     out[1] = ntoh(z); $ T; y7 K( D7 o7 j' A' I2 N& k# k! ~
87 }+ |: r$ c1 ^2 G+ x, v2 C2 W
9 h" w4 |3 G. F  m- ^9 `  L
需要说明的是TEA的构造函数:
- X+ w) @( s! xTEA(const byte *key, int round = 32, bool isNetByte = false);
- _) u9 X/ y% L7 n5 x; }, q1.key - 加密或解密用的128-bit(16byte)密钥。
5 y$ B5 {" z% q0 b$ L2.round - 加密或解密的轮数,常用的有64,32,16。 / G7 P& b! X3 z! i: W
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
# M4 q7 u$ i/ U  h' G" L# O
$ E* i0 T. `. N" B最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
( u1 T0 O2 C# W1 h# ?3 S 2 #include "util.h"
# |' {# T# ?: n/ |) h 3 #include <iostream> ! f' H- S) V  U4 ?
4  
5 Y2 S  M/ O# P5 b& `  s( y 5 using namespace std; 4 ^; L! C# ^+ a  Y
6  
9 O3 ^9 Y4 K( e) i 7 int main() { 1 c+ b* S5 R) w
8  ; C' ~  q2 E' B% r$ K% D8 t6 C
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 8 X3 k9 J) b. t$ Q% M7 E3 Q1 \
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
' ~5 Y4 y5 Z6 L2 _/ N' n6 o1 j11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
5 ~4 P+ f# O) a" t  S12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
: O1 |9 L% x  K0 K8 _  y0 P5 Y13  
6 y7 X9 ?# j6 l, y% ^14     size_t size_in = hexStringToBytes(plainStr, plain);
3 F* k  Y6 r% o$ c& V% L15     size_t size_key = hexStringToBytes(keyStr, key); % Z1 g6 ~8 |3 ~4 j% Q/ P% J9 z
16  0 d9 `6 p& H7 l; H$ }$ G5 L. G: Y% s
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ; V$ b, H! _, f, e$ y9 }
18         return -1; 3 a7 [" Q0 n4 W3 u
19  
+ q( C* \+ J" `20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; . m8 M- Q2 Z+ Q% c: o1 W
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 3 I3 Y; s9 i! p4 D5 v( e2 o( X& w
22  - J+ I" @5 E2 V+ k# _- P8 D
23     TEA tea(key, 16, true); / m) Q0 p4 ?0 @. b9 M
24     tea.encrypt(plain, crypt); 2 ~" c! I9 V" m( `
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
, j* s" j3 c! B8 i26  2 d% z0 W9 R. n9 e3 l
27     tea.decrypt(crypt, plain); $ a; ~+ W- Q/ ?0 n1 N
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; & F4 G3 _( m' h% `9 W) d: \
29     return 0; : @2 H, a$ {; H6 h5 b( \
30 }
0 N5 \+ J$ L9 ?+ L6 Q, f/ p0 T5 J- [+ Q' S- w0 R5 s' W6 p3 a
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx. Q: p' k/ U0 C9 T+ Z- C( U# P
运行结果: # B* X, a9 Y" K; j7 F. g) r
Plain: AD DE E2 DB B3 E2 DB B3
: d- N4 c2 a& K7 P8 JKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 + c6 [* q! G0 v+ c* N3 M
Crypt: 3B 3B 4D 8C 24 3A FD F2
" [# y( t- P; N) _( P: m: n7 oPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-26 06:20 , Processed in 0.021678 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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