找回密码
 注册
搜索
查看: 37386|回复: 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轮):, Y5 }1 f5 u$ M4 q9 y: x! o
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 . r: A2 W$ f( l  B% Y( y
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 # g3 V% l2 [3 e; t8 K8 f
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 2 I+ d% y: I4 X& {- s
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
% b% s' u+ s2 G7 b$ ]: E1 M在 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. 2 `1 }$ D8 F0 N, S7 g2 |" e' |
  2. void encrypt(unsigned long *v, unsigned long *k) {
    - B# t" B! }2 {9 ]: `- Y6 |
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    5 t+ K9 J& r7 s0 o
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    3 t# J" D2 q7 a2 F$ V2 m
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    1 Z) Q/ u/ D7 Q2 ~3 ^+ m
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ ! c, T2 y4 K# H
  7.          sum += delta; + h. g" e2 ?: Y+ F" C/ C" L
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ) E: t% E5 V4 h! V. |
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ ( l) F" X( ^- K! M" N+ B% V# X7 u
  10.      }
    . b: y+ P6 q) N% I+ n
  11.      v[0]=y;
    ! w2 W* D5 J; @
  12.      v[1]=z;
    8 K" H; X+ T5 h* S, a
  13. } 1 S5 u8 D) [& d0 x
  14.   
    / ]1 y: W2 B% H5 h5 [  o! M6 L* c
  15. void decrypt(unsigned long *v, unsigned long *k) {
    : o6 }# f6 ]7 t# {" |0 E
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    2 w6 O, n. F$ m3 K
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 9 e( i4 T$ \/ R
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ 2 E  E' ~7 K0 X8 S5 p" I
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    ! V8 s- |- a) j) m3 ^% c
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); ( |0 f5 w1 J8 ^9 {1 ~7 {
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); : O1 }( C' x( W- F7 V
  22.          sum -= delta;                                /* end cycle */
    # r- z$ S+ u% O2 g0 @
  23.      }
    $ n9 K  V: A! ^' W
  24.      v[0]=y;
    8 C4 V5 h! B# Z8 p
  25.      v[1]=z; 4 u$ v( Q1 T1 ?% D6 G* Q& J
  26. }+ d& k& T% s' k9 A7 ?' o5 }
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
0 p( s+ d, c- ]' c5 H* T( j0 X#define UTIL_H
; i3 @# M! V* g" W1 @! F* U8 t" K5 J- j) X2 Q
#include <string>
, W- d* V9 F' o) g1 f#include <cmath> ! t* P, h1 {3 F& @6 {
#include <cstdlib>
( s3 ^1 _" E$ b1 _  a: U
8 N3 ^3 ]( V/ r3 o" Ttypedef unsigned char byte; ; y$ \- s+ a* n4 U. X9 M& P& N
typedef unsigned long ulong;
" W/ b5 e, Y! U$ ?% J 7 i8 f: A2 T4 H( t4 k+ y
inline double logbase(double base, double x) {
7 v& U: V! F$ w7 D. K5 \    return log(x)/log(base); . N6 ^* J0 {7 G3 S: {6 B
}
$ O$ W# ^( N! t) m; ]
, ^& J6 y" _/ l/*
3 ~) O9 a# x# w) n* _7 [+ K% K) ^*convert int to hex char.
* X% w5 G4 W: o5 E* }*example:10 -> 'A',15 -> 'F'
8 X; n: g& x/ ]4 i, F4 q' m4 ~; \! y*/
; p5 P' _3 Q$ Q( i! h$ qchar intToHexChar(int x);
" ]8 h3 ]" |( y& z$ M) Z
  D5 `0 |+ ]: e5 }& Z3 ~! I  S- G/*
  u  ]" V7 K5 @% k*convert hex char to int.
, ^: i' x0 g. v, M5 D*example:'A' -> 10,'F' -> 15 ! N- U7 f# |- g3 u
*/ 5 H2 s) C" ~' q/ g6 `" g& \8 H0 F5 \
int hexCharToInt(char hex);
' U( W1 F" d, K# T+ A5 K: M
. _2 X2 b3 R5 {using std::string; 3 x. X$ |9 H& O
/* 7 C3 ^8 t6 b: {$ }5 [
*convert a byte array to hex string.
' X7 V- a$ j# f/ ~*hex string format example:"AF B0 80 7D" 0 l0 U% A8 i7 E$ F4 l" y
*/ 7 d6 U. n: d0 `. z! q- b
string bytesToHexString(const byte *in, size_t size);
& Z. [. d, G3 j: H/ y 4 Y" I! j3 a- q, O8 c; Z6 Y
/* " G9 Q* @4 y& [7 z. c1 y
*convert a hex string to a byte array. ! T; @8 v, `. O7 J  l' M
*hex string format example:"AF B0 80 7D"
! @, ^( M. a' U8 U! Z*/ / D  o0 e6 K9 K4 ^/ l& [0 |
size_t hexStringToBytes(const string &str, byte *out); & U) ~% o5 z3 x1 j4 U6 r& L6 P' i
8 l, q8 v- D3 K) r+ n
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" . q9 ?$ c) J$ e0 k2 {7 S! V
#include <vector>
9 x3 d4 S4 [; A! y
" {5 g  i& X* Iusing namespace std; / c( l5 A  _2 q) b5 \  F( G& o2 |5 x
  Z1 m. i2 z& e8 \' s
char intToHexChar(int x) {   l# Z7 t: n2 Z- d' P' x
    static const char HEX[16] = { ! A1 T. \: J$ b* B
        '0', '1', '2', '3', 0 f: t# C# r5 l: o( _. O* j- U
        '4', '5', '6', '7', 4 E" \7 V( K5 M4 Q
        '8', '9', 'A', 'B', 7 \& k* H! J% V/ Z
        'C', 'D', 'E', 'F'
5 U: I1 D1 h7 F3 G: m    }; 9 C" V5 i# P5 G3 X/ H  X/ N# y
    return HEX[x]; 9 x: ?+ t  }7 O, `* e
}
8 F3 n6 Y* a( W/ S ; i, ?$ O9 n: c1 E7 y: l; A
int hexCharToInt(char hex) {
, _& d  O" }. u0 ]2 B, j2 j) N    hex = toupper(hex); - F2 x$ M6 `3 r5 h  {, q
    if (isdigit(hex)) . d6 \; J- M' v3 g5 L% g/ X* i# e
        return (hex - '0');
+ S+ ~7 P: f, E! H$ M% ]3 H* n    if (isalpha(hex)) " I" E% {9 s, I* \8 F
        return (hex - 'A' + 10);
( P: B' }! J; ?3 b    return 0; / T% t) q$ [& e$ m* [0 [& l
}
' o2 M, P3 y# U1 ~3 a, ] 4 ~" w( u: q- w
string bytesToHexString(const byte *in, size_t size) {
1 \# _0 J9 n# t( R9 {# O    string str;
, P5 B' m+ L& X3 p5 j; |    for (size_t i = 0; i < size; ++i) { ! P' X0 a- j0 W1 \% j$ i! f, n
        int t = in[i]; 3 U, l. G8 d# j; _: h! n% G
        int a = t / 16; 4 t3 b, f7 H. Z$ J
        int b = t % 16; ' \- c6 l/ Y( {
        str.append(1, intToHexChar(a));
' q% L- e2 X/ w5 b) G        str.append(1, intToHexChar(b)); 9 V9 X% M# N1 H- |% b5 c4 }9 t
        if (i != size - 1) ) y( Y8 y% N/ @1 h( M5 _5 x
            str.append(1, ' ');   D7 w4 Z& n# D5 k8 V8 N
    } . @8 ^4 W7 _5 b+ z
    return str;
. s3 T4 s. M, R; ~}
3 j& H4 w' w1 \  d 0 i. Q$ d: Y& H$ _" O" J
size_t hexStringToBytes(const string &str, byte *out) {
2 X- ?$ ^; m3 k- |# r! k2 t5 \5 b- R4 W
+ h, b' B4 V! g# f; @( {( J3 @    vector<string> vec; 2 C7 ?6 \0 x  ^
    string::size_type currPos = 0, prevPos = 0;
5 Y9 }" t9 q; \9 _& m    while ((currPos = str.find(' ', prevPos)) != string::npos) {   P: y- s5 H* S7 a. n5 z
        string b(str.substr(prevPos, currPos - prevPos)); ) X8 }6 j; X6 Y) Q. ^3 D
        vec.push_back(b);
. F) ?' l* y8 w  Q4 M, c        prevPos = currPos + 1;
2 ~) Z$ G4 l; [, g0 O9 ~    } 8 o" F7 x$ G% T  D3 S+ ]
    if (prevPos < str.size()) {
) ]; E% C2 r) H5 i, g        string b(str.substr(prevPos)); 6 V4 z6 V" m) z" D5 E' i
        vec.push_back(b);
9 j9 y. p; E2 c/ X    }
" B+ R' M! K) w$ a1 x- W" Q8 _( t0 B    typedef vector<string>::size_type sz_type; + }) I2 M7 O) k( G  {4 b; l
    sz_type size = vec.size(); , `" l9 W' T9 b" K# u! A$ e+ s
    for (sz_type i = 0; i < size; ++i) {
! f; Z. g1 r& t% [  g* I        int a = hexCharToInt(vec[i][0]); 4 B" {9 n4 x* k- V+ c# U! [
        int b = hexCharToInt(vec[i][1]);
+ f. t! [3 M- o4 |        out[i] = a * 16 + b; , n) |5 E( s1 K" b: N6 P
    } - ]* ]; ]& g, I/ Z3 N
    return size; 5 \+ x1 r" d8 ~( J
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H $ l- ?3 M; M. d% J, z
#define TEA_H 4 `  J: m7 K- `; s$ w! P
% M# Y4 G- }& `+ ^- C, J2 I
/* ; K) O2 H8 e: Y
*for htonl,htonl
  I: T" ]. L" r7 D/ A8 s" L*do remember link "ws2_32.lib" + I9 c* O6 f: ?5 [4 e, E+ {& Q: k
*/ " e" k% |' H/ a9 t3 A
#include <winsock2.h>
2 o+ `& N3 L: s/ w1 _* k. @#include "util.h" 8 {/ M2 Q6 y) q1 c2 P3 M  z

" O4 U  }# {* {8 c; G1 pclass TEA { ) K9 t/ K3 D( Y" v- [  H/ f/ L
public:
3 t# d: r9 `" S/ g9 r3 M    TEA(const byte *key, int round = 32, bool isNetByte = false);
' u% f  f! `; ]5 s" P$ b    TEA(const TEA &rhs);
* c: a. B8 P6 q8 x7 e/ {    TEA& operator=(const TEA &rhs);
% T. j2 Z. P. I1 b" P. {* X. C    void encrypt(const byte *in, byte *out);
* Y0 q+ k+ \  J0 b# ~) V    void decrypt(const byte *in, byte *out);
6 X9 g: L' [9 j2 m' r9 rprivate: ! ?. A6 i( h5 n
    void encrypt(const ulong *in, ulong *out);
9 D0 R4 O* ~* X9 t% w9 w- R2 S    void decrypt(const ulong *in, ulong *out); 0 ^8 O& F7 T  N" o  b7 @1 r  b
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 9 z, {2 Q7 e9 b7 J0 {  G1 x
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
. g% w( l& h$ b! Z6 I: ^$ Rprivate: 5 N- H1 F4 l. {  f" U* U
    int _round; //iteration round to encrypt or decrypt
5 @$ q# p( t! Y6 R2 c8 V    bool _isNetByte; //whether input bytes come from network " J) y  R4 }/ m
    byte _key[16]; //encrypt or decrypt key   ^6 o* ^/ ^/ H% P' D1 d
}; ; v" E" P1 Q9 j

8 s  n5 C4 Q( |1 }* b2 U#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
. N$ ^& \4 f/ ~6 [ 2 #include <cstring> //for memcpy,memset 0 o8 J2 L. |1 Y# V  h: H- w
3  8 X0 P. {0 @$ i; |+ q" W
4 using namespace std; ! g6 N# Y! |$ j( T3 G
5  3 a* H* c/ L& G. I
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) ; E2 `1 y) c% K1 F
7 :_round(round) 2 V+ E: r+ e$ X* Q9 u& h
8 ,_isNetByte(isNetByte) { ( \1 L; a0 U8 C& u
9     if (key != 0) 3 M1 M* I. [8 m& a3 _9 T8 u( r
10         memcpy(_key, key, 16); ' j3 O/ ~& ^2 K0 T- }
11     else
. R9 J( Q% u% N8 u! _1 b12         memset(_key, 0, 16);
: R0 U9 I( F7 K0 L: p4 r' c13 } + V* s# V- ^0 p
14  & z- g+ _* A& q& w# e9 ^
15 TEA::TEA(const TEA &rhs)
) u9 c2 M# }* D9 z8 }2 {16 :_round(rhs._round) 0 N$ R. s7 n  j* G# k
17 ,_isNetByte(rhs._isNetByte) { : O& Y. H& L' G8 {& Z2 V: m
18     memcpy(_key, rhs._key, 16);
4 x9 H/ `" N4 r) d6 k8 ^$ E19 }
( |4 V2 i7 Q& J$ Z" \& L# c+ Z20  & ]. ]. e. e. Q# b
21 TEA& TEA::operator=(const TEA &rhs) { 6 w6 D4 o1 h4 O% Y3 y6 g
22     if (&rhs != this) {
( ^3 e/ S  R; ]- ~, R23         _round = rhs._round;
. D5 A# g1 i7 {$ r& j7 Y/ s- i24         _isNetByte = rhs._isNetByte; 9 Z/ O7 _0 \) p* R
25         memcpy(_key, rhs._key, 16); 1 {% _7 W2 u# N( Z- h) ]2 s( [* k
26     }
: }1 z# A/ P* N' F27     return *this; * C' @" p, D. m! D: A
28 }
; i/ v  R+ G2 u) r5 Q) B+ _9 B29  
! g2 n0 w# d% k% P" X! n) \30 void TEA::encrypt(const byte *in, byte *out) {
1 }) K! {4 Y, ~7 w* i31     encrypt((const ulong*)in, (ulong*)out);
" e5 w7 Q3 K# c/ d32 } ; ?/ H$ o9 i: I* l1 m
33  
' a  {* k9 d4 |* ?# q0 m# y34 void TEA::decrypt(const byte *in, byte *out) {
' e- B) F0 R. I1 X2 r/ w* R, J35     decrypt((const ulong*)in, (ulong*)out); . o5 m9 K  O* t. Z
36 } $ z# g  f3 [' {9 U* Q: v
37  $ v6 n! C" ?' ?0 g8 \. p! u% y
38 void TEA::encrypt(const ulong *in, ulong *out) { 9 v% n0 ?+ d' r& l& v, Y: |9 @
39  " D1 t) O3 X' u2 |3 o6 U( d
40     ulong *k = (ulong*)_key;
5 I# B+ H0 [3 K8 p: e* }41     register ulong y = ntoh(in[0]); : f1 v6 f; m1 j
42     register ulong z = ntoh(in[1]);
/ N9 K, G6 }! \7 \2 G/ ~43     register ulong a = ntoh(k[0]); 9 J1 [0 E* n7 C' u7 W3 T3 F/ O6 B
44     register ulong b = ntoh(k[1]);
0 t( s1 a( ^8 _- Z45     register ulong c = ntoh(k[2]);
/ q# O( {* Q; I46     register ulong d = ntoh(k[3]);
0 E2 s; P8 X- c1 o: ]7 O47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ & s9 O  G) ^6 u5 g8 Q+ E9 D  q
48     register int round = _round; 9 s4 c2 [9 }/ X  ]
49     register ulong sum = 0;
  m5 e5 C$ i! ~0 \) g/ }/ L  j50  - p7 y( j, E) t9 j
51     while (round--) {    /* basic cycle start */
6 x7 l# o8 G/ \: {1 g* a52         sum += delta;
$ \4 L8 A# `5 i0 U# V# y53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
# e+ ^9 p, N; X& W54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
8 `# {8 O) R. s7 O" B7 v55     }    /* end cycle */
7 D* t0 }9 [# s9 r% D7 t56     out[0] = ntoh(y);
3 x' l8 S3 W" N; Q) |) [) L57     out[1] = ntoh(z); ( w2 X0 b& U+ l' U& g
58 }
2 t& v4 I' A/ K# v' ^59  6 P$ J8 f8 q$ Z% Q6 l8 s
60 void TEA::decrypt(const ulong *in, ulong *out) { ' A3 d) ^  {/ u2 S, [
61  
& m4 N6 c$ n$ n3 c- F: G62     ulong *k = (ulong*)_key; 4 @' P9 G/ U6 ^1 J9 J; C7 R
63     register ulong y = ntoh(in[0]); * [2 O1 r+ P" A) a" e: o4 }' i
64     register ulong z = ntoh(in[1]); / {( C% u- T2 y
65     register ulong a = ntoh(k[0]);
2 b$ z! i: Z1 C7 c, J( i% |66     register ulong b = ntoh(k[1]); 7 F# M6 {+ s. }: B: w
67     register ulong c = ntoh(k[2]); % ?+ A, V9 T1 \
68     register ulong d = ntoh(k[3]);
% s) S$ X: f' K69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 8 u+ Z. j* v( d% _3 u: O
70     register int round = _round; $ q6 D. Q6 y: n2 I
71     register ulong sum = 0;
) _( B# O6 b9 o9 V/ z1 R72  * ]' x' F& G8 Q9 R3 |  ~
73     if (round == 32)
! p5 _: L- l" [74         sum = 0xC6EF3720; /* delta << 5*/
( a5 a1 U8 g1 ?1 [, G8 H75     else if (round == 16) 4 y0 n, p9 w2 N4 M
76         sum = 0xE3779B90; /* delta << 4*/
  M, H+ X! ?) s; I) W; y77     else . E+ @2 a! V% r# U
78         sum = delta << static_cast<int>(logbase(2, round));
' R4 A, ~- b, p" }$ a: r79  ) @3 ^# T/ V! q
80     while (round--) {    /* basic cycle start */
8 k; j; @+ E4 {7 F" S1 J1 T4 s1 z81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
; p8 X2 R# P4 X82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); . l/ ?) t7 l8 X
83         sum -= delta; 8 i9 e5 b% ^1 N* a! `3 e
84     }    /* end cycle */
: q) u% V, ^" k# K" h85     out[0] = ntoh(y); 0 {% g; E1 a5 p& m# X9 c
86     out[1] = ntoh(z);
8 Z0 }( S; {+ d; }+ M( k# f7 s0 c0 A87 }+ K# B0 _0 s6 c9 X/ @! W
7 I# U: s+ e$ d4 w. C( R
需要说明的是TEA的构造函数:
! x) \5 x" R3 F' X$ k$ c0 XTEA(const byte *key, int round = 32, bool isNetByte = false); 4 P1 F! j8 {6 y: U1 H# l$ G: B
1.key - 加密或解密用的128-bit(16byte)密钥。
3 x2 J1 d0 t$ H3 p( d9 K# ~2.round - 加密或解密的轮数,常用的有64,32,16。
' @6 j& _# g1 c) p' A3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 0 N" a+ H/ h  O$ u$ ^
) S3 o+ Y1 j' w. N& T
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h"
" f  Q2 C5 k' W$ @. ?, h  @, H* | 2 #include "util.h"
" V2 q; S. _3 l$ r# G5 t: M  | 3 #include <iostream> # J( |( L* i4 v, K' V5 X7 A
4  2 L; a6 y7 x0 `* U; ]6 ^! d1 r
5 using namespace std;
: v5 c! \% F! z# L4 \ 6  & m9 G! Y# I  [1 a  r9 o
7 int main() {
0 H# @/ v6 {3 B; [$ g 8  & J: z0 z+ }" Q/ w, k9 z
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 8 K& M) W7 w* s' A8 x) \
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
+ D+ `' z1 K7 Q9 q. U9 V$ H4 Y11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
* g6 e2 m" P2 x- [3 y12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 1 W0 s- n: ~8 {$ `' b# i8 q
13  
" k$ c6 _2 ^  p- R7 }6 Q) L$ F7 ?14     size_t size_in = hexStringToBytes(plainStr, plain);
, O* Y) `+ K. Y9 C1 r1 |15     size_t size_key = hexStringToBytes(keyStr, key); 5 R. }1 v: ^- H7 Z, z' v, B8 {
16  
7 e2 L2 u* G: c8 D17     if (size_in != SIZE_IN || size_key != SIZE_KEY) 5 {$ }3 H' t& j
18         return -1; 2 Y' y$ L4 H8 i+ f, p8 @% i" S2 ]5 N: ]
19  
( E/ W* J+ B# ]& a( ?20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; " i  H: y1 t, N4 O+ J% u
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; 0 e3 P* [& N* D' i# L9 d0 {
22  
/ a3 e% N* k2 y( h* [* D23     TEA tea(key, 16, true);
, Q  n% E& S8 [7 B( u: F4 z8 x9 j24     tea.encrypt(plain, crypt);
& ~4 @0 \( J- N( I" R! e4 |25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
6 r6 [$ E; d0 ^. g  c7 q  z- \: ^26  
4 K  m( l# L: ~+ L27     tea.decrypt(crypt, plain);
8 t3 X& K. Y( k$ r1 ^& j# t) [: x28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
; K) C/ Z+ m0 y3 O29     return 0; 5 N3 M% m* j: }0 k) U3 ~
30 }
$ c. G6 U* U* H, R8 Q8 |
& P0 R& s# S( c6 a, C1 B9 F. Z1 V本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx6 x& [( K5 R# w6 `( k: S9 p
运行结果:
5 R$ B) s7 r- e) l2 s- mPlain: AD DE E2 DB B3 E2 DB B3
+ A  Z& _0 j# {1 M9 x# i& vKey  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
( |5 Q3 s8 I9 ?7 ^* g; Z) lCrypt: 3B 3B 4D 8C 24 3A FD F2 ' p2 M5 e( H  l% k' l
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 15:46 , Processed in 0.020245 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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