找回密码
 注册
搜索
查看: 36624|回复: 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轮):8 R/ l5 w! l& g% G- [
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
/ c9 j) w7 J4 @  C; Y# cTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
2 N6 l0 l9 ]; J: A之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
0 ]7 t0 @8 w  Z! t* V7 Y在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
; S( ]7 \3 |" `: C& g9 |$ y  _9 @在 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. " k# |% C9 k# h5 q. N
  2. void encrypt(unsigned long *v, unsigned long *k) {
    9 B  c: Z7 i0 _3 o
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ! ?6 c# L  s  X; _  U3 ]
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ / g& F6 V& G0 A0 Z/ K5 z. N
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 3 U$ N' ^* U3 S. ^" j2 u! d
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 0 o& k+ a' E! _
  7.          sum += delta;
    8 l2 W. W/ a) b( j/ _$ t
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); , z6 R5 |( C7 |. a' e
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    * B4 Y4 C9 N; q8 O# ~
  10.      }
    ! D8 {. [* m8 L5 b& X# M6 P% _9 z
  11.      v[0]=y;
    2 Y/ @2 i+ q5 S$ I/ z, n- P
  12.      v[1]=z; / ~& l1 B5 d  W7 i5 F
  13. }
    # M" b. R* T8 w4 J+ p
  14.   0 m- W8 a, v( i3 b6 q
  15. void decrypt(unsigned long *v, unsigned long *k) { 3 b% p9 J( ]: O1 ?( \* L
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ . _: c1 B# A! A# K" L! r
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ ; a, z5 T9 m( N. W
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    2 O* |; l# l2 b1 X0 b
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */   t2 R# u- v3 t7 `% v
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    # W6 c8 Q: i$ I9 z: u
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); + J+ |5 V! M9 D0 E' C+ [
  22.          sum -= delta;                                /* end cycle */ 6 Q1 Q( @9 D1 {
  23.      }
    ) D9 C, x. {  w8 N
  24.      v[0]=y; ; S1 e2 v8 J1 I) @) k) `# R; B
  25.      v[1]=z; " S6 @) u3 j! ?% \* A/ |
  26. }
    ( M  c: A9 S0 F# k
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
' v1 x% T3 y, g8 [! }#define UTIL_H
& d0 E6 C4 u& Y. f8 ^/ O, y
' \4 _$ [! j. O#include <string>
8 {8 Q5 F) I% w# F. W9 p) e+ A; E9 z#include <cmath>
; q" K# l- W5 A1 r$ p) T9 R7 R#include <cstdlib>
5 u  I" a5 }7 C# V- X( g
! f  x( y4 V3 r; Btypedef unsigned char byte; + |# d/ I% H+ v  X9 @% O* L7 U
typedef unsigned long ulong; % D7 |+ `/ V0 _

+ Z6 h3 H& W- Q' u' V6 u1 g+ H  Minline double logbase(double base, double x) {
+ W# `6 ^0 M' t( m8 w, ^    return log(x)/log(base); " c  K+ G% s( I
}
7 U- a4 ?: [$ R
' f; H; [. o# p: ]/*
3 l2 V- S  o0 {. ~2 m" Z6 S*convert int to hex char.
4 C1 f) G! Z* K" g8 ]' l* Y*example:10 -> 'A',15 -> 'F'
6 _2 v' Q/ ]  F, m* Y& _* \% c*/ $ a3 u) P) ^  K/ R/ B* U
char intToHexChar(int x); 0 }5 O) e9 G- N- A) R4 i1 p% \
( K( W$ P/ Q& o4 @7 y
/*
, Q# }( n, s: a$ Y- E+ F8 c. M*convert hex char to int.
- I' B9 l8 n  g! h/ c' O! ]*example:'A' -> 10,'F' -> 15
) Y1 r) g7 |8 A! E# u, }$ f5 N*/
% J( X$ H7 H( C' R" y" }/ `# [int hexCharToInt(char hex); 9 Q+ A7 X( J2 Z6 ^- J5 N& l8 M$ B7 H
0 C0 `. d* M4 Y. x  o- ^. S3 ?8 q
using std::string; ) Q2 Z/ X; }; u. }9 C
/* ! v8 O0 v: B  H/ D! T7 {0 o+ Q3 N5 S
*convert a byte array to hex string. 4 R' e* [6 ?) A' P# k
*hex string format example:"AF B0 80 7D"
: c1 b; g5 X( C*/ . F! Y* s3 S% w
string bytesToHexString(const byte *in, size_t size);
7 j1 ]) L  K0 o  X6 K. f& F
- M" }% V( c; B2 E/* # K; O! E6 T+ }" |" g$ s5 J# s
*convert a hex string to a byte array.
0 V' h0 {+ _/ H/ J5 T6 J*hex string format example:"AF B0 80 7D" 8 ?$ N4 c* t3 J: o2 d: M
*/
+ y& a0 R) K6 ?0 }2 [" w  f0 t# Isize_t hexStringToBytes(const string &str, byte *out);
7 T4 v- z- B! Y* A: f9 v - S2 x% z) l( _
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" : e8 e9 M6 h  n8 |+ B1 u; y
#include <vector>
4 [5 p1 j6 t5 V5 `, Y( b7 D
6 A( _$ P- T+ }( F+ m! gusing namespace std; / B5 v4 s! V+ C- i" P

! I6 h- \  g% c% l% `+ schar intToHexChar(int x) {   Q' P! P1 D" |0 g  e, Y
    static const char HEX[16] = { , ^5 D7 l# f& r
        '0', '1', '2', '3',
/ {5 K+ J7 [4 B2 m3 S, o- H        '4', '5', '6', '7', ( b1 x3 j7 p& Y* Q/ M
        '8', '9', 'A', 'B', 0 ^0 J; w6 K* j* ]2 w
        'C', 'D', 'E', 'F' . |6 J7 I: u4 O) {
    }; " H1 m4 @& l8 @; E3 T% Q; k
    return HEX[x]; - \& P) p' d2 S0 B7 e$ r
}
% R, {: A8 z/ D0 V0 [5 n 1 _4 O% V" w( x2 B( a6 Z6 A' u
int hexCharToInt(char hex) { ; L  _* K+ p- y  S8 [% _3 I0 R
    hex = toupper(hex); + X# H4 I8 E; f) v! ~
    if (isdigit(hex))
8 V7 j& ^+ k" n6 I. p        return (hex - '0');
0 p. C# e' E( f- _    if (isalpha(hex))
5 s- g" j* N5 W* b# b6 j, ?1 e; D) k( p        return (hex - 'A' + 10); $ P8 i+ i$ W9 v' O
    return 0; : l% ^( u" d. V8 T0 l: L
} # F& i) k+ {; Y4 ?% X
! W6 t5 O% R$ n5 G
string bytesToHexString(const byte *in, size_t size) {
. k# C% o- s$ L, X    string str;
3 b$ v5 d+ F0 G4 Y0 s) v9 `/ a9 r    for (size_t i = 0; i < size; ++i) { * f, w6 T( w$ [
        int t = in[i]; " p- s' O, e3 T; x
        int a = t / 16;
$ S/ x  \7 v: Q4 B6 |5 S+ Y$ F" m        int b = t % 16; 5 N1 l% \6 V5 Y9 G8 c$ r
        str.append(1, intToHexChar(a)); 5 k/ k; L7 B# k* s
        str.append(1, intToHexChar(b)); ) {1 w- o& J) W- h
        if (i != size - 1) . h* [* ]( |6 t2 R
            str.append(1, ' '); $ X! e$ g. s4 X2 a1 {, c) A
    } ) [, Z1 \) k, H4 p6 S
    return str;
& S. o9 T8 ^; Z} 1 V3 w. W) K$ B9 s1 ^
2 y4 u$ Y6 R: n! }9 y/ |
size_t hexStringToBytes(const string &str, byte *out) { ) _- r0 Z0 G# x6 T) f( V8 l) D4 Q

) N$ S' Y9 N% A2 R4 j: w# \" ?    vector<string> vec; 0 Y7 X* I! n1 x# ~
    string::size_type currPos = 0, prevPos = 0; 7 l9 s) A0 L6 g1 s" D1 C
    while ((currPos = str.find(' ', prevPos)) != string::npos) { , t- J' @: {! f2 I
        string b(str.substr(prevPos, currPos - prevPos)); & h1 R" s# u4 A
        vec.push_back(b);
/ L3 P! {" W1 A) ~/ ]- S' L        prevPos = currPos + 1;
  |0 |9 u3 Y. h1 K& y4 P9 x    } / y. J/ U5 A7 R7 L
    if (prevPos < str.size()) { ! O- ?$ Q/ s5 K% b, F' B
        string b(str.substr(prevPos));
6 f' }/ R  ~8 h& y        vec.push_back(b); 8 Z# p: V# j5 p, g7 r$ j
    } ) b- z! ~5 U2 @3 s& m) W) l, J
    typedef vector<string>::size_type sz_type;
/ ~0 G& I. V! ]  |* D9 b! y    sz_type size = vec.size();
2 e3 _3 |4 u$ Y' Z7 f, r    for (sz_type i = 0; i < size; ++i) {
& W1 h: O" ]( B( \        int a = hexCharToInt(vec[i][0]);
- j* z; Q& G4 F$ N8 T& {" l) g2 L        int b = hexCharToInt(vec[i][1]); ! x- T) L; j- n9 f3 K. k& G! Z
        out[i] = a * 16 + b; 2 Q! p# X$ ^7 Z! I& I
    }
! m& _6 _0 s- `$ m    return size;
* {$ z1 A& ]% p6 p! F( O8 o}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
9 ~# j; X" V% `#define TEA_H - C& t) l/ k1 p0 n) Y# [

: q( w, T5 {& Q, X& H/ U# v/*
3 V9 v& E9 I' F# Q5 N0 m& L*for htonl,htonl
; f( D* s% ~$ e" {, r* J*do remember link "ws2_32.lib"
4 V1 r. R9 p+ d1 m' b6 v- K; J/ _*/ 6 {" d. S( a6 L9 ^" Y* L3 C
#include <winsock2.h>
1 N& h+ a5 Y3 j+ n+ u: X#include "util.h"
8 J0 \. W5 f2 S ; V7 p! V1 Z2 h' I
class TEA { : E' V: }  B- n: m: c; L
public:
; d1 M" ~- w1 u    TEA(const byte *key, int round = 32, bool isNetByte = false); $ m0 o* Q$ ]8 v- m
    TEA(const TEA &rhs);
  }# L8 ^6 O0 f% K1 L2 u' f% v    TEA& operator=(const TEA &rhs);
1 A  v7 I0 c% }( y( r: z# J    void encrypt(const byte *in, byte *out);
/ q* r& y' C( M$ f9 K6 e    void decrypt(const byte *in, byte *out); ) v% M' A/ R% N* i; j1 P4 d
private:
: \' a2 q% `. j$ _    void encrypt(const ulong *in, ulong *out); % }$ a7 o6 c& W9 y2 O7 [
    void decrypt(const ulong *in, ulong *out); 3 R5 w) c! h# F' c1 S2 R& p6 `+ v
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
7 ^1 E5 E1 E( M  n    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } % Z1 u- k* c* ?' p  y6 C3 _1 y* Y- y
private: $ h  r9 i' e  y1 O9 A8 a
    int _round; //iteration round to encrypt or decrypt
4 c9 M( R6 J' l+ `/ r; I    bool _isNetByte; //whether input bytes come from network 4 M# G, R- B% H% V: r3 s% o! P- Y
    byte _key[16]; //encrypt or decrypt key , y% ~' c2 z' I* N7 p
};
6 G- v, F/ N# Q2 ]6 Z  k
5 R* w, y) [& E#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
/ R  Z: o7 H5 ] 2 #include <cstring> //for memcpy,memset # i# r( C" }$ }; p/ q- k- B
3  
5 y$ N# C" O/ \0 l* u  s+ c 4 using namespace std;
$ o+ f% L: q" m/ q6 R" B4 E5 s 5  : i/ M* M7 Z& x7 z0 ~2 Q
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
2 L0 l' V& g" l5 ]' ? 7 :_round(round) 1 O2 P/ z' Y% v4 a
8 ,_isNetByte(isNetByte) {   i+ K, J8 B4 v  w; r: g1 q5 O
9     if (key != 0) / S' x; j5 L2 }3 k/ ~
10         memcpy(_key, key, 16);
5 m" A0 Q: z' H6 X; S: ^11     else
0 z9 a6 S' b, B4 C* T, `12         memset(_key, 0, 16); : ^; f. ?. l6 b9 w5 z: C
13 } $ e& }2 H- O6 Y
14  % [  o3 ?) G! p$ }+ g6 r: T
15 TEA::TEA(const TEA &rhs)
; ]  w" j" U+ w! A8 B* c16 :_round(rhs._round) 0 B$ O8 @% A0 Z
17 ,_isNetByte(rhs._isNetByte) { : L7 O3 `, W2 G- C7 o' K& w2 \. Z
18     memcpy(_key, rhs._key, 16); " _8 D. G6 v0 C) w9 B0 j
19 }   \/ E3 q7 J  w' o$ d" l% w! _; {7 F" G
20  % l3 H2 M1 ]2 }3 w  ^* Y) a
21 TEA& TEA::operator=(const TEA &rhs) { $ V6 B$ l6 S, u+ m( U
22     if (&rhs != this) { : L( {' ^' S' F2 M
23         _round = rhs._round;
" d1 Q5 n: @  V' s24         _isNetByte = rhs._isNetByte; - c3 H& ^! q( W" u3 l
25         memcpy(_key, rhs._key, 16);
& H/ V( E& O* p6 C26     }
/ Y% g# p% H* D27     return *this; . C4 ]' F: E9 {+ ~9 p
28 }
3 M6 p4 y6 c0 ]29  
% j0 d$ J" \7 y6 h# O30 void TEA::encrypt(const byte *in, byte *out) {
! G% p8 S* ^% g31     encrypt((const ulong*)in, (ulong*)out); 0 d; {& b* g; Q
32 } 0 m: Q: l" c/ q. g- a
33  
4 w; O* g) C' ]1 K. W! x' B3 j% ?34 void TEA::decrypt(const byte *in, byte *out) { - X2 G# X) M) |" U8 s" B. W+ u
35     decrypt((const ulong*)in, (ulong*)out);
; f, ], h! p$ L  A36 } ! x$ d8 _! Q# m
37  / l2 [4 J$ h& a' z& v
38 void TEA::encrypt(const ulong *in, ulong *out) {
; L5 Q" D. R) T+ }2 C" z& t6 M" W6 _/ d39  
/ s8 K* i9 I( w1 ]$ `% L( l0 b40     ulong *k = (ulong*)_key; : h3 p& ?7 L& R) z/ G
41     register ulong y = ntoh(in[0]); 9 N7 p. ]% G2 S0 X1 {
42     register ulong z = ntoh(in[1]); 8 x3 [" {5 a( ^
43     register ulong a = ntoh(k[0]);
4 h( ^; P; c1 f/ }' F7 e44     register ulong b = ntoh(k[1]); 0 b; \2 Z7 R  t) _8 A+ C4 Q0 v
45     register ulong c = ntoh(k[2]); 6 W  ~" G) Y- x0 a- B' E
46     register ulong d = ntoh(k[3]); 6 X& m& b( X) Q% i
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ % B/ d. r/ @) L: Y4 h' f. A/ d8 r
48     register int round = _round;
0 p% [; U4 g2 N; y49     register ulong sum = 0;
, h9 Z' _' i; F( N% Y1 w3 \50  . ?: n; P" }. N' V& A4 K% r) J* n
51     while (round--) {    /* basic cycle start */
2 f7 y+ G; Z2 V, S% ^- ~52         sum += delta;
, _* ~/ M9 S5 ]4 |, z53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
5 i2 ?, b! x! }) H6 J54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
, U3 {( I( X% f! p55     }    /* end cycle */ 0 l6 ?4 y8 x7 d1 o/ U8 _. f
56     out[0] = ntoh(y); " q; U& G( X3 I, q1 z/ d
57     out[1] = ntoh(z);
! B" E  p! Y* i: R5 X58 }
8 b1 h1 l4 d1 e59  % ?3 H) o! l3 L$ g6 V* @
60 void TEA::decrypt(const ulong *in, ulong *out) {
4 v$ D" {# n6 ?/ x+ g61  
/ K0 h! [7 D- ]# A6 ^% `62     ulong *k = (ulong*)_key; 9 ^$ _2 b8 C! _% X
63     register ulong y = ntoh(in[0]);
4 c: D" ?0 V7 a64     register ulong z = ntoh(in[1]);
: P9 \. m) v$ W( k: D1 e0 S+ U65     register ulong a = ntoh(k[0]); $ O0 n' @6 z3 e
66     register ulong b = ntoh(k[1]);
) X, r6 \5 B9 C  M. C$ k67     register ulong c = ntoh(k[2]); - ?0 }' T% x! d7 S
68     register ulong d = ntoh(k[3]);
  C' B+ X9 m. T69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ # l: W, K' w, D& V/ ]! F
70     register int round = _round; & N) {  d1 o0 A5 J' p
71     register ulong sum = 0; / j0 j5 \# U$ H+ e6 M
72  
" ]3 T( I7 N: X73     if (round == 32) * m. K2 Q. N: `! a+ n& l7 F5 C
74         sum = 0xC6EF3720; /* delta << 5*/
, C3 _5 W0 Q) C/ q3 ]( E75     else if (round == 16) ! P% x- c+ M  y/ U4 ]
76         sum = 0xE3779B90; /* delta << 4*/
3 k; ?  B, q% S77     else " v5 f8 i+ S! I* D% I
78         sum = delta << static_cast<int>(logbase(2, round));
( Q6 H2 S1 U9 t- e& k2 ]79  
) o( X/ B: G0 d8 d$ i9 d) ^80     while (round--) {    /* basic cycle start */
; q3 z. V) K' \7 g! {( b81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+ l6 ~# s) x2 N1 b! P% x/ @& @6 g82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
/ n$ Y" n* G& j' N/ L( m. V83         sum -= delta; % K' G7 _! J, n6 Q
84     }    /* end cycle */
" y2 p/ L" {, |, v( Q# b  F. E4 a85     out[0] = ntoh(y); , r  B2 o  d. w3 Y3 E; x  D/ H, c" s
86     out[1] = ntoh(z); 7 o! O2 O4 @' E, K# \1 Q3 M1 S# B
87 }: H, H1 R: f/ `& b; w+ C; h
( A6 u0 x7 B* _8 W
需要说明的是TEA的构造函数: 5 k  T( h2 j0 q$ n; I6 [2 \/ w, w
TEA(const byte *key, int round = 32, bool isNetByte = false);
/ H$ J4 y8 y) e  m7 A- q# |1.key - 加密或解密用的128-bit(16byte)密钥。 ( g7 {8 J% D5 h
2.round - 加密或解密的轮数,常用的有64,32,16。
' k+ [* O$ w6 _2 U* n/ P& G1 ^3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 3 s) X% w( H* N  W; V9 i

5 D. d6 ~# j* U9 K* ^, `最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ! M) I8 U( `' r7 }# P
2 #include "util.h"
7 D! R: l9 @! z( \ 3 #include <iostream>
) e" B& P' t4 g  I5 }1 H 4  
/ G; E6 j! ~8 a; I$ F" q0 d 5 using namespace std; 4 Z* U9 k( f- M' s
6  
: u/ k8 p9 q% j4 H' `/ ~ 7 int main() { * k5 s! i. Y+ C) [4 j8 D# T( j
8  
  n4 s' K, i7 N% Q7 E$ y# | 9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
& S% P; m+ R2 }9 C8 T10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 5 _( k5 f  y1 n& Z5 W/ p! D2 F8 m
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
  N% C4 `7 B7 Z12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; , R* N  ~, ~0 X4 w3 P" p( [
13  ; w" p. Z! X" R% ^% \! D- @
14     size_t size_in = hexStringToBytes(plainStr, plain); % R9 v7 l. N5 c; |. d
15     size_t size_key = hexStringToBytes(keyStr, key);
7 a, u# H) U, p/ U; I% g" }- S* W6 n16    Q# E6 @3 m' [, \; L7 o$ T( y3 j
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) + M% z. @, B$ `% @2 b' _/ A3 F
18         return -1; 2 ?' D" e: F- T* K; d* \1 v
19  ( v, h" ]% V( ~! ?# d: T: \% _1 J4 b
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
, j+ h" t' ~1 _6 K! j21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; * k( b+ v0 a  ^" j% [& F
22  
7 H) d. J/ [2 p23     TEA tea(key, 16, true); 7 C0 p0 s) l$ P! V, R
24     tea.encrypt(plain, crypt);
* w$ }% Q% l. M5 o25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; $ j( d4 N& c) v( l! _9 I
26  & }8 N7 Y8 H  K2 A/ A  a* A' {* ]
27     tea.decrypt(crypt, plain); # T; _% h& C* b- R% P8 b) d. [/ y
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ' P* z# }! u' }0 g0 G. W
29     return 0; # O! N1 y/ N! \! W3 e8 d- N4 w2 Z$ u
30 }
9 M9 W) T3 A+ \' v5 U3 ?# {9 x/ S" `
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
9 g* ?* L8 i+ g% z运行结果: ; o4 k' ?8 D. W) Z
Plain: AD DE E2 DB B3 E2 DB B3
. |9 n8 n4 |8 ?4 [Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 ( [; l/ H  u* @$ u6 P! ?8 j0 `, f* t6 r6 M
Crypt: 3B 3B 4D 8C 24 3A FD F2
+ P+ @* e0 e2 c  Q8 bPlain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 12:06 , Processed in 0.016169 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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