找回密码
 注册
搜索
查看: 37317|回复: 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轮):
6 Z5 z5 B: {! M- p! \* _4 G% N- J微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 ) |* N6 P# ~" s+ B8 }' d
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
' ~. [9 p2 o/ H5 l" H之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。 & U6 {6 o" h' e
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
% A, ~- j$ ]4 S8 o/ O在 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. ( S3 S; [0 `8 R( s# c, c
  2. void encrypt(unsigned long *v, unsigned long *k) {
    9 m: l6 m# z# R( g- s/ R' I
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
    4 z& t8 r; A6 O- a
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ : _0 a/ h6 ^2 u$ _
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 1 v" r. x( p5 }* i: U
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ / W  o# {3 W; m$ C7 f# k* y; u/ E
  7.          sum += delta; # N. N. Q7 {' E- q. T1 g
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & H/ z" y* g: E# Q& b
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
    % T! b* m: O9 f$ n
  10.      } 9 j; i- s; h  d: R# t
  11.      v[0]=y;
    7 [5 m- n; \) O/ k( h
  12.      v[1]=z; ; S1 r* y) H2 Q& p2 e& D9 W
  13. } $ p! |( W, V5 r7 h
  14.   , O  i1 C, }! y7 ~% n
  15. void decrypt(unsigned long *v, unsigned long *k) { 4 R6 h8 F* a4 J/ B3 t6 |. @6 ^: h( L
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ 9 v  s0 z5 `( E' j* b# n& g
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
      Q$ S1 R" `2 @. P  a. ]
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    * x1 `" `. D3 p$ A/ U4 M0 Q, W' p
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */ / h- {, Q- t4 I9 e3 U
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    ' V4 G% o. i' w& h/ D6 M$ Q
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    / ]$ O1 V0 K+ W5 K8 p1 a
  22.          sum -= delta;                                /* end cycle */
    1 A1 z, j- B& I: \9 W. f  ^/ e
  23.      } 6 v* }2 N' q1 t
  24.      v[0]=y; ; U. W: j$ G0 `% U
  25.      v[1]=z;
    5 O$ r4 [* `+ _% V! i
  26. }
    : H; x7 U+ G& c$ @8 Z) N
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
# q* e( s+ Y1 H' @0 W/ A#define UTIL_H
1 u# d: R! E- K9 F+ F6 Q
. L! H' F! x  Q6 `* [+ u3 `- U#include <string>
3 Z6 t) H! O5 @1 C3 j#include <cmath>
( y  z6 e8 Q) `% h8 `: N#include <cstdlib>
5 A% p4 P3 D# v. m$ ~5 c4 j / g0 n2 {$ [  k' ~) ?" @7 n1 |
typedef unsigned char byte;
6 s: d8 Z$ _/ m1 q6 ytypedef unsigned long ulong; 0 ]+ T# R' G% n5 E2 U. H$ Z  c
4 [# t( D2 r, z
inline double logbase(double base, double x) { 0 l0 {) r: E2 Q% z
    return log(x)/log(base);
/ l3 }3 Q( n- G1 v; J7 g}
, t2 l$ d# p- C
! b0 s2 S( F% O& L& n" H6 F( ~/* , w" e7 L# N" Z& H# {& P
*convert int to hex char. ) l8 E/ f' t" w
*example:10 -> 'A',15 -> 'F' / E3 X% f, a1 F: q$ x4 P
*/ . B# {% I9 B# _5 t. J
char intToHexChar(int x);
* c/ _, O# Q' Q  y - B: R) n2 p! A1 x8 n7 r  N  B
/* 0 |0 J1 U' F7 [* b0 U+ d
*convert hex char to int.
& W( D6 X" ~/ a% @*example:'A' -> 10,'F' -> 15
$ P% H5 C' H' H, K*/
! m6 m) \0 j, m) {! `% }3 }/ E9 Aint hexCharToInt(char hex); # |% p4 U+ _! k2 ~1 T
# q! R- O0 s: W4 p4 ^
using std::string;
; E* |* r0 b; N/*
# ^- X6 Z) \9 F8 h" C2 j*convert a byte array to hex string. + H0 W: v( J, Q  l
*hex string format example:"AF B0 80 7D"
1 E: t% X" p9 E; D*/
( e+ Z/ a! B. @( q% O8 Sstring bytesToHexString(const byte *in, size_t size); 5 l8 D; k4 ~& D: v3 t- u& E

$ G6 @5 s, z1 d( q( j1 V# M( g- W/* % g8 L* ?7 p4 ?- v1 {9 h
*convert a hex string to a byte array. % Q/ ^0 \( S8 K5 }
*hex string format example:"AF B0 80 7D" 9 b/ y) S$ N$ T2 }0 E8 |/ B7 G# ~, `
*/
% D! `. s0 N) ]8 I% Dsize_t hexStringToBytes(const string &str, byte *out);
. N! r  K5 q/ T' S8 Z+ j
! O) F5 k0 {9 x, B+ {#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" # z$ j. S: C8 x6 l
#include <vector>
% e/ ]% ]' |, {  ]4 n$ }
( X7 W' D+ }, C3 t, O3 Qusing namespace std;
) Q: w" r, [/ q$ Z$ G
8 Z( V+ e+ i, J/ d# A  k) lchar intToHexChar(int x) { * Y+ V0 K9 q1 N% a
    static const char HEX[16] = { 9 m) r  G: K4 c# O2 _* F
        '0', '1', '2', '3',
8 \- q# k8 p! _# L. y+ x6 u6 }        '4', '5', '6', '7', * r) O, J! E1 q0 R) R
        '8', '9', 'A', 'B',
0 W" r$ g# W, c        'C', 'D', 'E', 'F'
! B+ ~& `# ]* y3 }0 Q    };
7 G1 e, |1 g6 d- |& T3 I    return HEX[x]; ' A( ?  j) R- }- B# M) `0 }
} ( N" a8 Q/ K8 E$ t& _5 i- P
5 N. L, W% w8 }% O) ~" J: z* c
int hexCharToInt(char hex) { : p1 }9 L, P1 e9 h3 `! y2 Q* O$ N' h
    hex = toupper(hex);
/ i2 T, i* O4 b    if (isdigit(hex))
; K+ h. q; k/ y7 o9 d0 j3 ~$ D        return (hex - '0');
* \7 C1 z/ P3 ?% }. C, i    if (isalpha(hex)) % n* E. Y! u- K6 Y! d
        return (hex - 'A' + 10); : y2 P( k$ `7 @' P$ i8 F
    return 0; ! x3 ~7 C& V3 P3 u% R2 n
}
( ?, n1 p$ y, n1 N2 h" c
7 B( f% H. `- a0 g1 qstring bytesToHexString(const byte *in, size_t size) {
: q0 l  _# W; G  }7 N    string str;
& d+ M, R4 `) t/ k) i) u7 G; t    for (size_t i = 0; i < size; ++i) { ' U, A0 E8 A  r
        int t = in[i];
! R  y  O1 M6 n7 W3 @. Q/ T        int a = t / 16; ( R% B% T" x, m1 i
        int b = t % 16;
; o  z7 {* l/ F3 r8 [; d8 y$ S8 s        str.append(1, intToHexChar(a));
! ~0 [9 s9 ^: O  r2 i& K        str.append(1, intToHexChar(b));
3 \. U* ~. K; o4 y9 \        if (i != size - 1)
& s0 d& B1 _4 z            str.append(1, ' ');
+ G- S* ?1 b& w    }
# C4 M' L$ N9 _' [/ k    return str;
+ D# Y6 ^+ ^* ~& D2 J% {}
9 r: C. G  |# Z7 O
+ F3 s- l0 D4 L) h. msize_t hexStringToBytes(const string &str, byte *out) {
8 H5 o6 G4 H! j5 \' f/ X . w6 T, b( V7 o* }7 t! b
    vector<string> vec;
+ E1 V  f* X* d* p7 W    string::size_type currPos = 0, prevPos = 0;
6 a6 b3 h! l) _2 w- i( H6 v    while ((currPos = str.find(' ', prevPos)) != string::npos) {
# r: ]% b8 C1 I2 i8 @3 Y        string b(str.substr(prevPos, currPos - prevPos)); # ?* M2 Y. ?3 O$ M9 B0 J# m9 ^
        vec.push_back(b);
+ h; H8 D; s% ]- B  Q, u        prevPos = currPos + 1;
7 e3 q- R3 Y8 r6 C$ v/ Z  @    }
- M6 v4 x) Q+ n* ?    if (prevPos < str.size()) { : z, |" ]: g; y" i
        string b(str.substr(prevPos)); & x. O4 A# o* a) _
        vec.push_back(b);
  A6 k# m# ?. x& V5 l. O    } ' d% i3 ~. }) r2 C  K$ T& Y6 {1 p. N
    typedef vector<string>::size_type sz_type; ; `4 L  X$ b' T9 n" s
    sz_type size = vec.size(); 8 w+ h; t2 p4 g& z& y
    for (sz_type i = 0; i < size; ++i) {
& Z1 i8 y! v4 G* o6 c" I7 R        int a = hexCharToInt(vec[i][0]);
  r% l3 X( @  o: W        int b = hexCharToInt(vec[i][1]);
; b- a5 I5 I: `1 P9 v        out[i] = a * 16 + b; ) V7 N# V2 h( G1 i
    } 5 N; h  Q: B+ m# _
    return size;
' N) ^( P5 b) q# X  c5 a}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H % m- i- d1 \# ]0 }
#define TEA_H 6 I9 U# v7 V# ]. ?5 S

) S  k$ }: @( a1 s/* % m9 `0 x5 L! c3 [
*for htonl,htonl
% ]2 ~& J/ g4 ~  Y0 _6 S% ?( [6 O) {*do remember link "ws2_32.lib" 3 ~6 ?$ S. [& [& @: t
*/
( R9 I8 j1 {$ f& [& W* }#include <winsock2.h> # A; W7 s# f& M( G. h
#include "util.h"
2 O% u8 b( o" U8 D4 @+ {
) @* ^% j! ~# [6 ]1 I6 D. e7 Cclass TEA {
* e/ C% H9 _& T8 u2 a; w# ?* y% Cpublic:
" {0 ]4 p( s# R1 ^: f# B% M  K    TEA(const byte *key, int round = 32, bool isNetByte = false); 5 K& @3 E, {9 V! ]
    TEA(const TEA &rhs); 8 R8 s# R* s* @7 Z7 V& ~  g
    TEA& operator=(const TEA &rhs);
$ X$ G0 Q$ \% p4 Z9 d' @5 a    void encrypt(const byte *in, byte *out); ! @5 D, A) `$ h4 C' m0 F( m
    void decrypt(const byte *in, byte *out);
4 l  [$ Q+ R, H% u- i) _+ p, Tprivate: 0 `7 G5 T3 i7 z/ B' O: k
    void encrypt(const ulong *in, ulong *out);
: H9 P* ~+ W5 b4 k& F& F& ^    void decrypt(const ulong *in, ulong *out); ; O7 L* T$ r- Z  G( d" N) S! q
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
6 W) q' R) p. n4 V    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; }
7 m# o, I# U4 ]% k5 z: G4 iprivate:
" j/ a- p5 A4 ?# W& l. w" ~    int _round; //iteration round to encrypt or decrypt + c9 E& z: Y6 ~, N9 M0 y5 h
    bool _isNetByte; //whether input bytes come from network ' c0 r; V. g% ^& W
    byte _key[16]; //encrypt or decrypt key ' `# q, G% I1 k, k9 d- ?
};
3 S# f8 F* X. V* t3 e  N6 u4 c
, y- z. S4 C: c! I2 s#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" * ?+ o/ ^5 M+ ]' M. A
2 #include <cstring> //for memcpy,memset
5 `! P5 S  V7 h( g 3  6 q4 v5 c) y  L- H5 h
4 using namespace std; ; _3 Y0 o1 _% C* P: ?' V
5  
7 I6 Y+ C  g: Z1 i 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) " [, n) @; S' G1 ?% L
7 :_round(round) 1 M" f. K  @* _( z
8 ,_isNetByte(isNetByte) { 3 d2 R: x# a5 G
9     if (key != 0) : R% z0 n: V  S% y7 ]% m7 `
10         memcpy(_key, key, 16);
  C- @6 ?) G4 [9 e! E4 q11     else $ g" i# J; M/ v/ l
12         memset(_key, 0, 16); 5 W) I5 @, S. _' Y4 Z; B
13 } ; j) s) {* W/ c$ [
14  , X- z5 B& t0 |( l0 X* ^8 _/ Q
15 TEA::TEA(const TEA &rhs)
, o; W. e' F0 w5 Z' {8 ^0 X7 q16 :_round(rhs._round)
1 F) p2 A! d3 C17 ,_isNetByte(rhs._isNetByte) {
% B" `3 I9 T8 _! N- I6 r18     memcpy(_key, rhs._key, 16); . b- x( P1 y) z: w
19 }
  \: @( Y$ Y4 G7 _# a2 u! n* y7 V20  - q  S0 y$ A0 j% G, g( o
21 TEA& TEA::operator=(const TEA &rhs) { ! v* S/ P8 f" K% k* k
22     if (&rhs != this) {
2 S0 E0 d; H. g% a4 W. f: N23         _round = rhs._round;
$ J' ^. x$ C. L7 X" h24         _isNetByte = rhs._isNetByte; 7 q. c8 P' k6 U" C9 E8 l2 Q5 {
25         memcpy(_key, rhs._key, 16); 0 h$ y& Y" Y. F; C$ _# r
26     } * i5 V; O& X5 I9 Q" [1 m) Y
27     return *this;
6 J& ^5 i2 s% @0 \0 C7 W4 L6 K. m28 } 8 Q* b' p  w" {- [  C3 [" A
29  " s9 o- f7 f4 b: Q# n% L) l
30 void TEA::encrypt(const byte *in, byte *out) {
4 U5 e4 @0 x  E- R$ G8 p5 Q31     encrypt((const ulong*)in, (ulong*)out);
5 Y8 Y5 l; ?% z/ K/ I, D4 d  K0 m32 } % W4 ^9 G1 Y) c3 l) r1 [
33  ' |: ?* R4 d- O. r7 o9 Y3 S, n
34 void TEA::decrypt(const byte *in, byte *out) { : @1 N& x+ F' x- ?  Q+ ~: H  Z
35     decrypt((const ulong*)in, (ulong*)out); 2 r; R) P! @& w" l! ]
36 }
  {# f% g: s) A& @* J37  
4 Z2 C6 S( p) R/ p" D38 void TEA::encrypt(const ulong *in, ulong *out) {
$ G% [" y( @' ?5 O39  ) i' h4 d5 r. f  k
40     ulong *k = (ulong*)_key; / k/ K  }9 v, v  _. B- \  v
41     register ulong y = ntoh(in[0]);
! a# V7 _" d  P) ~4 i1 |, a42     register ulong z = ntoh(in[1]); " [0 `7 i8 ]6 d7 N, j
43     register ulong a = ntoh(k[0]); : ^# ~: D0 O- t* V4 u, Z
44     register ulong b = ntoh(k[1]); . u7 V( E: j, [6 K- _, w
45     register ulong c = ntoh(k[2]);
( a/ Y4 Y& J9 y46     register ulong d = ntoh(k[3]);
6 s8 X4 B, y  n' a47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
6 q' X9 J# ?" X7 `8 K48     register int round = _round;
- \5 i# u8 g% ]) G+ _49     register ulong sum = 0;
) L0 c7 ^/ S% f50  
% `/ V) S: I7 H, z) P  W# m51     while (round--) {    /* basic cycle start */ 6 \0 a& @& N, ^; n8 S; U
52         sum += delta; ( @, C9 v+ H8 r4 R
53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
% g; x; T- j+ ?% h/ n5 O54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); & Z+ @6 b. r2 t0 A" e: w
55     }    /* end cycle */ 6 H( }" P4 ]6 g  _5 v2 f
56     out[0] = ntoh(y); ; Z$ B8 F" G5 h+ k1 f5 _
57     out[1] = ntoh(z);
5 @+ K: \$ _! ~5 V58 }
) X! d% Z3 \$ \4 a9 i59  
1 g( T3 |# L4 Z# ^" u( O1 r5 m1 J/ A60 void TEA::decrypt(const ulong *in, ulong *out) { & W; X" D* W& R& F# C1 D8 e
61  
) d, ~+ ~/ `; ?3 h, h- j62     ulong *k = (ulong*)_key;   M" f8 E' f! q7 z% F' C$ D4 u
63     register ulong y = ntoh(in[0]); . j5 d  s. B8 _( r; o  K" ]$ q) L
64     register ulong z = ntoh(in[1]); 8 V  l! s- m/ A) `. L
65     register ulong a = ntoh(k[0]); - G9 T& Y$ K, h( f
66     register ulong b = ntoh(k[1]);
" W( r" L/ U* G# f/ n' e67     register ulong c = ntoh(k[2]); & R$ q4 C1 n$ ^
68     register ulong d = ntoh(k[3]); 8 R2 ]; E; _: ~- u3 ]$ W
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
/ S$ Y+ W8 U- p0 r70     register int round = _round; % F6 E) N9 C2 @1 }
71     register ulong sum = 0; 2 Y5 a3 S4 i. c% d+ V; O2 D* J
72  
: _( X+ Z5 w6 l0 m+ d' f73     if (round == 32) , h, S0 j: f, y; w; s$ ?$ w
74         sum = 0xC6EF3720; /* delta << 5*/ 6 w% e: {0 s/ V. ?$ Z
75     else if (round == 16)
& V2 ?7 V4 [) U7 d+ _/ ]; d76         sum = 0xE3779B90; /* delta << 4*/
- d/ _9 q( K" m+ Z77     else + V! }: Z& V0 U- d. @
78         sum = delta << static_cast<int>(logbase(2, round)); 2 A. _; O# f( s/ B
79  
; C0 L' `, l, x& }6 o  a! ?80     while (round--) {    /* basic cycle start */
7 |6 Q' X+ t$ H, k. M6 j81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
3 d5 s3 P0 G/ B7 ?4 X, V82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
2 l" a8 z+ {$ t4 ~; f83         sum -= delta;
/ O9 y" k" }7 [8 y- ?% ?84     }    /* end cycle */
- m: J$ @) a2 b1 @5 G85     out[0] = ntoh(y); / n6 w/ P- C. ~1 ~- q' G7 W: \0 d  a
86     out[1] = ntoh(z);
8 ?1 |# s- C, q87 }
+ _- u2 B" d" r. u1 [6 O: l* U' E$ h, N1 ^# E$ x! h* g4 ?4 Z
需要说明的是TEA的构造函数:
% C" q) @8 d/ U$ z' NTEA(const byte *key, int round = 32, bool isNetByte = false); + r. z; `! }  e# D. n
1.key - 加密或解密用的128-bit(16byte)密钥。 ; K! [8 T/ a$ \: R( b- J2 `
2.round - 加密或解密的轮数,常用的有64,32,16。 2 @$ T, h" P# x* v1 G  G4 _( N3 v
3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! ( u: p$ K( B7 f
( E  u$ U8 m9 L
最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" 4 r! D* |0 N& a
2 #include "util.h" : ^8 z  T$ h; u; [0 }9 C4 H
3 #include <iostream>
& m; ^2 w' v7 f 4  
2 g) {# A9 {' s  p7 B' W( E3 r8 f 5 using namespace std; ! Y0 N& K$ `3 K0 `6 w, f2 o
6  
2 I' y1 h! o% Y% W* R: j 7 int main() {
4 @$ |3 S5 t4 I; s 8  ) x. m' `( ~& P  C
9     const string plainStr("AD DE E2 DB B3 E2 DB B3");
4 |$ A6 W7 c" t0 f, m10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
: k# i  S4 n% }/ X& b, E( O. y11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16; % w+ \8 o% F4 t. Y* k, v
12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY];
: Z4 V' i. c! R4 W# G! Z! m  e  k2 i13  9 q- b2 M! p1 @
14     size_t size_in = hexStringToBytes(plainStr, plain); ) x) x2 g; r0 G$ ~% t7 e+ V8 B7 Q
15     size_t size_key = hexStringToBytes(keyStr, key);
* c8 Z6 n1 G) \1 r" t% H16  2 p$ q$ y9 g$ t) b; l2 C
17     if (size_in != SIZE_IN || size_key != SIZE_KEY)
+ _0 z' V& ]3 n4 X& X3 f18         return -1;
$ M5 b. f$ }" n0 y0 q: s19  
5 N; f8 I" L  n3 h5 }20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl;
0 U; d9 o% C$ M& P21     cout << "Key  : " << bytesToHexString(key, size_key) << endl; ) V& D5 v1 L8 E5 Q% l+ e1 u- d
22  ) Z: t+ g+ q* C. i3 w
23     TEA tea(key, 16, true);
' f0 k2 @$ L: S" U' E# v24     tea.encrypt(plain, crypt); ( Q! r  l) ?( ]* B( q2 c, w
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; ' i0 Y- w; ?9 m6 A4 s8 _8 v6 T
26  
1 @3 |9 a( t) h$ R3 s9 C27     tea.decrypt(crypt, plain);
5 o& y/ w8 O6 c2 t2 Q: s28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
9 g# t9 L6 F3 A29     return 0;
1 }+ \! V! H5 ~5 E30 }
7 _4 S2 k& u0 b* t* i+ o) |+ `
" k: o( g: w% N% l  J7 F# j本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx3 G6 J3 r- e' Q; W  }
运行结果: 3 q5 e" ^7 H/ n7 A
Plain: AD DE E2 DB B3 E2 DB B3 # U3 F2 ?. A! E8 B* x
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
8 j: a5 T! m$ a' X5 GCrypt: 3B 3B 4D 8C 24 3A FD F2 , P  [2 w- m4 m# W
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 02:41 , Processed in 0.019313 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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