找回密码
 注册
搜索
查看: 37892|回复: 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轮):
) F& {& p5 j* @3 G& U7 M/ V微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
& v  P9 A4 f4 o$ {5 F( A6 @TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 * C$ h. y4 o3 \
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
" [) q) y; r  G在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。   n; r( D. C& r* X; ?* B
在 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. . \% Q% U# e4 H' L2 T+ h* U
  2. void encrypt(unsigned long *v, unsigned long *k) { 8 p/ _+ j+ a3 z! \
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    ( B5 m+ m/ Y! H- h/ F
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    4 p, z% f: U1 q. E4 P# R5 o: S
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    * x' m7 A  K( h0 l: C# b% i
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 6 d) u9 i, j5 \) k
  7.          sum += delta; ) X- Z8 k0 E/ G$ L
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); % I# m( {: |0 R4 V3 b) q0 k
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    8 u; ?+ b" p1 }
  10.      }
    + |* l5 t: V& O0 J+ [
  11.      v[0]=y;
    2 J& c  b5 I, U$ b' [
  12.      v[1]=z;
    ' p; Q' p; _- x9 W/ A: L  Y
  13. }
    + F, T- P" E' z( k+ i2 ]
  14.   
    ( p3 p9 O% L: p/ ^! l- S. M
  15. void decrypt(unsigned long *v, unsigned long *k) { ( A2 L* q1 {7 ^* K- Z  e) j: p
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ + H/ |/ z5 W* y0 |/ Y! g
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ : y7 v7 y1 X6 J# j& ]0 D9 J8 P5 E
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    - P! y* H  B! k4 I. E
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ 2 N6 B& C' S7 \7 ^( C! L
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    & w0 f% q7 O1 U1 s1 F+ t
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 0 Q/ D1 C6 M3 B
  22.          sum -= delta;                                /* end cycle */
    " c- I# g7 h! @1 y% p$ |
  23.      }
    & q% I3 Z& ^0 T  \( E$ j8 F9 G' X
  24.      v[0]=y;
    $ P# O- R$ n) L( b- k# T2 D- H
  25.      v[1]=z;
      a* e: \9 s1 x& V7 B! ]
  26. }6 o9 K) F) p9 R3 ^
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
2 N% O1 A, Q+ d. G# g' P#define UTIL_H
0 i  t8 [: b2 M/ k/ m0 {2 s: j7 v' `) ^5 d1 {7 f
#include <string> " B* \0 E; j! N+ A6 x4 D! ~
#include <cmath>
; W8 r' k, C! b& z( R7 F9 E# O' x, l#include <cstdlib> ( u% u1 N3 }8 c' J1 D( Y. s3 t

: y( t9 ^2 K. r9 D$ V3 J3 Ftypedef unsigned char byte;
% D6 X0 n4 p+ ^8 E/ Dtypedef unsigned long ulong;
: L- A; G, _# M
( J  p5 E. _+ ~0 D/ rinline double logbase(double base, double x) { 8 o" W5 D$ e% U( v, Y
    return log(x)/log(base); # R1 v5 M- K+ v' f
} 9 H- B; J8 x- T( b8 M3 S3 G

% E: |4 u" G% d  X1 X5 C" C/*
/ r* P  g! p8 a1 M*convert int to hex char. $ g8 k" c- F& i/ p5 {+ M0 k8 A
*example:10 -> 'A',15 -> 'F'
3 s2 A5 }3 C4 q! d*/
/ R# ^  v. N* f; @, Q! Echar intToHexChar(int x);
7 b+ X7 ^6 u3 o9 i9 t + b. |! D& V: M& J6 O! n; y
/*
# j( u7 X( @! w" ~$ T% k( S9 M*convert hex char to int. 5 i+ ~) i9 b; ~/ t, [
*example:'A' -> 10,'F' -> 15
6 A, z$ O+ W# R$ _; M*/
2 |; q" b7 S0 G5 `" t$ Q2 M2 zint hexCharToInt(char hex);
; j) e" s" H# W1 y4 i2 e6 u5 h7 l   I- Z2 d5 @/ Q0 @5 Q# ^* n9 _% P
using std::string; ! d* Y7 U! ?9 k- F, W4 y5 F2 ^4 g
/*
# O! H& J% r3 W6 o' M*convert a byte array to hex string.
7 n. ?/ |" H5 x# y& \*hex string format example:"AF B0 80 7D" 1 m& J6 i# j, p. J0 A; H
*/ " o# _0 n' c  a, K: ~5 z
string bytesToHexString(const byte *in, size_t size);
, X1 a1 r' a! q6 `* t, _& b; G9 | & h( x5 r' U4 u, S! ~* H
/*
2 F$ i9 h; J6 b/ t2 I' `*convert a hex string to a byte array.
4 _" }5 W2 ^$ A4 x# ~/ b- ~*hex string format example:"AF B0 80 7D" % e, X8 N  h5 F/ c+ w
*/
0 }0 e8 a. T$ M' R6 dsize_t hexStringToBytes(const string &str, byte *out);   U, o) H5 q: x& |8 |. _
8 j& M; w0 w! j6 m# Y* i
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
4 F& k% P8 g+ v1 K: P, ~% n9 v+ F#include <vector> 5 H1 ]1 c0 g  E7 j" {! l3 \

. N  P2 z2 g+ p. R5 i* c8 z: W. z: Iusing namespace std;
0 B' L" K) G  j
5 |7 I) f; S" B5 O  achar intToHexChar(int x) { 3 g8 z/ _) Y' o) l% N9 r
    static const char HEX[16] = {
( p1 j! I3 e& z1 y8 {0 y        '0', '1', '2', '3', " h' z) }% a9 [7 l- E) v
        '4', '5', '6', '7',
( e/ l" K* M. Y! ^9 x9 i3 q        '8', '9', 'A', 'B',
% L3 `0 n- o( A% V5 |! F        'C', 'D', 'E', 'F'
4 {) R2 D7 c! Z( S    };
* U$ u: G4 s. y1 j; ^    return HEX[x];
% O, h1 C: e# C8 P, L0 e9 a: H' C} ; y. Z8 G/ Y+ c0 g
2 Q& A1 u) g! X( b
int hexCharToInt(char hex) {
( F* u4 S& e! V* `4 D+ W    hex = toupper(hex);
0 B+ c! A7 I* J  d    if (isdigit(hex))
+ K  U2 y- L$ F( v" d        return (hex - '0');
$ B- L6 d! }- K  e    if (isalpha(hex))
8 h" G! {8 b3 |0 a$ N( h  l7 q4 y        return (hex - 'A' + 10); 6 H; p5 h% K9 s0 g7 q, v
    return 0;
! j! ]. O: R/ u/ H} 1 F- G, S7 K' x
' G' s1 ^! H, P
string bytesToHexString(const byte *in, size_t size) { 2 N4 r% g3 o' g5 C- E  g7 C
    string str;
0 z4 H: o3 t1 D: R    for (size_t i = 0; i < size; ++i) { ' a; N; {! b' O, ~7 ]
        int t = in[i];
  a4 R8 d; i. K( e' q& l3 r        int a = t / 16;
3 |! o0 @3 x' m( b5 L) ~/ m+ m1 A        int b = t % 16;
. L5 Z3 e, d3 T" z/ j7 ]        str.append(1, intToHexChar(a));
; O$ R, q4 |' i5 _4 l* k7 S        str.append(1, intToHexChar(b)); $ N$ ?( n6 |1 b2 c: Z! F, O
        if (i != size - 1) ( p; R3 K# j3 j/ f0 C0 |. m" o
            str.append(1, ' '); 0 t* ]1 S+ c6 J+ n- n
    } 2 t7 a- |# t; H7 o- j7 A  \6 S
    return str;
, Q$ s' v2 b# W2 c}
, N: i5 H: c5 g$ a+ L
# M: @6 }1 o! Y# G2 A5 e/ wsize_t hexStringToBytes(const string &str, byte *out) {
, P) H$ l3 M  N& P8 Q* \$ x 6 @9 y' v4 I0 Y* p4 H" @/ S
    vector<string> vec;
& b+ h& q, m7 `! {    string::size_type currPos = 0, prevPos = 0; 5 Y0 i2 w7 t4 W6 j+ a9 {
    while ((currPos = str.find(' ', prevPos)) != string::npos) { . d- \0 J% K( Z+ {0 P  E3 I
        string b(str.substr(prevPos, currPos - prevPos)); & e& U+ M3 v' s$ ]2 g* h
        vec.push_back(b);
! R" |$ m1 M' U$ |        prevPos = currPos + 1;
  h* n( }! A* g3 j8 s3 X    }
; A1 ]9 S& {' N$ b; L6 i) L0 T    if (prevPos < str.size()) { 8 `+ U3 Y2 O% t4 {7 u0 D9 v
        string b(str.substr(prevPos)); 7 W6 E5 W$ X+ Z' O
        vec.push_back(b);
' I/ p, b; N- _    } / x  \1 `- X4 w
    typedef vector<string>::size_type sz_type;
6 p9 D3 _6 {1 d/ ^    sz_type size = vec.size();
7 T9 y4 W+ W5 ]9 g$ L0 H  b    for (sz_type i = 0; i < size; ++i) {   L/ }  h' k9 u/ d5 s9 f+ f$ K
        int a = hexCharToInt(vec[i][0]);
. Z9 R% t7 f: P5 q. b& u        int b = hexCharToInt(vec[i][1]); 8 h6 B# L7 @; W; f  I' h
        out[i] = a * 16 + b; " H/ C# }0 Y3 o) n+ X# L
    }
+ x( s5 h/ Y% V# H    return size; / j% Q/ `' t2 a# G& I8 @! b% |) l8 _' g: v
}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
' `! D' R6 p; {4 ]+ b#define TEA_H
+ \! B: H( |* t% ]
. A' B8 q3 b* f3 n6 f/*
4 B3 p, e/ Q$ ^6 ~) ?" X' M9 \7 x*for htonl,htonl ; B8 q6 Y+ z8 Y, M1 u9 K
*do remember link "ws2_32.lib" . e7 U9 c* r3 n. E$ B& L( _* B
*/
! g+ w  u( Q: \#include <winsock2.h> ; v# v" i) q4 h/ w/ j' L5 V4 M7 z0 F
#include "util.h"
; J' G" l& o! _5 [0 q; M  A , z1 e. `  j7 E9 b7 I6 a5 ~
class TEA {
* M' v2 C* [5 [: n8 Apublic:
8 O1 J) ?' T& M5 t1 g3 q    TEA(const byte *key, int round = 32, bool isNetByte = false); $ h! H$ {; T# F( H  g* D1 M
    TEA(const TEA &rhs); 8 X* @+ c3 S' L2 p8 z0 ~5 p
    TEA& operator=(const TEA &rhs); 9 I# F* p' @! Z9 T
    void encrypt(const byte *in, byte *out); , p- e; N7 Y7 a5 L  H) F/ Y7 c
    void decrypt(const byte *in, byte *out); 8 S/ }$ o5 ?  G
private:
. H+ ~& b2 P# l0 C0 `    void encrypt(const ulong *in, ulong *out); # l+ R: x6 }" @1 {$ t2 S
    void decrypt(const ulong *in, ulong *out); ! F+ n0 H3 V* {# D
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
- G! Z, Q; q: n* I' H    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } ) K6 ]0 g4 D# @5 W% T& J
private:
/ E0 d2 l2 G: D) u5 j: d    int _round; //iteration round to encrypt or decrypt
0 `, V' _& W' p$ @    bool _isNetByte; //whether input bytes come from network ' ~9 Y& l1 F6 K! R# U- m, }4 E
    byte _key[16]; //encrypt or decrypt key % n) H/ J4 v, M/ q  D  D
}; , W& V0 H+ W+ ~0 U% f) G- E
6 ]# u! Z5 T4 k$ F1 D
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ' A+ R& A; b. j: k$ M; k
2 #include <cstring> //for memcpy,memset
0 j/ v9 W' s" E 3  % E) o8 s3 o3 H( z) x
4 using namespace std;
1 p* Z% j+ L* f7 i7 ~6 a  D 5  # a7 R! F- ]  {" X
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) # k$ [& [/ O- e- G+ [; P
7 :_round(round) ; O, T- l) x8 n- k. {. X8 k
8 ,_isNetByte(isNetByte) { 6 y" p1 t! K  Y' ]% `) @: e
9     if (key != 0)
+ n5 |  R) T& G$ o/ P  @10         memcpy(_key, key, 16);
9 a, X9 h. K# _. W; c9 z8 ~11     else
+ S0 R9 b2 [+ a+ {12         memset(_key, 0, 16);
& ^% L9 S3 k  G) G- A% S13 } 5 ^' d* b) b+ f5 `' Z
14  
$ w+ z3 I7 B/ o8 t15 TEA::TEA(const TEA &rhs) 7 w9 n2 s* h1 D9 b
16 :_round(rhs._round) : R; {9 S# n/ N7 X3 l: h. ?7 z
17 ,_isNetByte(rhs._isNetByte) { 6 Q! H/ W( n1 v, [
18     memcpy(_key, rhs._key, 16); : z' [+ B/ }, ?( M/ I$ B
19 }
8 g% a6 R+ M' {2 L20  
4 e9 g5 T2 G9 t. H' D( N21 TEA& TEA::operator=(const TEA &rhs) {
; y& Y6 N; ~7 c: W* Q1 I3 g/ |22     if (&rhs != this) { 6 R$ E& t( g* Y6 i. [- L) e; R  L
23         _round = rhs._round; ) Y/ @3 k3 X- U
24         _isNetByte = rhs._isNetByte;   T5 ]4 ^& G' t
25         memcpy(_key, rhs._key, 16);
* J: B5 C& m% I- E4 X. f3 \26     }
7 C- E$ h  B  r27     return *this; 1 W' H+ A2 G  |* u: F5 |+ A
28 } + o; U2 M/ G' M/ g7 X5 _+ w
29  5 s- C& B; q3 X9 Z! P
30 void TEA::encrypt(const byte *in, byte *out) { ) J) _9 x5 s4 f6 Q- k
31     encrypt((const ulong*)in, (ulong*)out);
9 T, `0 L) B  Q4 @! P$ z32 }
2 i" n6 m/ g4 }* y33  
- R8 I# M& Q8 r$ C34 void TEA::decrypt(const byte *in, byte *out) { / q% Y1 o- J* |5 S
35     decrypt((const ulong*)in, (ulong*)out);
  h! \' `' B# I5 a2 F36 }
, }* P' a+ s6 k5 p0 u0 S/ K' |37  1 \4 G: x7 e5 i9 X$ j/ `
38 void TEA::encrypt(const ulong *in, ulong *out) { # {( A, n$ B# Q2 I! ]
39  
( a1 k" d9 `7 U- B40     ulong *k = (ulong*)_key;
$ \+ i5 E- I# k! |41     register ulong y = ntoh(in[0]);
1 U0 j& u- p+ s7 K! X, W% t42     register ulong z = ntoh(in[1]);
5 }8 q0 W& n) ~43     register ulong a = ntoh(k[0]); / D' V- }" d! {$ }8 x2 j" L2 a
44     register ulong b = ntoh(k[1]);
7 J- {1 s" K4 V45     register ulong c = ntoh(k[2]); 3 V' Y' ^/ {9 J
46     register ulong d = ntoh(k[3]);
, n5 @" d5 N2 J, i47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ $ P# u$ C. Q: F) Q0 o. d
48     register int round = _round;
! P  J* k, b8 U) W! [49     register ulong sum = 0; " w9 p9 g6 d. K8 Z! b% v
50  
; I# q' M5 Y- {51     while (round--) {    /* basic cycle start */
" I/ u* [" v* t% \, M52         sum += delta;
# H8 C$ q$ _  Q# b3 E53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
: j5 G% C, H* n4 |54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ! l, {5 R2 A' H2 H5 v1 Z8 R
55     }    /* end cycle */ 8 U6 K# G) z, b# b4 T: V. A# C
56     out[0] = ntoh(y);
7 @4 K0 {  A( B$ S57     out[1] = ntoh(z);
5 i# p/ A4 k5 z7 \6 T$ w58 } * p& g( G+ n+ E. m5 X
59  ( |! s8 b- k3 c+ A
60 void TEA::decrypt(const ulong *in, ulong *out) {
! p' B0 k1 b$ {# A+ ?3 N! F# U61  5 X# e0 g9 |0 B6 {# {# K
62     ulong *k = (ulong*)_key; 5 _" e& u# P8 |; H% U1 Z8 E
63     register ulong y = ntoh(in[0]);
. l( B! t& K3 t% Q! m+ W1 m1 i64     register ulong z = ntoh(in[1]);
3 R) U- s/ J6 q$ F* |+ j7 ~65     register ulong a = ntoh(k[0]); % n- ~8 Z- S% j3 \: r" ]  x" R% J
66     register ulong b = ntoh(k[1]);
& q' [8 R: K5 O' ]* x6 @3 m67     register ulong c = ntoh(k[2]); : B3 f, ~! \( E2 q
68     register ulong d = ntoh(k[3]); 0 k; n/ {6 ?4 |) \9 G
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
7 z3 A) e' B# e$ d  h70     register int round = _round;
2 S; j4 F' M& D, n( T& u- O5 o71     register ulong sum = 0; 5 h- O# f1 v1 _9 R
72  6 B) m( ~. g8 O; J" }( Z) w
73     if (round == 32) 9 U% s0 ~( W- x9 f- N4 J5 F
74         sum = 0xC6EF3720; /* delta << 5*/
% V5 O& x( A  {( K* L& F/ ]75     else if (round == 16)
9 x4 {; Z6 V- q) A76         sum = 0xE3779B90; /* delta << 4*/ ( j; M) ~: z/ U$ A: @4 ?
77     else ; X- i3 w" }; O) J6 d) v. v
78         sum = delta << static_cast<int>(logbase(2, round)); $ K$ J2 z; {: l# {/ A/ O: J* t/ n# g
79  * |& ~, a2 L# {: \
80     while (round--) {    /* basic cycle start */ 3 x# z7 I4 X6 p7 B! E( `; M
81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); 6 e, B  h* K8 U" d5 W+ ~
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); 8 ?" u2 W/ r7 C: o, a
83         sum -= delta; - G6 Y& l: Y' n* M' o
84     }    /* end cycle */ : j: E* C4 M8 B& `0 P
85     out[0] = ntoh(y); 2 W# w' t7 I' j
86     out[1] = ntoh(z); . n5 V' J% M) g0 [' b1 v
87 }
, S! R( e8 z! C* {: }5 G
7 Q% U8 ]7 [3 X6 V  w4 i* m. z需要说明的是TEA的构造函数: 0 o3 K: i- \  H; H' ]( |* q4 k
TEA(const byte *key, int round = 32, bool isNetByte = false);
2 L( H* Q: m- l" C& R9 ~+ N4 t1.key - 加密或解密用的128-bit(16byte)密钥。
; O5 b& M. n8 n0 r0 p) T5 y2.round - 加密或解密的轮数,常用的有64,32,16。
: H2 i" j4 ]- G1 J5 K5 a2 D  U: I9 T3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 1 [$ t& }1 k- m

( M' D, |% g+ e最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" : _* z5 B6 P# Y
2 #include "util.h"
8 Y; K- K5 i# r; t7 z 3 #include <iostream> 0 q; S% d4 g4 v8 m& D+ ?
4  ( j% E3 |7 ^# P$ \7 k
5 using namespace std;
  h+ a/ P# `" d5 u 6  . s  q: c3 a' O9 ~" a
7 int main() { & E3 i# d- A  S9 ~0 l/ B) u
8  + F% i. N/ k$ L
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); - J4 w. A3 M9 Z$ c" o- S
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); ) U. y* z5 n, m
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; % ]5 G# d: Y* e" P+ ?6 d
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 1 N, T" @5 t! T1 H/ N5 y; B
13  * L: s) n8 i0 {* t
14     size_t size_in = hexStringToBytes(plainStr, plain); $ `( m3 b! C) p8 a* T4 x; ~9 ^; D9 T
15     size_t size_key = hexStringToBytes(keyStr, key);
( c: V0 O4 y( N* |! A16    G/ @+ W& e- |, \4 B3 m
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
- `3 P( D0 R! V& u18         return -1; 2 t$ p* s+ E  }
19  
' n+ H3 U$ w% n5 ^/ K. h2 ~20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; ' o3 `* l( N" J* v% V
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
+ [, c9 U$ w% M, W22  
( m- P/ j, h! b& I23     TEA tea(key, 16, true);
. x# y! y8 k& B' x$ T24     tea.encrypt(plain, crypt); 1 @' ]) l0 p8 b+ A
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; # F- F' @' O& i+ O
26  
1 Q$ F0 K: v/ w$ U7 |27     tea.decrypt(crypt, plain); & e- f; f$ W* M0 \5 k; V9 |. t/ M' v
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
& S! a! W. ?7 j5 R0 X4 J4 z29     return 0;
  p7 s( [! ^+ X6 L0 A30 }' W1 M4 n0 K( a6 k6 y' ]* I

, t2 {- S" u& t7 g本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
( K/ E1 ]0 i8 V+ h7 M( k4 L运行结果:
9 F1 ~2 \  V+ LPlain: AD DE E2 DB B3 E2 DB B3 8 W* h. e, m+ I. A
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 5 V  r( @+ ^- g& H& L  ]8 i8 R% N
Crypt: 3B 3B 4D 8C 24 3A FD F2 . I( L5 o, S2 v9 t* a+ d6 Z. l
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-7 05:58 , Processed in 0.021135 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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