找回密码
 注册
搜索
查看: 37325|回复: 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轮):
2 m+ [2 s& |* _% K2 U0 H微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
7 w# u* s$ j+ Z) vTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 6 t/ K$ L6 [7 @
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ! g! u3 _  [. w' V% _8 @$ Z9 f( t
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 . k8 R/ G' E9 N7 Y
在 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. + _9 [; [3 N. j* @  J8 x
  2. void encrypt(unsigned long *v, unsigned long *k) {
    - e7 X# R9 u+ k) o% u1 r7 s
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    1 [( t6 K* Q+ p
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    6 X% S* O7 W* H6 Y
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    ( `$ @& c8 ?5 V2 a1 E
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    7 O# b( N1 [' g9 S
  7.          sum += delta; 6 S9 i6 T1 ]. t4 m9 U
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 2 ]( h( g! O6 |" I) O
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
      s2 i2 f( |/ O% j1 f
  10.      }
    0 ?0 @8 \! ^$ z3 `* q- C
  11.      v[0]=y;   C+ ^+ @& ]- q; n
  12.      v[1]=z;
    - D, U( b  m' ~7 e
  13. }
    " k& Q7 i' y( p) @, `; w
  14.   
    ; J' P$ E% x- F, M) ^$ o
  15. void decrypt(unsigned long *v, unsigned long *k) {
    " i6 j. s' a/ p3 t( i
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    ) b7 ~$ e1 q0 f% R  G) n' q
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    ; o) |; P7 o7 h! Z" ]# E
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    . P/ f; r3 }" \
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 5 `4 U. J0 G' {
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ) e, H5 b/ m# {
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    % T4 P5 D' S0 Z) b7 L; ]7 l$ j
  22.          sum -= delta;                                /* end cycle */
    7 R( L. ?  A0 W4 m4 D( X5 T0 s8 X
  23.      }
    ' [4 f' W0 Y- d# E* @/ F( A" i
  24.      v[0]=y;   m. O( [. Y# F
  25.      v[1]=z; # {0 t+ Q% R8 @4 u9 a6 Q
  26. }
    2 o( w: Q1 z: D4 N
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
' U, V) l% i5 s3 f1 s+ g#define UTIL_H % o* l6 e, J0 a: A
8 t0 ^3 V. t6 y7 h. p7 t9 h' V8 u
#include <string> 0 z& l6 u3 }' q% Y2 v
#include <cmath>
8 Z4 i8 ?1 j: l4 B#include <cstdlib>
$ e* X$ R7 f5 b, Q% k, @
) x7 ~  r4 n! }  \5 C2 Qtypedef unsigned char byte;
: F! _% `) m# Y& |8 dtypedef unsigned long ulong; . G9 z' h. W6 |" I5 H, Q. B- z
. D; G2 h) z" n, e; {6 Q. L
inline double logbase(double base, double x) {
" h  X2 ?+ Y& A) ^0 u! }+ ]- `    return log(x)/log(base);   `: A* X# U% t* L
}   k0 ^5 I# y: c! U4 P$ @+ S# [$ i

" F/ {+ v* s3 h7 z7 B/* & b# y) r" n% u5 G& L7 y
*convert int to hex char.
- L1 l( c/ @8 W: t: |1 j& A*example:10 -> 'A',15 -> 'F'
, c2 Y: h0 S1 z1 y*/
: ^7 W5 `6 P: b- c0 l! Echar intToHexChar(int x); 8 w/ _; t/ W0 @& u) h2 H
7 \; c5 A& M4 ]7 c
/*
& l. {; V% {; ]+ Q4 q3 B4 y/ i. H*convert hex char to int.
6 B5 \; P/ X9 s; w- U/ J7 Q& e*example:'A' -> 10,'F' -> 15
) E! }* \( J- c*/ 2 r5 q) q- s! `$ t' l
int hexCharToInt(char hex);
6 i9 K2 n% a( I8 n$ y 2 E7 u' q% S" K5 K$ L' T* H* W' V
using std::string; % W# G! ^1 a. @# q5 S
/* & C+ A0 s" l( |5 ]7 A  m& ~
*convert a byte array to hex string. * o+ U% B1 V1 f- g
*hex string format example:"AF B0 80 7D"
1 _% e+ y1 B" E2 Y*/ * Z% o' K1 s4 V/ a% o1 Q. T  O
string bytesToHexString(const byte *in, size_t size);
$ z. t( G$ g  Z5 c, V8 n. |2 A; o 9 Q6 K2 S, m- t! c4 X& Q3 y6 y. o# e
/*
- Z) K* s" Q; p  B+ v2 a8 s  R" w*convert a hex string to a byte array.
4 |- s, D0 ~. ]' \" w*hex string format example:"AF B0 80 7D" 7 G+ f* T* G7 g; a
*/ ( Y8 Q' ^  Y3 L
size_t hexStringToBytes(const string &str, byte *out);
# s1 Q, h: q7 o1 t3 H( I
7 @' h* j. Y% \& i& f. N4 q#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
8 K, _: r! s) f0 E& E#include <vector>
8 Y  u0 [1 z0 C" @: T" F ! j5 m7 g4 H. {; O/ t5 Z
using namespace std;
; \- `  r% g- J3 A. R
: n  @0 Y( l1 \) ochar intToHexChar(int x) {
/ ~* x! \; T1 h* C- A+ [% K! H    static const char HEX[16] = {
' i1 n# G. J0 b- b        '0', '1', '2', '3', ! a8 Z% p" }+ K4 u8 e& K- b
        '4', '5', '6', '7',
, ]: p- W2 r2 i! e  J# C# `        '8', '9', 'A', 'B', , j* U% k4 g# |# o! z0 f- z2 I; s
        'C', 'D', 'E', 'F'
0 |( p( `: E% b9 T/ Y! e    };
  v  z4 s' f. l6 v5 P& j5 ]8 p    return HEX[x]; ( B: Z3 `9 {7 n# v2 d. M! K$ @3 W- z
} 2 L: }$ M  M5 A' }1 h+ W
: b. R1 X; ~5 b# E
int hexCharToInt(char hex) {
- A' a: c5 G; o9 l% b- J3 I    hex = toupper(hex); , g- G1 ~. C% U
    if (isdigit(hex)) 5 w9 @4 J- {+ Z* t" I- D
        return (hex - '0'); . o7 q" F2 Q$ L  I" ~* `8 }
    if (isalpha(hex)) 4 X. ^8 |' d( {5 e' W
        return (hex - 'A' + 10);
% l, O* T  a; z4 ^    return 0;
$ v- m& D& F$ t& w  ?5 m* Q; Q}
. z4 V% C) O8 h- I' U : D" r# t6 \0 i9 M0 X) o" w
string bytesToHexString(const byte *in, size_t size) { 1 V5 }4 }5 ?: f7 A: Z$ b" ]; S4 Q
    string str; 0 i1 u) R+ n1 ~2 U- K
    for (size_t i = 0; i < size; ++i) { 9 d# U7 o% _4 w7 R
        int t = in[i]; , U/ A4 \/ W( l# N0 J( B, ^7 l
        int a = t / 16; ! Q* Z3 B1 G2 J* y" n* t
        int b = t % 16; 7 U' y; `5 ~  m/ u
        str.append(1, intToHexChar(a)); 0 m  g, S6 Q: I- ^
        str.append(1, intToHexChar(b)); : M! `4 T' o/ w  c: f. p
        if (i != size - 1) ( T4 k) T9 ?2 e/ d% u
            str.append(1, ' ');
' a5 X7 g8 S/ u3 D& ^    }
, [- W# [. c0 q# f    return str;
5 M; I6 A7 k6 |/ X- ^  z6 f+ T}
+ q$ |) G1 Q6 h& J  q
1 x3 H: c' r0 |$ ~) Nsize_t hexStringToBytes(const string &str, byte *out) {
9 Y* ~8 }0 t8 r ! R" h: o/ ]0 `
    vector<string> vec; 4 H' O5 U$ q# y* O6 N
    string::size_type currPos = 0, prevPos = 0; / \7 E6 m- k* ]' \- ?1 n
    while ((currPos = str.find(' ', prevPos)) != string::npos) { : d, K; u" O2 _4 B5 I* Y# H: u4 m
        string b(str.substr(prevPos, currPos - prevPos)); * j2 _; A" V6 ^
        vec.push_back(b); 8 u" B9 ~1 i' i7 H5 ^
        prevPos = currPos + 1;
5 L+ _. d0 Q2 J7 m- N    } & D* d& }7 g2 B4 ]
    if (prevPos < str.size()) { 6 f4 {6 K" n; S! }& m* n& h
        string b(str.substr(prevPos));
& l$ f+ g7 _, W( i2 P4 z        vec.push_back(b);
8 V* C$ \! K! I. N) _: U9 ]    }
* Y* D  G& w! d    typedef vector<string>::size_type sz_type; 6 E3 G# u  y9 K) F- O% S
    sz_type size = vec.size();
3 e0 K% E# r) d, P    for (sz_type i = 0; i < size; ++i) { $ T7 K/ }6 r- I0 ?8 {0 \7 u1 X
        int a = hexCharToInt(vec[i][0]);
6 v$ W  W# d% w( k# C7 J* Z        int b = hexCharToInt(vec[i][1]); - T8 z; }/ I1 |( y# h2 t/ |- J1 |
        out[i] = a * 16 + b; 4 a4 @: ?5 T( D. U& G+ b
    }
9 s* I- P) [: g% d* s    return size;
! K$ h" @! I# P4 P; D( a9 x}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ; c% x4 U% _( g( y) n8 J
#define TEA_H 5 C% _, c: I8 @* ]: W2 P9 I
# j. a" x/ {2 w+ O
/*
4 }1 a3 p* f4 z*for htonl,htonl
" o& y/ X$ v* ?! H1 Q/ Q9 g) Q" u*do remember link "ws2_32.lib"
" F) \$ T$ O1 ?% L; g8 }*/ 1 n  Y6 r# t% N* o$ e
#include <winsock2.h>
9 F* x, q8 y" Z1 O#include "util.h"
8 a0 N6 s' u6 T; s
, P) F3 W( [) z% C( h/ hclass TEA {
! y* G  f9 o' K2 ]8 wpublic: & Z, L  S9 K: O: Q4 L, O
    TEA(const byte *key, int round = 32, bool isNetByte = false);
% Q# R: p4 a+ u  b4 E) ~    TEA(const TEA &rhs); 7 K0 C& B  V! h
    TEA& operator=(const TEA &rhs);
7 g' N6 u% R; t    void encrypt(const byte *in, byte *out); 2 w, t9 q! R+ W* x% q0 M
    void decrypt(const byte *in, byte *out); 9 t* y: R; b+ ?' C' J5 @! F5 }
private:
/ L$ a" v6 y& s" h3 }. k8 p    void encrypt(const ulong *in, ulong *out); & {4 R5 ^* b6 w3 i' S$ t7 ?: Q; [
    void decrypt(const ulong *in, ulong *out); : N( g1 i3 E7 o+ j$ }9 K4 |0 V
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } + r( C- z, t& B- U
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
2 O# l: ]8 d: K( O6 G& U9 mprivate:
( R9 \! W+ x# V    int _round; //iteration round to encrypt or decrypt
5 a. ?8 s: D: z7 b) p2 y+ t; V    bool _isNetByte; //whether input bytes come from network : L0 r0 P1 P0 q" H* Z' [, y
    byte _key[16]; //encrypt or decrypt key * V! E) t$ I2 y- s
};
' ]; G, o& k7 i. j! M( M. Q
# ]& m& g; J$ [5 t; b% m) a- D#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ! s2 C7 K, d* y
2 #include <cstring> //for memcpy,memset , m5 A7 \% w/ a
3  
& @% j8 [6 o2 o6 r. I 4 using namespace std;
1 a* l9 k, R1 r$ G1 U" I7 [+ k' z 5  6 d, z5 I9 X# _, ?- ?
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
* H2 b" v. S: G7 C, w  m) d3 Q 7 :_round(round) 2 G1 v+ K( L# @& _# N+ N2 _
8 ,_isNetByte(isNetByte) { 4 M6 ~# @" t8 S& n; {+ a1 _: W
9     if (key != 0) % X6 x) K0 |, T' a* ~) \
10         memcpy(_key, key, 16);
5 z& i5 q* k7 T4 F* ]11     else
# ~" E6 ?$ r2 t+ L! I& W2 ]3 C12         memset(_key, 0, 16);   S' Y) \6 c4 z- Z& b8 {
13 } , W% g9 }9 u2 o& t  \8 Z  E
14  : Z3 Q& z& Z* A( n! L
15 TEA::TEA(const TEA &rhs) ( k0 J  g0 U/ V! E7 k# P% C2 Z
16 :_round(rhs._round) # X7 o& W/ \8 k! N
17 ,_isNetByte(rhs._isNetByte) { ) S6 H3 ~; V) t" ]" P2 w+ H% ^
18     memcpy(_key, rhs._key, 16);
' a# X9 f1 H% Z/ e# f19 }
; q8 U7 R, y: c6 a' E( K% ]  l20  
" C1 o, M& q  f7 |21 TEA& TEA::operator=(const TEA &rhs) { 5 u6 t/ f) G6 y% X7 v6 }
22     if (&rhs != this) {
% V: p3 X1 d% M23         _round = rhs._round;
9 y, O% U" i3 B9 I0 j' _1 C3 }24         _isNetByte = rhs._isNetByte; / ]& W+ p, @- R( L6 M4 H& @
25         memcpy(_key, rhs._key, 16);
! m0 \. r8 X; A26     } 6 {& h3 x" n' F/ P
27     return *this; " q9 Q! y5 W, Q# p, K
28 }
+ e, C- z  X; t! X  `29  " k8 Z& W$ t% ]7 b+ d
30 void TEA::encrypt(const byte *in, byte *out) { 1 N2 R3 T: S$ }: A! O
31     encrypt((const ulong*)in, (ulong*)out); 7 |( N$ a- y( t
32 } $ l5 R3 @) ]' U- I- P" x- E
33  6 e$ S6 Q* I* ?6 v; d6 V) h
34 void TEA::decrypt(const byte *in, byte *out) { , ~7 V& w$ p! G
35     decrypt((const ulong*)in, (ulong*)out);   D8 n& U$ f# Q2 A# P) [
36 } + L; o' L' \4 C$ v! u
37  ; X' W1 t: b2 v( J+ v. k2 {
38 void TEA::encrypt(const ulong *in, ulong *out) {
* \% T' F( i, g2 s39  9 Y/ v- f+ Z" H) @& P, j0 i
40     ulong *k = (ulong*)_key;
, E( K/ e$ r& q8 W. j41     register ulong y = ntoh(in[0]);
7 v+ t  m! e2 X" @% n# r42     register ulong z = ntoh(in[1]); . W" I( @* u. R
43     register ulong a = ntoh(k[0]); ) s8 o; @7 ~. ]  `7 u% `$ w; J; d( G
44     register ulong b = ntoh(k[1]); * O. s  l2 ?7 x
45     register ulong c = ntoh(k[2]);
: a" N& W+ p' r& g& ?! X46     register ulong d = ntoh(k[3]); ! j8 Z$ y. D3 b& a5 K: d8 D
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ ) v0 N! L( B$ c) N9 W& S4 I1 G
48     register int round = _round;
* B/ ^: K: w$ i  w49     register ulong sum = 0;
' z5 s9 S( d2 ^  H" f9 r9 ?& B6 H50  + [' {+ N$ O8 \! B' d1 J
51     while (round--) {    /* basic cycle start */ & ]* Z! n+ e( ]6 U" X" Q+ A
52         sum += delta; + m8 I( ~7 W7 x  Z
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - |8 k, e0 u7 c; i& C
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); , F( L* N) g* y1 K  @( {5 v
55     }    /* end cycle */ / x7 j8 }5 U4 B
56     out[0] = ntoh(y);
2 {$ K) B& L) |  @7 a( M5 k; R57     out[1] = ntoh(z);
" e' I, x2 R& \: l58 }
6 E. z2 q8 W5 ~! M9 i59  
  U# X; _1 c5 P& e& g1 o60 void TEA::decrypt(const ulong *in, ulong *out) { . @) h! S% s. K, u  R1 @8 o
61  
. }& A) B) Q9 T( l* z! A* v62     ulong *k = (ulong*)_key;
7 |) U) k: q$ i' l' l63     register ulong y = ntoh(in[0]); ) F! E9 s# P% N+ G+ H7 O& P
64     register ulong z = ntoh(in[1]);
/ {1 u8 r3 ]* v0 S65     register ulong a = ntoh(k[0]); : U$ @* u/ R- v7 L) F5 w
66     register ulong b = ntoh(k[1]);
( [8 f" i7 T+ d2 J& O7 J, d1 o67     register ulong c = ntoh(k[2]);
, {# ?7 q" V+ U0 o% i68     register ulong d = ntoh(k[3]);
% a8 U1 m8 E: P7 C3 Q+ w69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
/ r  Y4 `1 n5 l; W/ p: Y70     register int round = _round; / v4 Z# F6 r5 _# R3 R: M, q% O5 |$ h
71     register ulong sum = 0; 7 C, {! S% \$ D8 i7 H% c
72  
+ K4 {$ H* B# w9 Y7 P$ b73     if (round == 32) & k5 Z8 h. }7 ?) z# b! p/ J
74         sum = 0xC6EF3720; /* delta << 5*/ / K4 H1 S( p# b  Z
75     else if (round == 16)
6 l) @$ x4 N- l7 F/ Z3 e2 q76         sum = 0xE3779B90; /* delta << 4*/ / B3 ^7 G* K" G8 d; }# M' h8 ]5 j
77     else
0 z' q1 |' P3 n6 R) v: L& h* h- h78         sum = delta << static_cast<int>(logbase(2, round));
6 X5 E9 H% c2 x6 P79  " j9 s* J5 F- H; Y+ A
80     while (round--) {    /* basic cycle start */ - Z# s; v  y5 D  h+ i3 v# p
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ P- B! l- p* }4 ]( k5 H82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
5 Y3 n1 x5 |$ V8 }9 z" W/ X) K83         sum -= delta;
4 x2 y0 B3 u! P8 a/ U( i4 D84     }    /* end cycle */
# W( C; C, n( w! s! c85     out[0] = ntoh(y); , r1 [5 K: P, R8 j, M
86     out[1] = ntoh(z);
/ z' \" M; `. Y7 j0 t$ i87 }
4 g2 n1 s9 i# K4 O7 w4 r& z1 _
1 U$ z! N# ?0 r6 R) p+ Z需要说明的是TEA的构造函数: % P0 d/ T7 {6 W6 G
TEA(const byte *key, int round = 32, bool isNetByte = false); 7 |# ?, E8 {. M# I  I  D) F
1.key - 加密或解密用的128-bit(16byte)密钥。 3 b( b5 s- Z2 R  o
2.round - 加密或解密的轮数,常用的有64,32,16。 - L. l6 S, X; E- L9 w; J2 l
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
! Z7 b) u" p8 s  {7 M
$ K4 o& i2 _# h) M" H4 x6 Z# @% h最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 2 ?# Y" X" A$ c6 A; ]  y0 S( ?
2 #include "util.h"
1 Y+ }  o0 @$ t1 @, _2 n 3 #include <iostream>
9 J) Q) x$ B3 e5 z4 D% ^/ A7 Z 4  4 x  u5 R: Z  |1 p2 x4 M% O+ o- z6 x
5 using namespace std;
7 r! h' P! G2 |- U- M# A 6  9 b: N. e5 @3 _$ {
7 int main() {
: F$ v7 ]4 D; \$ k4 f& ` 8  
0 j7 g, d5 {+ D' D$ i 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 8 j) @& N9 b& c( b: k* d0 z8 o/ D
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 4 T( q: e. W: o5 j! z4 [
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; & j2 p4 ^5 n0 J4 _
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; & M) h! y! `! w9 Q
13  & T* f2 P# N, ^1 |" y. S8 u, A
14     size_t size_in = hexStringToBytes(plainStr, plain); 5 R6 a6 o' x: {, j$ {2 U
15     size_t size_key = hexStringToBytes(keyStr, key); $ T4 b2 z& ]8 K% Y& e9 n7 H
16  
/ [- y. j4 g4 K% g, j/ i1 `; Q! h17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
" e. [; m& H$ P& a9 X: r& o18         return -1;
4 D  x. O0 Y1 i2 y+ A: P8 c19  
" b. t' S7 }" N* ~: m; N20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
6 V6 U- @  i! C7 n21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
8 U7 [/ ?: W8 M+ |* X22  6 l# o! {, l" r7 l% f& E
23     TEA tea(key, 16, true); , M8 @/ b4 w) q* |0 P
24     tea.encrypt(plain, crypt);
0 l6 ^& Q1 R; S# n25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
6 a& |" ?( z% ?% I+ ]. F6 d& `26  
: W0 ?5 z5 _1 l+ K3 {27     tea.decrypt(crypt, plain); , v, z  L( C" o0 w2 k3 b$ G8 M
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; $ O# a7 {8 p- u( R
29     return 0; 6 {( C* I6 X  [1 W+ i
30 }
4 C! Y/ s, C5 y- y
- u1 D" Q# S8 Y. t0 m本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx" n% d) H1 |4 E3 Q/ ~  B  `
运行结果:
4 ]' {4 c7 s  nPlain: AD DE E2 DB B3 E2 DB B3 2 u8 |  n" q. m4 J
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 9 v# U0 M4 S, q$ q8 b5 S
Crypt: 3B 3B 4D 8C 24 3A FD F2 * A8 Y7 ?( _# Q3 u; t
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-29 05:59 , Processed in 0.020616 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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