找回密码
 注册
搜索
查看: 37335|回复: 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轮):
, {$ l' Z- U1 ?1 D; n! l微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
8 x" V6 N* z( a/ k8 f, fTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 & h4 d0 ^9 ^; R- o. J$ g
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 / b9 \$ i: ^9 x9 v, }0 F6 B
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 - ~0 W% @: L4 Z, t- l( Y  z' 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. ; I! `. ^% R# f8 Z8 ^$ m# ]: x
  2. void encrypt(unsigned long *v, unsigned long *k) {
    : R- u! L, z: s3 E) ]
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    & t4 {3 n, J. W8 i% f5 `. m
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ ' u  k$ V3 K6 M# a
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 3 ^* o! ^$ K$ t, Q
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    ! {6 G% V* M* H$ Z& Y
  7.          sum += delta; * k" Q1 x) j" |; f4 ?, [  Q
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    $ J) g5 z: t+ Q4 V$ C  b
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    3 n: ~& K* J: W# @& Y2 t3 D; \
  10.      }
    : \+ Q/ _- d2 X; p5 i% M8 B% C2 l" I9 S
  11.      v[0]=y;
    % E7 |8 D+ n7 E1 ]
  12.      v[1]=z;
    ) c$ \+ I5 G) K& G
  13. }
    . m1 ~7 F0 P: C( L- f
  14.   
    7 g( N# |0 n0 `
  15. void decrypt(unsigned long *v, unsigned long *k) { 8 l& C9 O2 x, R; K+ Y
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 5 j' @, }6 g: ?, A9 [) ]) c5 z6 a" s
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    / v, V* _: U# y% {) ]
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 6 p: Y4 O# Y' i. e1 i5 Q, ]$ F4 D, u
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    - U4 y& N9 I  U) N8 l
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    8 f0 t/ o# k) T$ ~4 ?* b4 M
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 7 {3 _. Z% v4 A0 a. I5 D
  22.          sum -= delta;                                /* end cycle */
    4 a5 e% y! F6 d1 Z
  23.      }   I! V3 C; Z1 K' U+ s# ~
  24.      v[0]=y; ) T2 O* U! v/ ~
  25.      v[1]=z; % b: P( ^1 H0 ^
  26. }# Q! h; O1 l4 `: e' L3 N
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H 2 G$ l2 n4 g* o4 K8 d/ l; P9 \
#define UTIL_H 3 ~( y8 O8 O( d- f
' D% A% A% t' l5 b! N
#include <string> 6 J# A+ Q) _9 |
#include <cmath> " N' J* F0 I6 K) s4 ^# \, {, t
#include <cstdlib>
2 }4 U3 R1 N, |" Z: }7 k: j* W7 k
0 {! x1 P4 o/ y% s  Etypedef unsigned char byte;
7 @8 g' E1 J+ Y' e6 g! Ltypedef unsigned long ulong; " c/ w. C% ^/ a- n0 e7 R

* n" H9 y% t5 N9 Y1 cinline double logbase(double base, double x) {
8 N+ h9 Z( U* g' g' C    return log(x)/log(base);
% t5 W4 A9 R; X- y" K% Y0 F} 9 d- Q, B+ U  Q$ z% k

9 a5 z) w1 B) f9 J( J. m/*
! u0 C. a* n) W3 I( ?*convert int to hex char. ' k. j. P8 |$ _7 N# W* r" t
*example:10 -> 'A',15 -> 'F' & Q( y3 d& @; s/ B
*/ ' ]( L5 |. z% N5 y4 Q
char intToHexChar(int x); 8 Y) H# ~5 p( T& _  R. c
$ h) }+ F8 F" h- e- y, f; o- H4 b2 q
/*
$ S* i' i9 }, P*convert hex char to int. * Q9 h, g% w* `& @/ ^
*example:'A' -> 10,'F' -> 15 7 x. J) K/ _" `! \/ d$ ?1 @1 a
*/
7 M- A$ a( Q5 U$ a  `/ Rint hexCharToInt(char hex);
. _4 q. a0 o. A+ p# n( v) M+ b) ` 5 b+ n9 R+ Z( M' m$ f
using std::string; ! b, m/ m$ X% d6 I& \* O) E
/*
5 i; w' S9 H& l: Q*convert a byte array to hex string. , Z7 a! I! F2 K; e8 [$ u
*hex string format example:"AF B0 80 7D" 8 U2 b; M7 c' R1 B" u/ [8 v1 r1 `
*/
3 p9 B6 w9 m. v; G9 F% e- \. X% D9 Pstring bytesToHexString(const byte *in, size_t size);
8 T0 |- T: `3 `; n
7 d4 d; b. s! k+ h4 F/* & E# w. Y5 }0 a8 R- L
*convert a hex string to a byte array.
2 D$ b: ~6 t; l1 ?$ D% L*hex string format example:"AF B0 80 7D" & o" b0 E0 e6 R$ [1 S  B; C! j% a9 p
*/
1 v6 a0 p. n& z- }) X9 V. osize_t hexStringToBytes(const string &str, byte *out); ) W- g9 e2 m. V, F! n, x
& \& i0 a) n+ e0 l
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
3 w0 ^9 }/ X% [0 u#include <vector> % I4 J2 f2 Z, G+ }
! \' c' T( ]$ w5 ]: Q7 g8 P  g
using namespace std;
8 a# `* G" P6 T$ M: R 4 S: {7 M  r* Z% Z) }0 P
char intToHexChar(int x) { # L0 s. f" M! K: J+ ~
    static const char HEX[16] = {
! @& A& {( \% @- u" _; K2 R1 {, v8 v7 t        '0', '1', '2', '3', $ q% t! g' @+ J% {( B% O% S2 q
        '4', '5', '6', '7', 4 g( x/ X( {, L
        '8', '9', 'A', 'B', + k1 U+ G- e! j/ X  C9 o9 G2 p# X
        'C', 'D', 'E', 'F' - g7 `5 D! k7 j# n) B
    }; 2 ^1 h, ~+ g* r0 a. ?
    return HEX[x];
7 H# y0 G4 P* q. \} & P# u! q4 h% B

$ Q$ q' e# q) [3 W( ~0 \& kint hexCharToInt(char hex) { * T* `6 h0 R2 u0 {' K, a
    hex = toupper(hex);
0 S+ s) N) Y# B    if (isdigit(hex)) 6 p- _2 c% W) W) |: A: o" |' h
        return (hex - '0');
8 Y8 g5 M( G' c8 E    if (isalpha(hex)) . w" J4 @- |+ R
        return (hex - 'A' + 10);
  `1 O+ L, j; }( {7 d    return 0;
5 Q& o* \3 S& c- H5 x3 t& ?} 7 H! Q& _/ g% u2 {& H

- ?2 `( i: T0 P  D9 b6 e5 h" q" pstring bytesToHexString(const byte *in, size_t size) {
6 e7 g7 Y; m: g4 I! P    string str;
( _; m: z1 c# Y; Y; N5 O% \    for (size_t i = 0; i < size; ++i) { ! z# J. G) K+ b& a# v* ~
        int t = in[i]; 0 u. T/ \4 l1 Q/ O" E4 w
        int a = t / 16; . E2 s$ o& u, H! m$ k% T6 Y
        int b = t % 16; & w! h% t3 e  y0 r4 O
        str.append(1, intToHexChar(a)); 5 r% x9 v" E& [: g* e. v
        str.append(1, intToHexChar(b));
! T, D0 g/ D  l; E( `        if (i != size - 1)
0 Z  o5 F1 {9 u) L            str.append(1, ' ');
) }- _( a, @- Z+ j  H4 P    }
! o; r) j0 V) T- e9 ^    return str; ( w' \# z: P- V6 t  a* V
}
  G8 C: N" S* {$ R) F0 X7 F# W # X8 H% x' z- T' ]4 j+ \3 n% c
size_t hexStringToBytes(const string &str, byte *out) {
. k( y% G! g  z. a% C3 I/ c5 `
5 c  p. S; p1 U+ K    vector<string> vec;
; ~( X) S3 K/ g0 ?4 u2 k) }$ P    string::size_type currPos = 0, prevPos = 0;
" s, K  l$ L! h    while ((currPos = str.find(' ', prevPos)) != string::npos) { 5 o6 ?2 z6 U6 z6 d8 r7 {/ v# ^' r; T
        string b(str.substr(prevPos, currPos - prevPos)); / o2 M* K! F) F/ D* U2 M! n* ^
        vec.push_back(b); ( G' z9 j& S' K0 ^0 b% c& ^
        prevPos = currPos + 1;
3 r0 x7 R2 ~2 D- U) L6 _" L    }   k  ^" E7 }; y$ P1 V
    if (prevPos < str.size()) { ) T  H+ X, Z1 O2 P
        string b(str.substr(prevPos));
! e+ f2 S4 i! v" `$ h        vec.push_back(b);
" p' `4 T# I! N3 I- \( N    } ' e. d7 {  \5 N8 L9 f
    typedef vector<string>::size_type sz_type;
4 x' a( z" i$ r0 G7 m    sz_type size = vec.size(); 3 r! s$ W7 `& h
    for (sz_type i = 0; i < size; ++i) { ' ~. @" j' l  s! E3 C% Q0 A
        int a = hexCharToInt(vec[i][0]); # Z3 Z' k; e& P$ d" k6 S- K1 ~
        int b = hexCharToInt(vec[i][1]); 4 @' f, r3 i& G! ]7 [
        out[i] = a * 16 + b; 5 Q( Q6 P8 H* L' Y  Q1 R( y0 Y: h
    }
5 A- o/ @0 _6 E4 v" V" N" i    return size; 9 t: a" h: b9 E
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ' C# _+ N. g! U' _7 w/ `7 g1 z& a+ \
#define TEA_H * o5 d7 |" w' u+ h/ K) t- C

! i9 d4 C, `  g$ E, _+ U/*
- m( p. p% Z/ t2 U. g$ ?/ X4 i*for htonl,htonl 3 O4 r2 G& ~4 |( z0 f1 N
*do remember link "ws2_32.lib" 3 N! e- I- S$ z* ?; U1 n, k9 y) B
*/
0 H. B$ @$ u  V6 f#include <winsock2.h> ( w+ z4 X5 N! \! b) }4 v2 S
#include "util.h"
$ ?4 U6 p7 F. M + V( b! `5 n7 E! h9 J
class TEA {
$ z1 J4 ?& W# mpublic:
6 F; F! y, x6 N, R, j3 W$ o7 }5 Z    TEA(const byte *key, int round = 32, bool isNetByte = false); 1 \$ A& d6 h$ T( a
    TEA(const TEA &rhs); % N" c- Y3 x$ O( e" Z' ~
    TEA& operator=(const TEA &rhs);
9 K5 N5 U( l/ i1 q5 Y    void encrypt(const byte *in, byte *out); : V: q2 ?  U$ M
    void decrypt(const byte *in, byte *out); & [7 `4 I2 _; B/ q; q. H
private: ( t2 L/ a. Z/ y. k
    void encrypt(const ulong *in, ulong *out);
! d8 x; A& V5 ?; e$ d" A# `8 f    void decrypt(const ulong *in, ulong *out); 1 |  ^2 r% C* o) d
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } # |9 W9 Z( [  E. V; z4 f0 l4 b
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } / J! P- B/ p9 |" N5 f
private: % ~3 c3 I) F7 h* A0 o, N
    int _round; //iteration round to encrypt or decrypt
( s9 a" t3 l: `% z& I9 _6 {- G* X    bool _isNetByte; //whether input bytes come from network
% R* N) a: X5 {    byte _key[16]; //encrypt or decrypt key 0 I0 C. h# |# k* O3 Y  {/ \! m! O
}; ! k. x( k9 ?3 }2 a( E' y

. [) W1 x2 n+ W4 ]#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" # _! U0 U9 D$ e4 F% X! N
2 #include <cstring> //for memcpy,memset 7 T( N2 N9 C+ Q. |. c" z
3  
: c1 C1 l8 M9 Q# v& ]& [8 A7 {: m+ A! |) h% _ 4 using namespace std; 5 }( b6 W3 }8 E5 Y4 V' t# ]
5  , x5 \' C6 B4 Y
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) , h/ C5 ^) v/ E! f
7 :_round(round) ' Z4 r# t' Q& ^& Y7 F
8 ,_isNetByte(isNetByte) {
' o0 [8 l1 P; T7 D1 d 9     if (key != 0) 2 @6 X) Y" K( c+ l0 u& ^" Z/ ?) h
10         memcpy(_key, key, 16);
) X6 F* U. A% e0 Y11     else ; t8 w; l1 @* \- r8 |
12         memset(_key, 0, 16);
3 {2 _; C8 f( s+ k5 ?13 }
/ [# t- A$ L: k+ r4 S14  
3 o' b" X# L- H9 v  t15 TEA::TEA(const TEA &rhs) ( A( x; E6 P: S' }3 T
16 :_round(rhs._round)
1 Q; j* R+ H5 M' K1 w% h17 ,_isNetByte(rhs._isNetByte) { 8 C) g1 D" @- r/ {, q9 l$ X
18     memcpy(_key, rhs._key, 16);
3 \4 d* T: d1 @. m/ p5 W8 J" Y19 } : P9 U, ^, z& c8 r$ |2 M
20  4 a" x, R+ m( P0 D- Q% N, S
21 TEA& TEA::operator=(const TEA &rhs) {
; B5 u4 J. y3 l; q; e' X% y' H* d22     if (&rhs != this) {   g) a  O) h2 p* V, y
23         _round = rhs._round; 7 d5 E1 C% s, \
24         _isNetByte = rhs._isNetByte;
  w( L: ^$ a; `. n0 s25         memcpy(_key, rhs._key, 16);
- c, ]$ V5 f  U, [- C26     }
+ H3 ]' j( t9 ^27     return *this;
) W& y% _6 f: O28 } 3 k: q; Y  u* t, V. ]: K) s
29  
1 |  I& w+ Z/ ]" |+ x0 Q30 void TEA::encrypt(const byte *in, byte *out) {
* Z# c* Q( V2 a! H31     encrypt((const ulong*)in, (ulong*)out); 4 |2 I0 P0 \$ x- @9 w, r2 ~1 E
32 }
$ G2 L% A1 r/ Q+ P/ _33  1 Z( V9 u6 R# D1 W9 _6 `
34 void TEA::decrypt(const byte *in, byte *out) {
! v2 r5 U, `' M35     decrypt((const ulong*)in, (ulong*)out); 3 O0 A: s# @  N6 Y* B
36 }
( |9 \8 |  \; S37  ! U4 Q5 T# a" }3 k
38 void TEA::encrypt(const ulong *in, ulong *out) {
/ ~* @. H; w4 O4 |5 L) I# e% M39  
  P" p8 q! x+ j6 B$ J/ |7 A4 ?40     ulong *k = (ulong*)_key; ' Z! s% E: l4 M
41     register ulong y = ntoh(in[0]);
4 b" T0 [0 t8 r2 q: p- j3 m# u& R0 h42     register ulong z = ntoh(in[1]); 6 z; F2 p4 ]; Q" u6 J. n$ y
43     register ulong a = ntoh(k[0]); ' ]  j7 Y, d# A) h* Y5 _4 Q
44     register ulong b = ntoh(k[1]); : K$ L, n2 U: z  t8 O0 X
45     register ulong c = ntoh(k[2]);
! o1 R" L# y3 x46     register ulong d = ntoh(k[3]); 2 s! D0 w9 D8 `
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
' |; b; |2 m: |: r) P. O48     register int round = _round; 5 D9 B! N5 p1 o+ D9 K2 s; P
49     register ulong sum = 0; ( m  I" y# y* ]" _4 L. n
50  3 e1 z- t: U4 Q- i7 G1 U
51     while (round--) {    /* basic cycle start */
0 H7 x! c+ q* W$ V7 u. U52         sum += delta;
# M4 \4 |) R; T9 }. a53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - q6 H/ v6 ]) n" ?5 {
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 2 y, U+ Z; q. z7 |
55     }    /* end cycle */
' {1 _9 P7 X8 }+ Y& a5 W56     out[0] = ntoh(y);
( v0 Q; q; I5 o( T/ {+ M0 w8 l57     out[1] = ntoh(z);
! c8 G" V  Q# O" Q  F3 n58 } 1 l1 w' h; {( G  K/ J& {. K: ^+ H- g
59  
2 ^6 O- q- Q$ w# A: y# B; R; |60 void TEA::decrypt(const ulong *in, ulong *out) { 2 C: n6 H, ^* N5 ^' S
61  . U* X* e2 o1 C6 X. N2 G* {- a( c
62     ulong *k = (ulong*)_key;
* |+ |3 O3 G0 s7 S( h* @7 ~63     register ulong y = ntoh(in[0]);
* K7 R5 N: e  [  }; I6 G7 T64     register ulong z = ntoh(in[1]);
6 e" F" S- M1 d9 X9 Q65     register ulong a = ntoh(k[0]);
# J8 c8 L. h; H" D0 _1 b66     register ulong b = ntoh(k[1]); $ `/ a" ~# u  B9 [4 V1 o
67     register ulong c = ntoh(k[2]); : _' m( H% I% j6 H% t% x
68     register ulong d = ntoh(k[3]);
$ R3 ^" \& v+ s8 @& |! L. G3 X4 U69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
: Q; m" Q# s2 a/ A70     register int round = _round; 6 L8 D2 \# n2 ~
71     register ulong sum = 0;
6 A6 B- s# \' a% s) F72  $ ~- E" m. c& [$ ^& A/ T
73     if (round == 32)
' N1 h+ `; t7 W7 y- [74         sum = 0xC6EF3720; /* delta << 5*/
& J9 Y* g; p, s* M75     else if (round == 16)
0 r" F9 Q5 U5 |5 h  |: k% d" L76         sum = 0xE3779B90; /* delta << 4*/
2 t0 l( [' J/ @9 @5 }/ d77     else
0 z3 q' g( u1 v  C! O% a78         sum = delta << static_cast<int>(logbase(2, round)); 1 P' w, j, k# q7 y! b( \+ t0 z! {
79  ' q6 G" ^4 i# t$ m+ Q
80     while (round--) {    /* basic cycle start */ : \& e5 d: }  R7 ~3 p* g% ?
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 7 ~+ `3 c! w+ K7 l; o3 b8 H$ [
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); / @) t  D7 T8 i# t1 N; l- }$ x7 ]
83         sum -= delta; # h# Y% r$ g  D/ Y7 i
84     }    /* end cycle */
$ W# }) h4 R8 Y! ~- Y85     out[0] = ntoh(y); ; w- b) l7 j# `, l  B! ~
86     out[1] = ntoh(z); 3 j# T' L% ?( ^" F* j; o
87 }: S6 z% x0 C* o( n0 X6 p/ o

7 @9 c$ Q3 w( f需要说明的是TEA的构造函数:
. P8 y5 `* V9 \5 OTEA(const byte *key, int round = 32, bool isNetByte = false);
1 t9 |( _6 U3 ]" j1.key - 加密或解密用的128-bit(16byte)密钥。 * D9 C: X, E* v; ~' b' o: h+ D( ^, H
2.round - 加密或解密的轮数,常用的有64,32,16。
1 _: |* }2 P0 _5 G8 l) S( j. F3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
/ n, G: x5 P) }8 E; [& C
4 L$ G' q# g& C  M! @/ j最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 5 a' v0 E, Y& p3 k
2 #include "util.h"
0 {' }) O* y& J7 x+ F& C 3 #include <iostream>
5 S+ R" M  h1 Z( f 4  % P/ B* `& C. l7 F, @) q4 Y
5 using namespace std;
8 R; \, e4 T% v. C: K, V9 e  N4 ~ 6  
" D% Z  c; A, ^, j, t 7 int main() { 7 i* R! K4 U7 a! ~% f! n% f3 V
8  0 l: [* F$ U2 O5 R
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
! k; H& {- F/ x/ W3 P10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
* }& p3 I1 L  s% H  v6 Y# u5 f$ A11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; , }6 }  g4 S) w  u
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 5 K; z2 U% y  n9 L- P) ~
13  % F; ]; W5 |$ v, R/ v, w. `' ^
14     size_t size_in = hexStringToBytes(plainStr, plain);
' B* A# W. E( P3 A15     size_t size_key = hexStringToBytes(keyStr, key); ) K" u4 P7 [& N0 B
16  4 h" U' u: d3 j& f' [. d( D
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)   @- M. F8 l+ W
18         return -1; % y8 L1 \" F3 f. r
19  5 s( P. t9 E  u! N
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
9 n- n+ y7 N& y4 l+ M( ]" F21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ( Q" |; C1 C0 {( N: C) q
22  
" V6 u8 g2 n( |2 v23     TEA tea(key, 16, true);   N8 B/ N  G( ^0 b, `) S: }
24     tea.encrypt(plain, crypt); ; l  R5 }3 H# V! m+ [
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 6 s" h& z2 G  I3 S% O
26  
4 F$ `0 I+ J( Z* w1 \) z2 t27     tea.decrypt(crypt, plain); . v0 j+ P& v4 t3 O9 Z
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
( E5 L! X+ C) \+ c29     return 0;
6 {0 @8 A$ t, i7 N9 T30 }
* P& l: \5 t4 t9 Z* b' F" G7 M1 J
. }/ y  P+ b* |* d0 l6 q6 Q1 g本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx* Q5 T; z5 _  @. L: L
运行结果:
. W4 j$ ?2 e  NPlain: AD DE E2 DB B3 E2 DB B3
3 G$ j% c# G! ]0 D) z+ W; Z- \Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 + D" p" [' T  A' q) a9 e
Crypt: 3B 3B 4D 8C 24 3A FD F2 # o: e% @% y1 C: W/ ~% w& }
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 10:45 , Processed in 0.020881 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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