找回密码
 注册
搜索
查看: 37804|回复: 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轮):/ t5 H3 ]9 `6 B% ]/ C* T
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 + M( a4 ]: U9 t2 u. f5 M6 m
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 % ?# n/ P! w* h) \
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 ) {' z( ]! e3 M: f: e6 _- n
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 ) _9 e/ h( _; J2 E" i
在 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. 3 f& `# V% Z3 h6 |1 Z- E$ F0 C
  2. void encrypt(unsigned long *v, unsigned long *k) { ' N3 N* G' u0 {: C  C/ [7 a
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 6 Y2 g. U; P3 r$ s. I- x
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    5 L' V, l5 `) V3 r$ t6 A
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 6 L; U. H& N. ?/ M  l& F- W! q
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 1 M# F0 \* a* v- A; W1 S- L& b
  7.          sum += delta;
    * b( K, J' F& }& v7 F5 _* r- }
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    " Z. j  @# s# P! u2 v
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    2 v2 E# s  o( o: ~* K6 i/ b( _
  10.      } 2 K0 D4 m0 M5 |# \; f
  11.      v[0]=y;
    & A/ z, K0 B5 z0 B  H2 a; a
  12.      v[1]=z;
    % ]0 z, _9 R# L% i$ B' M
  13. } % s3 P, O% v0 w+ C/ T3 g
  14.   ' a9 l% E( g+ [: |! {# {. x
  15. void decrypt(unsigned long *v, unsigned long *k) {
    9 [: ?  h# K, I4 ?# T
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ - o, N) g0 P4 ?: c5 d: ]
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ / U. _" g, ]5 T
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ + C# x8 k. ]3 n' t# x+ J2 s, X
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 3 T: I: m; |9 B# `; m( c% N. n
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    2 I$ c- f& {1 N2 Q9 v+ _
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    6 U# _: {* J9 Z
  22.          sum -= delta;                                /* end cycle */ & E2 X; e% m1 f+ h/ b
  23.      }
    / y9 [) R* u$ F( ]# U
  24.      v[0]=y;
    * T' t) X8 v1 Y! x
  25.      v[1]=z;
    3 b! G6 ^7 Y2 Q  I: L1 |% l
  26. }
    + q% K" X5 [3 b
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
. g; h3 c: g( F7 q#define UTIL_H
0 G0 p; @! a- U; k' V( {' j# V
& y, n: B$ w. }6 u7 r0 ]#include <string> 7 w# g6 g9 U# a/ q1 P
#include <cmath> * A5 n: U* r( b, Y- z
#include <cstdlib>
, {1 D9 ?! |. r' }7 W! n) P& a, \
% y9 q& k3 f6 E3 M' ttypedef unsigned char byte; * y0 P5 l" ?4 f+ _/ M+ K" V1 V
typedef unsigned long ulong;
, A+ T+ u, w7 S1 ]( {. N% K 6 B1 x. Y2 S- T0 ^$ P1 i  S$ d
inline double logbase(double base, double x) { % N- c& ?$ V, k3 d* |9 D
    return log(x)/log(base); ) m6 c: x  x+ w$ b9 P; t7 u* G; a4 I
} $ \& s0 C5 k+ L+ k- b# y7 y# w

/ y" R9 U; @% y( G1 _/ n/*
+ N. ^( C2 x) C9 y# q/ t*convert int to hex char.
. A3 i& }: K/ {& \*example:10 -> 'A',15 -> 'F' , n. X. Y! C5 f# v3 P
*/
! R3 B% L& |8 t! mchar intToHexChar(int x); ) K5 e; `! v1 {7 U- y
1 O2 c/ H9 V, J6 z: J1 l' p+ {2 J$ e: h
/* ' I; {4 U" S; `1 U+ @2 l
*convert hex char to int.
# A" L9 G3 }1 J*example:'A' -> 10,'F' -> 15 " M- Z# i9 H) k
*/ 7 {$ ]/ e+ S7 W' W6 [
int hexCharToInt(char hex); 1 M/ V+ x; z1 D/ K  m

# ]& `. L3 z% x/ m( Pusing std::string; 4 s4 ]5 V' _& u$ _. r
/*
; z. C  |3 q6 J0 ?6 |) w! a*convert a byte array to hex string.
' N7 j6 _: v% P; }' A*hex string format example:"AF B0 80 7D"
) J' X, w' }' ^0 T*/
* g* l1 h3 E* J8 }& C" S# ostring bytesToHexString(const byte *in, size_t size); : i2 c7 f( U, L6 S$ |
" `: U6 n$ Y  ^7 I+ I
/*
1 x' |: D, V3 `8 S( Z; m  s6 M*convert a hex string to a byte array.
  c; c. A) z. R  N1 a2 o, I*hex string format example:"AF B0 80 7D" & X* G& W7 W, Y! s7 [, j% U) p6 X
*/   x6 w: R7 U! J8 ~, O, r
size_t hexStringToBytes(const string &str, byte *out); , Z: @7 \/ K1 _; z
3 Z1 D3 c3 `7 N  Q+ Z
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" $ v6 Z, ~3 B3 W0 z
#include <vector> 0 O" D9 q& ?8 l: ~, ~4 q/ m

7 ]8 P) K: t% w$ Busing namespace std;
% {1 K4 P& p$ }" n* S; W& y
- k+ B( n5 N- t+ Z6 Mchar intToHexChar(int x) { $ @) |( L( y" L2 P
    static const char HEX[16] = {
7 P! ]- ^, d  f$ L" ]        '0', '1', '2', '3', + ~! h- ?/ t5 g4 c8 }+ z
        '4', '5', '6', '7', ' _% M1 }3 q( _4 }: Q; n& `
        '8', '9', 'A', 'B',
" x% {6 d7 \/ q4 O/ n        'C', 'D', 'E', 'F' - [6 ^. t2 t0 m0 a% w
    };
2 U) l, F+ ~: Q' A( I3 N4 l" C. I+ E    return HEX[x];
7 {" F7 b$ |3 `' B" T8 O} - b3 R9 f/ n) s' n) J* k

* B* u/ U% \% N7 a+ w8 Vint hexCharToInt(char hex) {
1 l1 f2 f9 S) O    hex = toupper(hex);
8 c  S( l) A9 w, }8 `    if (isdigit(hex))
. x: B/ P6 u. {4 F) V4 d        return (hex - '0');
, ~0 I. B9 j9 X- C    if (isalpha(hex)) 8 @# C, F, {1 y' a  ]0 b# p" t' l
        return (hex - 'A' + 10); - R' y8 U0 G' \3 R. _$ d; `" q  u" Y
    return 0; , z" K& R7 J, S$ K: p
} ) ?+ M0 o+ K, U) t- p0 v7 r
2 O# ]! N0 Y7 J* N7 [8 k5 U
string bytesToHexString(const byte *in, size_t size) { ( S; Z* T# P1 {. b2 j
    string str;
( T9 ]) m( u: o) |; k7 l6 K    for (size_t i = 0; i < size; ++i) {
7 O1 r8 \1 n1 j) m; s/ D# b        int t = in[i]; - [% ]5 O& p7 \1 p
        int a = t / 16;
- {8 }( {) [/ S3 ]5 v        int b = t % 16;
, u8 w  ]/ F3 b2 I+ f. H4 U        str.append(1, intToHexChar(a)); $ J5 h6 A8 ~! Q
        str.append(1, intToHexChar(b)); $ m5 a* F" \: l; j8 V, m& i
        if (i != size - 1)
* D5 U7 u$ a+ N4 U" J, i; J7 Z            str.append(1, ' ');
8 ]/ `+ L) m2 g" T    } / ?. O; P$ x2 r1 ], Z1 b) v
    return str;
  H+ q1 h2 Z; O9 r. f1 t( J}
% n; x& K9 u  m! i & p" K7 r! \6 F
size_t hexStringToBytes(const string &str, byte *out) {
( e$ P" V  w0 S/ \% X% |7 m2 |6 X
6 \) f6 u5 B9 j7 A5 B/ x    vector<string> vec;
" y6 J/ G4 P) g" Y& t" F6 g    string::size_type currPos = 0, prevPos = 0; + Y; H& U$ g* j0 Q9 I
    while ((currPos = str.find(' ', prevPos)) != string::npos) { 3 p- E0 S2 F- B4 l( _
        string b(str.substr(prevPos, currPos - prevPos));
% v1 m. y( w5 l6 ]# `+ _! D& f        vec.push_back(b); + Y2 D6 c. H7 I& j9 X5 A; V
        prevPos = currPos + 1;
) o3 y2 j: {* n: H- t: r5 w    } % n  W  h0 l2 O+ G& C( A, V
    if (prevPos < str.size()) {
: f- l, b5 w  {; ]0 u        string b(str.substr(prevPos));
! |& m8 }* o/ B- U3 {. Y        vec.push_back(b);
3 M" e2 C0 w! c    } 5 L2 c( f0 v- j6 t' I2 d% V: B
    typedef vector<string>::size_type sz_type; ' S# ]' x' S0 O2 v' B
    sz_type size = vec.size(); $ l4 m# J- `; H5 }* k6 O
    for (sz_type i = 0; i < size; ++i) { 5 x1 Z+ q3 t# B4 h
        int a = hexCharToInt(vec[i][0]);
# M' z/ u( v1 q" B9 T& G& a        int b = hexCharToInt(vec[i][1]); 2 M5 W: P1 r9 p5 E. h7 _8 f2 T7 |
        out[i] = a * 16 + b;
0 J1 z, r; c8 U6 O4 N; U3 w, d    } ' I% q7 H! s/ Y# q
    return size;
- ?! e1 e( f: m' r/ O: w}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
0 M! m) U3 H" {, F" X9 t+ {9 ~; W9 a#define TEA_H 2 i4 l; Q. ], G$ @" L  L0 Q; M

$ }( F/ z: f" ]/* $ g8 p: a6 C: y) Y, L) R, J; h9 e
*for htonl,htonl 9 g5 |9 w! ?$ P; U1 O
*do remember link "ws2_32.lib" 1 B9 d2 y# `5 d* c6 q; H
*/
1 t0 j3 r2 z# ^#include <winsock2.h>
1 h/ D* G$ `0 ?5 \7 a4 w4 t#include "util.h"
8 Q1 d  a$ B7 ^- q6 [4 u1 D3 \ ) b9 Q& a8 }1 v2 o6 r  u% x! J; U
class TEA { ) |- b5 ]1 W4 n# y! y  z
public:
4 R/ B' c$ }7 v9 [7 u0 L    TEA(const byte *key, int round = 32, bool isNetByte = false); ) a5 z" i% {& d% f, c
    TEA(const TEA &rhs);
8 z4 w2 z- U% T    TEA& operator=(const TEA &rhs); 5 T, B- x, U1 T( D. N3 L1 P( K- |! H
    void encrypt(const byte *in, byte *out); + d  ^1 c% G: O( O
    void decrypt(const byte *in, byte *out); ) K& q0 x& ^$ ~- L/ V
private: ; X0 r/ d9 D1 {, h0 d. J
    void encrypt(const ulong *in, ulong *out);
6 T6 e2 Y3 g( a) H% A    void decrypt(const ulong *in, ulong *out); ( A$ ^5 M$ z7 z  v* i3 j" i" w. e
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
$ C4 \7 L. O* N# A" r9 w    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } & H$ D$ R% d6 |& e
private: % t2 n* ?; l- s5 c' s
    int _round; //iteration round to encrypt or decrypt
* n1 L! \) S6 y# S. @0 ~7 g; d. q    bool _isNetByte; //whether input bytes come from network 8 `/ a" v: S5 d- V/ [* ~. O
    byte _key[16]; //encrypt or decrypt key
  j6 E# Z3 t8 b5 W% u/ d4 h8 l}; # d7 g" r2 p' M0 [- I
8 h9 x$ f4 E9 k9 u+ m
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ) U/ ^; }& }+ ^
2 #include <cstring> //for memcpy,memset
# F4 T% n: E" a, G0 t, Y 3  
& T. D9 g& _+ D8 a 4 using namespace std; 6 J6 D: Z0 w6 w9 F6 F4 D
5  & E: `' W# t' q% |( Y% Z$ ^
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 5 n+ A: i( {! _) j0 ^& v, H
7 :_round(round) 6 O% ?; R+ ^8 D9 b
8 ,_isNetByte(isNetByte) {
; V8 |' [0 x& N; [$ {0 W 9     if (key != 0) / P* U# m  q) t! P3 l' ~* m
10         memcpy(_key, key, 16); / q) b  ~( X' X
11     else 6 K2 e/ m9 J* i1 o- w/ I: P
12         memset(_key, 0, 16);
  h- ~+ `# M5 _" m13 }
) Y3 {! j% I2 h3 R/ U14  
& n; |# M% h7 e7 F0 |: H  ?4 t15 TEA::TEA(const TEA &rhs)
" I  i$ q9 g) y' Q- ]16 :_round(rhs._round)
1 h. U& H* Y! b+ d17 ,_isNetByte(rhs._isNetByte) { ' K" M1 A: F1 ^
18     memcpy(_key, rhs._key, 16); - r: |+ z& j# N4 T
19 } 9 u" h3 Z' x* i' Y. i! Z' B. ?! f4 V
20  1 K8 w2 l" k" e) h+ ~8 m
21 TEA& TEA::operator=(const TEA &rhs) { * t0 N6 c' n3 B) N) z; K2 v6 T
22     if (&rhs != this) {
5 |/ T  R6 s  Y5 ?# `) H23         _round = rhs._round;
9 l! s7 z# L9 D8 Z& O& S1 u24         _isNetByte = rhs._isNetByte; ( e( x! y2 H' D7 r  @* o
25         memcpy(_key, rhs._key, 16);
+ b2 l3 @$ ~. s26     }
; m. P$ t3 P- z27     return *this;
1 r& T8 r+ w' J/ I1 f+ D3 E$ V- z+ y28 } - K; ?" `" F: t: u
29  ' _# ?8 L+ m9 L  ?, ?7 c3 |
30 void TEA::encrypt(const byte *in, byte *out) {
- J* }: V& N1 `' Z" t6 W31     encrypt((const ulong*)in, (ulong*)out); ( k7 }- |! ^  Y  k/ T4 P
32 } $ F$ X, q7 |' K
33  
% A( I+ ~! g, _, h. u34 void TEA::decrypt(const byte *in, byte *out) { + k; ~. T0 f, @3 A+ N- K
35     decrypt((const ulong*)in, (ulong*)out);
8 x# i' ~5 ?+ X  {7 E9 ?36 }
% R+ A. o% x! n* w7 L" A37  
6 E+ \9 m3 q! S5 m' S: {6 y+ B38 void TEA::encrypt(const ulong *in, ulong *out) {
' @; }2 z2 L) G8 _39  ( o( m+ m" w& z
40     ulong *k = (ulong*)_key;
- D+ G" Y2 R( U3 b41     register ulong y = ntoh(in[0]);
9 d$ s  {) ?7 n" C% p; k42     register ulong z = ntoh(in[1]);
: r" m* J/ V7 C6 Z7 ?43     register ulong a = ntoh(k[0]);
7 G3 y" I# p- Y% M; ]7 B# u44     register ulong b = ntoh(k[1]);
4 n; B% _0 h$ H45     register ulong c = ntoh(k[2]); : ^8 B! n! e+ Z" y, O
46     register ulong d = ntoh(k[3]);
' P6 C! M% J- ]. a47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 1 ?7 S& r) E% a
48     register int round = _round;
: X1 F+ b  |" j49     register ulong sum = 0; $ s3 d1 \/ z4 ~: V! l/ B
50  
! e" x. X! K0 J8 t, u( W1 m51     while (round--) {    /* basic cycle start */ 7 X6 w+ n" Y7 y: s( z7 V: @4 w
52         sum += delta; / X% U) W* }7 `* G
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
, m! v2 H6 a5 \; N, r1 ?54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); & b% B; {3 I$ A! W2 U$ A
55     }    /* end cycle */ ; \9 e  j) U7 F. B2 ?( H/ k3 y7 L
56     out[0] = ntoh(y); ( v$ k( c! W0 j5 K
57     out[1] = ntoh(z); / e7 b$ u; w. t6 \& s+ Z8 s/ w
58 }
! X+ ?1 X. g: U' q59  $ ~( y7 O# B, W5 c
60 void TEA::decrypt(const ulong *in, ulong *out) { 7 G+ V) h& \: C3 B" n- F
61  
0 j! p) P9 A0 z# L8 \62     ulong *k = (ulong*)_key; $ z* C2 O5 A- r: F5 O; f3 o
63     register ulong y = ntoh(in[0]);
3 X8 I3 Y9 M( h3 V# x. q" n64     register ulong z = ntoh(in[1]);
% i7 s6 D" l7 U8 d6 y65     register ulong a = ntoh(k[0]);
% E% @" M4 W& n9 |& C/ C4 B) d+ I66     register ulong b = ntoh(k[1]);
+ h4 C" r! w4 o3 G. M7 d2 k67     register ulong c = ntoh(k[2]);
( {: c9 h$ h( }68     register ulong d = ntoh(k[3]);
! T8 v% O+ A- r! Z& Q/ I$ i69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & l6 H/ v$ ]* i0 p! o& z1 T
70     register int round = _round; 4 j5 D# I  o9 _0 [
71     register ulong sum = 0; % x, w8 U0 ^; T4 A
72  
/ k* N7 q7 Z; G% K73     if (round == 32)
; v% s" ~" Q* C74         sum = 0xC6EF3720; /* delta << 5*/
9 {" h5 }3 h- o7 n* @, F8 V9 X' k75     else if (round == 16) - m. ?1 Q  k7 U* E
76         sum = 0xE3779B90; /* delta << 4*/
4 I, I, i0 C' E8 l9 |7 f4 G8 O2 z, L77     else % [6 B2 J; J! X2 d
78         sum = delta << static_cast<int>(logbase(2, round));
9 [, p# N% v( A- F" m" C79  $ P! e3 G- q8 o: R5 w0 L
80     while (round--) {    /* basic cycle start */
: g+ V* R3 ]. O2 @7 a81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);   _0 M6 o- Y  K# [
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); & K# v0 A7 u4 p) n6 @. p6 M5 g
83         sum -= delta; - Y2 e' o+ O; [% w5 I
84     }    /* end cycle */
0 r2 h: o  }; a' P85     out[0] = ntoh(y);
/ U  x) W( ?/ e0 @# r86     out[1] = ntoh(z);
' j# p+ H1 i1 b" f8 @87 }
. B' |2 d8 F  K$ w$ I: M5 F4 V3 p. {  h! a  X, v6 ^% H/ u
需要说明的是TEA的构造函数: % {# W3 p" J9 ^, H. y3 }
TEA(const byte *key, int round = 32, bool isNetByte = false); , P# B* W% B/ I( e+ Z$ B8 |
1.key - 加密或解密用的128-bit(16byte)密钥。
- L4 v& }3 v: h; r- |- y* {- j2.round - 加密或解密的轮数,常用的有64,32,16。
/ U2 J) }' F3 g7 g- L# B% E3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
, |3 N2 B1 v% Z9 n' l
1 I8 Y/ k* Z) z: ~1 O2 M: _$ r% x最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
( R8 V5 _8 P& Q/ c" T4 n% ^# _ 2 #include "util.h"
! m5 l# }: k; Z( `9 y& q8 ? 3 #include <iostream>
4 ~6 C# r- u7 ?1 W* ^; I 4  
2 _0 z( H7 k. c( r- P8 K/ w 5 using namespace std; 8 f4 D! A% _( c9 P) E0 g* m
6  
$ K0 I( e" `+ G! Y" t% f1 x; ] 7 int main() {
: W1 g& w" G3 Y- x  ^8 ^- W& R; w 8  
: u8 w( s+ }, i: A; W/ {7 k 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
4 w2 Q* s0 R; k1 m10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
! Y( Z7 c% G1 ?! T11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
* T! W+ C# C2 Z8 S6 `! T. P12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];   ]* g* ~( C  I& e
13  # ^# }& P2 d1 d! W9 A/ q
14     size_t size_in = hexStringToBytes(plainStr, plain); : L2 e" J9 M; D6 J
15     size_t size_key = hexStringToBytes(keyStr, key);
8 c4 |, n/ x1 C2 E: _8 g/ |( N16  - y: L+ b4 _% V% q, m! `* J
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
/ i" Z8 {# H7 m3 m3 |/ x3 M18         return -1; ' m% ?+ A- u3 h0 ^$ I2 f3 O3 V* c3 {
19  
: q. ^0 h4 B5 Q% T9 ?8 [# }20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
' S5 y1 |. @3 n; J8 b7 p4 M6 K% f+ N21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
7 H4 D0 _: M- w/ M' `22  
) F6 F, i( T; p23     TEA tea(key, 16, true);
8 t3 Y* q/ s; Y8 N4 I$ E. [3 r+ _24     tea.encrypt(plain, crypt); ' M# g" r* K$ r$ v2 i# G
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ! k; m/ \- {' R3 ~3 q
26  3 x: m9 A" V+ A" Q+ V2 I
27     tea.decrypt(crypt, plain); , Z0 H( Y. v: y) p7 @
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ) d5 c+ F6 ^) ]6 r+ |
29     return 0;
1 W" K$ n% f# d8 Z5 ?2 L3 b30 }
- p8 L# d8 h/ ^0 b1 N- _
3 Z. F4 V9 i  F$ |0 _* j5 S本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
. p2 s+ F, b! B9 m6 D) Z* s运行结果: 4 \0 d4 L6 X* n1 `, `6 E6 a( @
Plain: AD DE E2 DB B3 E2 DB B3
! M7 W  X1 Q7 n2 f0 M! A3 xKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 0 C4 x2 c' f1 ]
Crypt: 3B 3B 4D 8C 24 3A FD F2 ' f7 {+ [3 q$ A7 _
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-27 07:33 , Processed in 0.019360 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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