找回密码
 注册
搜索
查看: 37393|回复: 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轮):
- h# n$ \7 @* ]) Q微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
* I2 o$ w. P  a& R5 H& zTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 0 `' S5 O) l% R* c( R9 R
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
( Y, r. l$ }/ Q7 m# l8 U在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
' \) l  C- I! _) g0 b% 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. + l( N2 E! K# p) t$ Y( \5 i
  2. void encrypt(unsigned long *v, unsigned long *k) { & `. ]- @6 O* G4 @8 n% I  o' z2 h/ j
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ ) T4 [; f7 b; u
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    - b( x- X3 N) U. \" m( x5 H
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 3 b) {: W4 f8 K0 w/ V2 f
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */
    0 |! f/ V" S  a' x" X- ?
  7.          sum += delta;
    # q9 C' q8 y3 H0 K4 V0 t( J
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    * o: N# C5 q# X  Y, E1 T
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    1 J7 @7 i1 n) S& B5 F3 ~
  10.      }
    9 A" s. l% @. v8 N) q5 ^" P
  11.      v[0]=y; & m6 v1 Q: v3 \; N' [+ a5 K% q. @
  12.      v[1]=z; ! v5 q" K# w2 e7 {( G
  13. }   q! F! w4 H' x. a) Z, ~
  14.   6 O0 w  w8 k! m; b# z4 E9 `
  15. void decrypt(unsigned long *v, unsigned long *k) { 2 M$ l& |/ X5 @# S) ]$ d! @) G
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    # I. ~8 l6 x- m! s3 |/ r
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ * f; n# Q! I- h% l3 [  v! c  f
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    4 l# N: {7 G+ u# k% c
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ - `& B* Z6 z) l* a, V
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 9 l% I9 }1 N8 {& l# R3 |; A- z
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & i) y, i$ O8 ^( W' X. i- z. Q
  22.          sum -= delta;                                /* end cycle */
    8 I. M% _: J- ^3 x2 o2 P% R7 P
  23.      } ; @8 U# Y7 |7 `, o+ {
  24.      v[0]=y; * c  j  B3 \4 C" @5 ]7 p
  25.      v[1]=z; " }7 y' M; e5 w; A/ _, m  w- c' {2 B
  26. }% X: G* o% k3 P3 Z
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
+ f& M, _/ g! P5 U# b#define UTIL_H
' {9 c2 w' u! D  F( w& A' T0 n& x, Y
#include <string>
4 |+ J" x. G% T#include <cmath> $ f& I) y3 r9 y; ~5 ^5 {
#include <cstdlib> ) x: v) v/ x5 C4 d5 A. H

, Z8 y/ F6 y, Y/ [typedef unsigned char byte; : F* s) A& E3 [1 g2 _! {
typedef unsigned long ulong; $ m4 G/ u+ E' Q* M; s2 I# G- \& {' V
* ]! J8 T7 R+ s: x0 h3 D2 v
inline double logbase(double base, double x) { 3 P2 `3 s' @- x3 c. f5 I* p& d
    return log(x)/log(base); 7 h7 Y: f4 O& f$ Z! V
} % K# [. g( i+ r6 q/ f+ [& F; i6 f

0 M; _! @5 r& a1 H. `# z% Y/ r! J/* , y) z; D! r2 c. e6 i
*convert int to hex char. ; Y+ h2 ~- Q; J5 h/ J% {
*example:10 -> 'A',15 -> 'F' + {* d0 A4 u% s+ B* z
*/
+ D8 ]  A; d6 Y" b# b" xchar intToHexChar(int x); ) Y3 @; d9 q4 @! {

4 F& m# M, [' O/* + P" e" S, s; _4 e% Y
*convert hex char to int. , K5 ]: K- k; R
*example:'A' -> 10,'F' -> 15 ! P( J! R, ]4 F
*/
* N; w' k+ H5 I' Gint hexCharToInt(char hex);
6 N9 r- b( }8 q* d ' {& D8 w$ v7 Y1 \
using std::string;
- M1 p1 A5 P3 S) f- O/* 6 `( [  K, c1 K! T3 y4 B; K
*convert a byte array to hex string. # V6 `7 E7 A5 b9 H5 z; S
*hex string format example:"AF B0 80 7D" 3 T, \" L+ u: U, P; S: T2 ], Y
*/ 9 I& g$ _3 K6 c4 p
string bytesToHexString(const byte *in, size_t size);
4 H/ R- a- ]! g
9 Y( ?7 m) [/ y! V5 P. |+ b/* - r/ w( L3 q4 ]# p& O0 a
*convert a hex string to a byte array.
0 a+ ^# S! h9 @# K/ Q2 |*hex string format example:"AF B0 80 7D"
/ F# `1 J. s& j1 W/ m- G- r- Z2 ^*/
' f' {% R0 Y1 |0 P( c/ Ksize_t hexStringToBytes(const string &str, byte *out); & N9 W! E4 R9 u1 B8 S, A4 K
  w7 x. n* _/ u" X5 x3 o; l, N
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" ! t+ [% `: G7 U- d% j
#include <vector>
' K- q: G; H4 h" D3 X) g9 d
; Z/ k+ S6 C) P+ r( Nusing namespace std;
/ V( k, F* w" I8 r. z1 T 0 Y* J& q5 E- T6 K; q8 J7 l- x
char intToHexChar(int x) {
0 F" ~0 h& s, e9 }3 [) ^* k    static const char HEX[16] = { & g9 l1 P/ o8 m, ]( r- I; e) c
        '0', '1', '2', '3',
3 x# r6 L, f0 Y  x) \        '4', '5', '6', '7', 6 p6 X* W& f* E% s4 W/ F8 X
        '8', '9', 'A', 'B',
3 _; V* D, U- d2 B  h        'C', 'D', 'E', 'F'
, C# A- q$ r; M( d: N    }; ! d' C# w! A% {
    return HEX[x];
& M% C* \* M/ ~: n2 p5 t}
+ j$ h- s9 B$ c4 j! P3 U
8 f" s3 T' t7 }& lint hexCharToInt(char hex) {
2 W5 H8 w. @' a, H4 |# |, m" S    hex = toupper(hex);
' |' L6 Y; E; w* s7 Z% |) x    if (isdigit(hex)) ; `, |; r- i( z$ ^4 l- h
        return (hex - '0'); : ?" t2 Q; K+ C2 A3 o
    if (isalpha(hex))
. z& z! x  `* h% ^" J/ G+ ~; t        return (hex - 'A' + 10);
& V6 Z3 q% e8 G3 [3 N    return 0;
  R) X* w" ~, G}
; w: w7 h: a/ e " A; C+ W" ?( H# U1 {3 u( q
string bytesToHexString(const byte *in, size_t size) {
- S8 a, h6 s4 A  R+ f! Q    string str;
3 e+ |, o, p( F. J5 t$ K% S- l    for (size_t i = 0; i < size; ++i) {
' \$ Z4 M1 U2 u' u% B1 L        int t = in[i];
, u: e4 `! Y" n; g* d  ]) x& p/ H5 |# r) E        int a = t / 16;
5 ^7 ^3 s! c7 j/ _$ p; Z5 f$ H        int b = t % 16; " A: a% K. ~1 t8 x0 g* k: I
        str.append(1, intToHexChar(a)); 9 q7 [& x0 q# c( {9 v
        str.append(1, intToHexChar(b)); 0 L# g) w- \% C& [' m, m
        if (i != size - 1) 5 e) m4 h2 G6 [- p* _! J! [# I
            str.append(1, ' '); 4 U1 X/ C7 {4 {4 G" q- H$ X/ ~
    } 8 X' [2 c* T/ O' s8 }& u
    return str; ( I  x( Z( A+ X9 N+ G& }
}
2 b7 z9 Y& W7 i$ {- ?) X: k& Z
9 c: m- K  T& [) r' K! z& M- wsize_t hexStringToBytes(const string &str, byte *out) { 9 A- J$ s' `" V: r1 u1 v3 ?) Q
# Z( p/ X5 h+ `0 s1 y: z5 ~4 ]9 X
    vector<string> vec;
! f2 H" b0 S6 P* v% E4 g+ S* |, _    string::size_type currPos = 0, prevPos = 0;
# x* a9 C/ R# @" I' c- _    while ((currPos = str.find(' ', prevPos)) != string::npos) {
2 y6 z' d  j6 L8 n) D# s3 d        string b(str.substr(prevPos, currPos - prevPos));
; o9 q8 }6 Q5 ?( F2 g        vec.push_back(b); " @6 p8 G2 T: Q# G5 F3 n* h
        prevPos = currPos + 1;
4 e4 D5 a1 s* K) I& a3 `    }
  I9 o8 X" j+ i% @2 g0 Y5 M% [    if (prevPos < str.size()) { * T7 ]! k$ y# ]1 s
        string b(str.substr(prevPos)); 0 N: u6 B% H% h" l
        vec.push_back(b);
5 G4 R, c; P) Q  ~: `" d+ ^7 k    }
, S6 V4 A  I* A; b+ Q5 k    typedef vector<string>::size_type sz_type; 7 S5 w! {+ @: u8 z# V
    sz_type size = vec.size(); * c5 [1 U) y% {3 C( }+ u: _
    for (sz_type i = 0; i < size; ++i) {
4 F: e5 ?; `% ~8 R; f2 e* a        int a = hexCharToInt(vec[i][0]);
8 X/ w) y  u* d0 [* X% d  V        int b = hexCharToInt(vec[i][1]); ( m3 f/ e- X' R' |/ i
        out[i] = a * 16 + b; 5 ]" g+ X( C% i% g" z
    } 9 h9 m5 a. g, ^$ j
    return size; % @8 x& U& C/ _/ T5 U+ M3 d* W0 _
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
2 G& j3 q: `, y+ y; N; m) y3 J#define TEA_H
! Y# P; L$ T  B ; Y  k7 f+ C+ E
/*
* @0 d* k1 J  O! V: j' B0 O( B5 n*for htonl,htonl ' \! m) u3 Z' D4 {$ q# C; p
*do remember link "ws2_32.lib" . a, j( _1 R9 F& r0 U; Z& k
*/ - I# w( }- H! ?. p! Z
#include <winsock2.h>
: h  r3 `+ S% O# ?$ b#include "util.h" 8 N: U$ J2 M/ a3 Z0 _: g1 O) i
# }/ U+ {' J5 T9 n4 b1 n/ N
class TEA { 7 p& h9 I( V% i0 x4 b9 i
public:
  s* L9 @# g& }. W5 C% b' i    TEA(const byte *key, int round = 32, bool isNetByte = false); % \" D2 V- n  r$ R' }3 a; u
    TEA(const TEA &rhs); ) n( _" W5 n) L, X5 W* G& H1 f4 I
    TEA& operator=(const TEA &rhs); 5 }% D+ B2 l9 r
    void encrypt(const byte *in, byte *out);
5 s; d7 S# r- c3 L' J; z! f    void decrypt(const byte *in, byte *out); , h& P7 P$ G( |$ y
private: : P: M4 n/ x7 ?0 X0 T- j
    void encrypt(const ulong *in, ulong *out);
. d% E5 B  z) `; ?( E2 {. ?    void decrypt(const ulong *in, ulong *out);
+ C7 y: g4 r3 G3 ]& L: _    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } : |' I+ x5 x% j, I1 u3 Q
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
$ w) d6 U0 g  f5 Lprivate:
4 M( B; W8 }. e    int _round; //iteration round to encrypt or decrypt 2 Z; \6 R0 n/ j6 N$ v9 l* M1 d
    bool _isNetByte; //whether input bytes come from network
$ _1 i3 P* k, x2 [5 y. {0 e) K    byte _key[16]; //encrypt or decrypt key ( p6 ]# s1 s6 X. u7 E
};
& B( ~* G9 M* [ ; T( ^  Z  X! L6 p
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
. ^% \: a0 ~; u% }9 \ 2 #include <cstring> //for memcpy,memset 4 x/ H3 q2 i8 n; ?7 o
3  / ~* J+ e8 `& Y. [+ ?$ e( q; A9 i7 k3 M
4 using namespace std; 6 i* ]( a9 J. ]! H; U
5  
0 Z5 }$ [1 q& U; O  F9 j8 H' U 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
: N7 J/ _3 ^* {- N( Z$ [2 L 7 :_round(round) 1 U# k8 v1 @) Y7 ^' ]7 U: v4 f
8 ,_isNetByte(isNetByte) {
/ c8 v- _5 j1 {' F* o 9     if (key != 0) % H/ \3 M, ^$ S; E$ T0 K
10         memcpy(_key, key, 16);
1 G. X$ r+ ~& R4 P6 S7 z+ z2 Z11     else ; |* F( ^; [2 J( q) t
12         memset(_key, 0, 16);
- ?# I7 Y' A1 K13 } + l6 S/ t0 ~& m' A' c+ g
14  : Q; T" |1 Q: q5 @
15 TEA::TEA(const TEA &rhs)
& Y+ c4 a, l/ ]16 :_round(rhs._round) 9 t$ @0 W4 R" g; K7 u5 `
17 ,_isNetByte(rhs._isNetByte) {
% W7 y" ]" d/ J! I/ p18     memcpy(_key, rhs._key, 16); 6 d8 c7 {* V8 h6 _
19 } 8 r. _! m) d, e0 I2 M
20  
9 t6 `! {6 G3 u& K6 C21 TEA& TEA::operator=(const TEA &rhs) {
- K$ I1 D0 H6 F9 J& x. {22     if (&rhs != this) {
* R. t; x( P; @% Y23         _round = rhs._round; 6 `( V# I4 p# \, w7 _: f
24         _isNetByte = rhs._isNetByte;
& A8 d+ M5 t7 V: ]  v" j" R25         memcpy(_key, rhs._key, 16);
. U- g! w" F; c) T7 y26     }
6 H9 V( Y/ \0 {5 x27     return *this; 9 R$ ~4 |; ~: X+ o/ j  }
28 }
$ q5 n2 g/ i3 X  b" V0 ]29  - j, x  Q0 f" V( b
30 void TEA::encrypt(const byte *in, byte *out) { $ ]4 F4 R' e! R- v/ i$ o* C
31     encrypt((const ulong*)in, (ulong*)out);
. M- F# g. X  g% n. C; W32 } % k, e! x/ [' r; }
33  5 B, H7 n+ ^- v+ E4 J" Q6 B
34 void TEA::decrypt(const byte *in, byte *out) {
; G% m( }  ?( D35     decrypt((const ulong*)in, (ulong*)out);
& j6 z4 V% I2 ~" ~3 Y, y) a36 }
5 P' _* b5 z2 [0 r/ b  I37  . @- c# j6 d9 g$ b: q2 [5 N* R
38 void TEA::encrypt(const ulong *in, ulong *out) { " C. J5 |$ P; P9 G  g) U
39  
+ @  @3 Q$ |2 S) q: V: B9 M6 m- C40     ulong *k = (ulong*)_key; ! L' I1 B2 R+ s2 {
41     register ulong y = ntoh(in[0]);
3 B& g* q3 P% d- A42     register ulong z = ntoh(in[1]); $ j$ v' J& S" l7 _, P
43     register ulong a = ntoh(k[0]);
! b! \3 Q/ S$ Y& B, Y: X9 ]) n44     register ulong b = ntoh(k[1]);
" v; _' M! f3 Z& b: Z# o/ F45     register ulong c = ntoh(k[2]);   ]3 `! Q) d2 _' Q
46     register ulong d = ntoh(k[3]);
$ T$ r4 _& N3 u3 ?( S4 @47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 5 N5 C; _1 K" w* R' e1 `
48     register int round = _round;
1 b- D$ y: d* T0 \2 O: j49     register ulong sum = 0; 5 Z/ b' Q4 u0 X. s
50  1 Q" R, z( ~1 Y' g5 j" n4 i% z
51     while (round--) {    /* basic cycle start */
* S+ y/ p0 W/ j5 p/ [2 y52         sum += delta; # U( u6 e  T* o+ o9 U
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ) @0 ^8 d5 ~* X7 T8 v3 H
54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
  l! @& ^9 q8 |* j$ z* Z- }" j+ U55     }    /* end cycle */
7 s) D1 ^8 u6 ~3 ?- z56     out[0] = ntoh(y);
' G  z& `: h; X( z* Q/ Y57     out[1] = ntoh(z);
4 a) ^- A& W% w8 T! n58 } ; K7 w2 Y% m6 a, P( t
59  & Q% B8 M' W- @' @% L) K
60 void TEA::decrypt(const ulong *in, ulong *out) {
, C1 _8 R; @, r( l6 M$ c$ `61  . P% V8 k1 @7 v' Q8 M- d, |# n3 p8 r
62     ulong *k = (ulong*)_key;
  _1 p+ C% _7 M* B- B0 V+ T63     register ulong y = ntoh(in[0]); : `& \5 o) J- c( X) {
64     register ulong z = ntoh(in[1]);
+ R/ e9 `) x3 l65     register ulong a = ntoh(k[0]); 5 W% Q# c' t. D5 C& m
66     register ulong b = ntoh(k[1]); % I0 W& ^: b$ D+ {
67     register ulong c = ntoh(k[2]); # K" I9 j( |, d# W. N- U; N" |' Q; H
68     register ulong d = ntoh(k[3]); * ]5 O: C. V0 O7 q5 s' Y5 j
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
/ X3 l5 n. z. I70     register int round = _round;   f# Z+ L* [: N6 z
71     register ulong sum = 0; + @% e2 A" N& I5 o( y7 g  a+ Z' H& E
72  
. c+ H9 @  |9 A0 \7 {# {1 z5 K. u73     if (round == 32)
3 D3 P8 W8 F+ w2 n- I74         sum = 0xC6EF3720; /* delta << 5*/   }* V$ Y0 s  S: s2 h
75     else if (round == 16)
9 O  m4 q0 e. S, ~. H0 S$ g76         sum = 0xE3779B90; /* delta << 4*/
* R. o; x" A; ]3 p77     else
5 Y2 w4 C% m7 b: _1 r78         sum = delta << static_cast<int>(logbase(2, round));
" `1 H: S( Z* J7 \79  
# ~. Z! i6 B& m& l80     while (round--) {    /* basic cycle start */
- ~3 d. u8 \% Y7 l# H81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
7 |5 k7 {- D- f+ |1 @! q82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
  h7 s$ Z& a4 }; P! V+ Y/ f83         sum -= delta; + H. a' f: o2 z" I6 S* |' u( y
84     }    /* end cycle */
' `/ L2 C+ O- n' O, X: K+ ~85     out[0] = ntoh(y);
/ I& n3 E# @9 t% s) _86     out[1] = ntoh(z);
. a( c; \& t8 z- w  P87 }8 V  d. ~! i( m8 e7 f; O' n& n
$ ^! U5 r0 R; X
需要说明的是TEA的构造函数:
0 F. ]& Y0 i& ?, i9 A" k9 e1 S. VTEA(const byte *key, int round = 32, bool isNetByte = false); * F1 ?) Q, C$ z: }/ s8 j) l
1.key - 加密或解密用的128-bit(16byte)密钥。
2 S0 N, z- g! {! E( g9 B2 |2.round - 加密或解密的轮数,常用的有64,32,16。
: c: B8 {; o0 `  |+ u7 c( N6 h4 Y% u3 S9 d3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
/ e4 h, p  k+ M0 e8 p* s: o9 B1 C
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ( H2 n1 J7 K) Y
2 #include "util.h" 5 y7 s& ^3 o" z! F. S2 n* p/ Q" A
3 #include <iostream>
/ C& C( p5 P9 M9 Z; G; n 4  9 l9 {* K/ \5 o, h9 L8 F
5 using namespace std; % U* f# F0 E3 x
6  , ^! R" l' E' g( M6 M& G
7 int main() {
/ x5 S) z# v' Q, }2 H 8  ) e0 O7 r; W4 u1 y5 E+ k; h
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
) |$ z" U' v* U& W& T3 j10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); & j5 t% p- Q7 N; ?7 t4 }
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; 3 V' }* P! \( D! @7 V! Q
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
- {: i# _# ^' H" w" A( h13  
) O* c6 K9 n0 C. F/ T" g14     size_t size_in = hexStringToBytes(plainStr, plain); / r+ y3 \- W4 k" s
15     size_t size_key = hexStringToBytes(keyStr, key); 1 z3 f6 z0 }6 a7 L. V* c1 \+ D
16  
5 L( S5 V; g$ ^: I+ ]3 F$ P17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
. s) S$ j. z+ m; ^; a" |18         return -1;
, u% L+ c: a8 j, o, ^8 K19  ) ^! V" I% p  ~, k8 m
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
# V, M% p' e  a. Y21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
& s+ n* G8 z! _2 w22  5 ~/ b4 R) e; u! }* Y* D3 d9 o4 }0 i
23     TEA tea(key, 16, true);
; ?+ r- ?/ N3 y4 Z' n( t$ a5 l: N24     tea.encrypt(plain, crypt);
2 f! A' z6 J0 w1 H4 y25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;   }& @. Z3 d: x# r
26  
) d) D, X0 `6 T: E) i$ p27     tea.decrypt(crypt, plain); ; W% }- K" u) `9 P# ?" l
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl; ; j( X# V+ C, u0 M; t
29     return 0;
) f+ }- @0 W/ p( p: H30 }
* k3 `4 p* Q+ g7 Z) `1 G
  N* i9 V. ^- ?2 \; d+ x1 Z本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
" e9 O: e2 f  u运行结果:
5 E+ G7 x7 x( h9 @Plain: AD DE E2 DB B3 E2 DB B3 ( F9 B6 d$ U' N: M! Q, H
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
8 Q' U& v9 y3 C, n3 c! SCrypt: 3B 3B 4D 8C 24 3A FD F2 $ R8 P3 Z. [9 E& e
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 21:16 , Processed in 0.019940 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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