找回密码
 注册
搜索
查看: 37046|回复: 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轮):# }! h4 S4 w+ p; ^9 a% e
微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
3 O0 z( N9 V7 [, ]; ~1 H9 GTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
& }4 o4 G& E0 o% U$ x1 i之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
, `" ~  z$ g4 Z5 J在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 " H! R6 i( N6 g3 e  {( ?" J4 k# |
在 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. 0 C& `% L$ w/ p9 I+ [* \/ d% j; j
  2. void encrypt(unsigned long *v, unsigned long *k) {
    / W; K$ I2 m9 x5 ~
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 9 }; b0 I0 R; u3 c( ^
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */ % J: k  p5 k& a, M1 U, h: F" P
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
    2 o/ f0 l7 ^9 C* H9 S2 B9 s: K
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ * ~5 H* [# x; D, [/ d  L
  7.          sum += delta;
    " q5 [% u- b: |* o9 k
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    5 V  C3 w8 }% g& ?% ^
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 2 K4 c' j% y( q% n" J! J
  10.      } # _* t) A6 i6 x3 }3 j
  11.      v[0]=y; ! w1 y- M. Y8 T' ^+ Y
  12.      v[1]=z;
    , b8 K9 A  F+ {
  13. } & Z1 V6 ?) a3 F4 z- ?5 |
  14.   
    6 y/ C) C+ R$ C, j; }* `  k
  15. void decrypt(unsigned long *v, unsigned long *k) { - m* y& V- ^% R. _& s5 \: E2 q
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */ / ~' }  L5 v) j6 o
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ 0 d6 b2 P' t2 T1 O0 y. P( Y8 z0 B
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */ ' h! ?7 _6 s) f
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    8 F3 @; J9 X2 w& s0 Y9 D
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 7 ^4 Z8 \7 a5 S7 e& g# f8 a6 q1 t; p
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); 1 ^! [7 S* U* w( o8 x
  22.          sum -= delta;                                /* end cycle */ 3 m. Y5 y7 e3 n, S& K+ H
  23.      } " J8 `) K2 e0 |3 @2 j! d% p9 E
  24.      v[0]=y;
    % L- N$ W  K/ G% Q
  25.      v[1]=z;
    " a, J; p) H) R
  26. }: N1 Z2 {, \9 z% ]
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H , d' H2 H, q3 `* P  e& R! D
#define UTIL_H
7 q/ D. G. h" [  Y3 g) ^& ?  T# e9 T) t  I  p. h
#include <string> & g' E5 x" |$ c! z3 K/ E$ v  `
#include <cmath> 5 A! t4 ?  k; H! R
#include <cstdlib> 7 m2 ^! F0 ~! I, C' @

) O- f6 p9 w. atypedef unsigned char byte;
% U6 p8 t; g- G; ~- X" ~typedef unsigned long ulong;
1 S+ ^% V" A% B1 U, U8 Q
4 L6 c& T" F; I3 J. `- \, W( }inline double logbase(double base, double x) {
' ]$ J& d& ?; E: |' A4 ~    return log(x)/log(base); 5 v" k& g/ }* |8 u
}
! C; \" n/ U% |- T% ? . q: L, ]5 c( X2 B. z3 C+ \
/*
4 l4 [2 \# Z, x; q' g*convert int to hex char. 2 E% `, \" S" Y; S2 V1 d
*example:10 -> 'A',15 -> 'F'
! S" b8 _; I! Q" A  F7 `*/
1 X! `! ~2 H0 u; Y2 _char intToHexChar(int x); # d- d. C6 P8 m, Q: J2 G

% F( w" |4 n& }2 j, H/* 7 C! i' H- s- }: A" Q
*convert hex char to int.
+ m5 J9 b4 |" |% k. X*example:'A' -> 10,'F' -> 15
( s% P+ h! c# n1 t" X: t3 P) f*/
4 x6 m; ]1 I8 D* \7 tint hexCharToInt(char hex);
2 [6 R/ t. g/ ^' b! c
, Y' ?* H+ j( F8 ausing std::string; 3 r3 G1 v- J% ~2 T- ]1 ?
/*
# E" Q' `: c, l*convert a byte array to hex string. 8 @# @- ^3 D* q  ]
*hex string format example:"AF B0 80 7D" ( t/ B6 y: A9 K) g' L0 U' H
*/ 1 v) n- B1 a* {4 ~, }4 q
string bytesToHexString(const byte *in, size_t size); 7 z! o$ B) b  I3 N. }: w
3 e6 U( p$ k: q6 _+ ]
/*
9 B3 R* h; j) T0 y5 B  Z*convert a hex string to a byte array. $ O6 i7 O3 v$ f/ F
*hex string format example:"AF B0 80 7D" . l6 D" W1 ]$ `+ \- p! r4 E8 Z
*/ + J% I$ ]% u! i. f" R( h5 B
size_t hexStringToBytes(const string &str, byte *out);
8 U- G9 R3 j' h/ k# [ % Z  b+ Z9 n( L- R
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h"
* O" `3 ?; P9 ~4 g4 c! f#include <vector>
0 G: {) E3 K+ Y; N. d4 |. l
" U: e8 |* _7 {3 H( U; jusing namespace std; 7 R' O" {! T5 A8 k

$ ?% V- E5 i- o3 J+ Echar intToHexChar(int x) { 4 m$ O( w$ \1 s" Q3 @
    static const char HEX[16] = { % F( O: M1 m" x/ k
        '0', '1', '2', '3', 4 c3 C6 m# c3 g3 M' S; M6 l
        '4', '5', '6', '7',
, l0 j4 D' V8 \- u1 ]        '8', '9', 'A', 'B',
6 X5 D1 n( F1 `3 w        'C', 'D', 'E', 'F'
  s0 a. ?9 s8 G# K    }; ; B/ v1 H& T) A
    return HEX[x];
4 V3 Z# e9 q7 x* {" p} ! U& a, A: P" k' Z4 t' f# O; M/ m
7 a/ P4 A) @& {" b2 F$ u) h+ ?
int hexCharToInt(char hex) { " a" y! v% z/ o$ r
    hex = toupper(hex);
6 O6 `# |- [9 ~# Q8 j    if (isdigit(hex))
8 ?* D4 Z2 N( G: Y        return (hex - '0'); 0 i- ]& M$ z; M' ~" g8 Z
    if (isalpha(hex)) 5 p+ X& J' X# F& F: g
        return (hex - 'A' + 10);
8 w8 v0 L. w/ D  Z    return 0; ( Z! H; D% c/ B$ Y' w# W+ F/ `
}
: ?% E( }- ?9 S
" @3 R+ S( O4 @string bytesToHexString(const byte *in, size_t size) { " R3 O2 K( o8 [, Z% x; [8 i& {
    string str;
. Q7 h( B; _& {+ h7 m' Y1 J    for (size_t i = 0; i < size; ++i) { ' Y8 B5 g2 f5 u" w: I$ Q
        int t = in[i]; ; ~/ P/ u9 E" C! Q+ H- N7 X
        int a = t / 16; 5 h: c. F" i( X, m
        int b = t % 16;
) _, @, n( X, V) k        str.append(1, intToHexChar(a));
# L) @/ `; @, z. Q! f2 s4 H+ G        str.append(1, intToHexChar(b)); 6 k4 ^- z, a- z1 d/ W& j) p$ S: h- }3 ?+ @
        if (i != size - 1)
2 P+ G/ L; i  z  \' {: ^            str.append(1, ' '); 7 F7 J: b, Y8 i. }" {. {
    } 8 w% P' L$ q8 e; [+ V
    return str;
4 y" |* T; T$ f& @  O# A. w9 u} ' m4 X7 v& a6 C' w
$ n; w  l" p. ?5 P$ ?( x+ b5 F
size_t hexStringToBytes(const string &str, byte *out) {
5 o" m) _& E# ^$ F+ r
# n& {8 a- R) v3 V% Y    vector<string> vec; ' |8 d# l! x' t6 b6 K& u* v
    string::size_type currPos = 0, prevPos = 0; 4 V. F+ ]/ u' M  y# j
    while ((currPos = str.find(' ', prevPos)) != string::npos) { # w3 S( w* v  _
        string b(str.substr(prevPos, currPos - prevPos)); " c/ I) }$ |7 J9 l% }) K
        vec.push_back(b); ) y7 y+ k) t" c- I! t1 v2 Z; @
        prevPos = currPos + 1; - H& i' U  A- Y+ `1 \
    }
- x6 e: a! e& [: f" E    if (prevPos < str.size()) { / `: M2 X, ?9 x0 n
        string b(str.substr(prevPos));
8 }& y$ ^6 g, f: A4 `        vec.push_back(b); 2 S3 Q  ~' C$ w
    } / a# p( b) Q0 S7 ]6 f
    typedef vector<string>::size_type sz_type; 1 a/ K9 v# |! C8 E" X/ a
    sz_type size = vec.size(); . \. o2 g+ P, c( r2 H. }
    for (sz_type i = 0; i < size; ++i) { 5 W- b0 d! J: c1 T" f! D
        int a = hexCharToInt(vec[i][0]); 6 ]9 f# C6 j# W( q7 Y7 b
        int b = hexCharToInt(vec[i][1]); ( m4 i* u% U1 [6 K
        out[i] = a * 16 + b; # o5 s2 s" Q, F8 S
    }
2 H; R+ \& U" g6 D6 ]' N    return size;
* S( W6 x. @% j$ l. M}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H ( l. B( G  k5 j' f6 X7 r0 W* ^
#define TEA_H
( U, \7 w1 _$ A  W' X; O- L
3 c+ Y( n7 a: @% m( G/*
( |1 r( _& @+ s*for htonl,htonl
$ r5 V' x/ u. R*do remember link "ws2_32.lib"
8 W3 v; F$ s( z) _*/ , d# ^, d9 ^8 P9 _
#include <winsock2.h>
" ]3 @$ \& U: }% T$ S+ Q#include "util.h" 5 ?2 A4 e; P" x. @( v/ i+ J0 b
" r+ g! M& M" q, Q# N- ]
class TEA { 6 Z" M4 t* d. [' R" `; f# q
public: 8 @) d/ F" _5 L) h9 ^
    TEA(const byte *key, int round = 32, bool isNetByte = false); ; J3 v; H. t* u0 k, ~+ K
    TEA(const TEA &rhs);
( b' T7 I4 e: u. I  [- ^    TEA& operator=(const TEA &rhs); 7 D* q! h; R$ Z2 K* O- C3 g! p+ M
    void encrypt(const byte *in, byte *out);
9 I" e% Y4 ?; H/ a7 Z2 T    void decrypt(const byte *in, byte *out); # w6 W# H; o9 [3 p, g$ {
private: * Z9 s% Y" R  {4 n6 ?8 l  A9 h1 D
    void encrypt(const ulong *in, ulong *out);
' h! N* T. C+ x$ i    void decrypt(const ulong *in, ulong *out);
" ]3 v# g8 B/ Z& X; V; i. q    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; } 4 ~' v, x* m, Q3 t
    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 6 }! K1 s/ I* t; [3 u0 v
private: + ?! V3 E3 T  j  M
    int _round; //iteration round to encrypt or decrypt
7 D3 n' H# K. l    bool _isNetByte; //whether input bytes come from network ) J* i. X4 {7 b# b
    byte _key[16]; //encrypt or decrypt key 4 H8 h0 u* a) k. d. z. Y
};
! E/ H. y# j$ K% |2 z0 Q% K' d5 P ; z) a& W* x1 d) s3 q0 v! a! ]0 W$ w; C
#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h"
! e' y+ q4 ]8 }  X 2 #include <cstring> //for memcpy,memset
  T+ w6 w- o4 U, U5 F$ D 3  ) G) F# @: I" ?$ j$ l4 Z
4 using namespace std;
8 O0 `" E% I4 z1 t2 h 5  
; y6 n2 l' g' W( `: [. T 6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/)
. c0 L- c1 c" A' _: S+ N 7 :_round(round)
1 ]4 I# T) N% B0 M 8 ,_isNetByte(isNetByte) {
6 U) o4 {; o2 s 9     if (key != 0)
& C) c2 r1 |9 \% [2 i, ]10         memcpy(_key, key, 16); 8 t2 ]9 c* A' t) `
11     else
% P! N/ }- f" I5 e12         memset(_key, 0, 16); 2 U4 T7 J8 Z# V) `
13 } 1 r3 D2 F& W+ Q
14  4 @8 ~: H+ D5 I$ k8 `# ~+ i% \! f
15 TEA::TEA(const TEA &rhs)
; J! Y0 g8 n  i16 :_round(rhs._round)
: X! K6 C" P. h) w, k$ H( R& }17 ,_isNetByte(rhs._isNetByte) { . k3 {; z! k5 Q5 R( L' B; Z
18     memcpy(_key, rhs._key, 16);
  V. v) ~( U" o: w/ @19 } # U2 G: d  h/ O
20  
" Z( T5 ?- j. W' F1 \6 M21 TEA& TEA::operator=(const TEA &rhs) {
9 H+ r# W& C: g22     if (&rhs != this) {
: j' w$ ]! n- [, H23         _round = rhs._round;
9 A/ m; t3 W* q' e9 W24         _isNetByte = rhs._isNetByte; 8 {$ h! m7 [0 j- D  C
25         memcpy(_key, rhs._key, 16); 9 L- a( }0 o9 T  O# H3 H5 i
26     }
! d, m  E& z) ]+ h7 ^% E2 u$ d27     return *this;
4 ]% ?+ Q+ W0 o# Y28 }
& b% ^% ?- r2 C8 h; p3 s29  9 a1 d" _% G) t) L
30 void TEA::encrypt(const byte *in, byte *out) { % t* Z3 f& s6 s
31     encrypt((const ulong*)in, (ulong*)out); 1 x+ E( ~5 `& u& i: C) [" X
32 } + e9 a1 I, H6 x& F* [1 H
33  
& x+ m  `, {" o6 e8 j34 void TEA::decrypt(const byte *in, byte *out) {
- X/ s/ A6 t) t) |" [0 @35     decrypt((const ulong*)in, (ulong*)out);
; |" c' f/ I+ T4 [8 X2 a6 ?4 ^36 }
4 F* k" k2 P1 N/ {2 h37  - ]1 s& r) f) ]
38 void TEA::encrypt(const ulong *in, ulong *out) {
5 q! Z- c' J$ @2 Z/ P8 s% U& h, |39  . h# k, n1 B" _) y6 ?
40     ulong *k = (ulong*)_key; ( N* u) f' `: N
41     register ulong y = ntoh(in[0]);
1 e4 ~: v7 `1 z8 H3 p42     register ulong z = ntoh(in[1]);
( B& b; Z4 A* P, q1 _3 C3 \; @43     register ulong a = ntoh(k[0]);
' U5 K  n2 \' @5 E8 Z. q- }3 t44     register ulong b = ntoh(k[1]); 7 V: o5 p0 Q0 ~- p
45     register ulong c = ntoh(k[2]);
% S+ k$ O" l6 v, l! b/ b# _46     register ulong d = ntoh(k[3]); * T7 K: j+ x/ R1 l8 I
47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */
1 @% g( l. ~) n48     register int round = _round; $ v1 m# z4 ?" U! |! Y5 u7 J: h
49     register ulong sum = 0; " r/ k, J; A* ^6 P% F2 i! m
50  
+ _; d3 f0 u$ Y+ h8 n51     while (round--) {    /* basic cycle start */
  v& @& V5 P6 V: @: q52         sum += delta;
  c5 ^% R8 e- N+ Y! F5 W6 \1 M53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
; Q/ t  J* Q6 u% z' r- x54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
7 _. V# @+ p% W+ h" a0 ~' f. d55     }    /* end cycle */ , r- {, B+ m9 R" X# P4 l3 Q* g2 O
56     out[0] = ntoh(y);
2 p# P/ R3 ^6 Q57     out[1] = ntoh(z);
# f  e% j* a) i) g& Q4 `# a- m58 }
4 [& `$ `2 k& ^9 h59  
4 n0 A7 j' E" P0 Y8 [60 void TEA::decrypt(const ulong *in, ulong *out) { $ w2 W" M+ U+ A/ q* g& w3 V6 V
61  8 ~: r3 ]- j; U' b, G5 J  t' f
62     ulong *k = (ulong*)_key; ! ^3 l! A8 w9 ~  k# j" S( i. x" g
63     register ulong y = ntoh(in[0]);
5 y+ G% U2 E% R# l/ w64     register ulong z = ntoh(in[1]);
1 s2 [) M2 F1 B. e  n: [" f65     register ulong a = ntoh(k[0]); ; r3 \% {4 V4 {, f! c% p' ~0 ~
66     register ulong b = ntoh(k[1]); / M) u3 e, T& b- n
67     register ulong c = ntoh(k[2]);
; L" {; D2 T: E2 M6 |, U68     register ulong d = ntoh(k[3]); 6 t1 Z2 |% @" V, Q
69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 8 f2 `- _6 X* j& o" f+ b  x6 ^
70     register int round = _round;
  I4 D; b' b3 d( g9 k2 ]! d71     register ulong sum = 0; 4 T7 v+ u" w$ m3 G( N/ c# M1 n; X
72  
$ k! {+ o, e  W5 A73     if (round == 32)
: T/ B" s% n: t. A. ^6 f2 a" C6 }% Z74         sum = 0xC6EF3720; /* delta << 5*/ 7 t7 ]4 `1 o! H4 ^- P' f! y
75     else if (round == 16)
. W  D1 D) f4 D5 E* C76         sum = 0xE3779B90; /* delta << 4*/
( d# }2 c" E/ @3 a5 B' t* Q3 i77     else 9 |% m( d6 O- U# W1 m
78         sum = delta << static_cast<int>(logbase(2, round));
& ?% T6 X' e5 }* `- Z2 A3 \! l79  
; G: x( v; d  }' a$ M4 z3 ]80     while (round--) {    /* basic cycle start */
7 H- a& \, a) H81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
) c' t6 z% j8 q9 n% d82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); ; j! `' c: E; N, d9 f
83         sum -= delta; & @- T" [) Z- N; r# O$ u# p# `
84     }    /* end cycle */ - Q' Z3 }  m! e, Q* u  P7 g6 }
85     out[0] = ntoh(y); , C" n# ]- [6 z5 ?
86     out[1] = ntoh(z);
3 [1 q" U8 u0 m& H1 x8 l8 i87 }1 c- q& }6 P/ v. B: u- @$ T
: l5 [( i+ Y8 t) Y$ ?$ a
需要说明的是TEA的构造函数:   X5 S9 {, @4 R2 W$ `
TEA(const byte *key, int round = 32, bool isNetByte = false);
7 f* Y3 Q3 S- R- `  Z1.key - 加密或解密用的128-bit(16byte)密钥。 0 U" J) d2 E! l
2.round - 加密或解密的轮数,常用的有64,32,16。
. t1 R; @# g8 w6 w/ D+ m; `3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的!
( q1 }" }7 P- {* I2 }* a! g/ z) P  {0 J
: Y' ~$ ^2 E: L' P8 C' |5 \最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" ( x4 D' _8 k2 E+ c
2 #include "util.h"
2 x1 f+ S' ^% Y( A, d+ C# J# Q0 } 3 #include <iostream>
. l: _. _+ a  ^0 ~% x& M 4  3 f% k/ j& C. n1 x* t
5 using namespace std;
5 _2 f( C, A* O& K3 J3 K' G: H 6  0 Z1 g+ l9 P+ H4 f6 ^, W
7 int main() {
0 X* j+ E, v- B4 s2 V 8  
; i  T; x) V0 }7 C  T 9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); 2 V! r7 G0 w$ C9 V- T- }  F: u0 _  m$ v
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4"); 1 }3 c5 M/ H+ y: Z1 j
11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
8 p& F0 Z$ C, N- n1 a. }% e8 t12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; 6 Z  i7 W  B" Z0 ~
13  9 J0 x# Q- F1 G0 K  g% {2 @
14     size_t size_in = hexStringToBytes(plainStr, plain);
  g' o. Y2 j+ n3 S$ Q15     size_t size_key = hexStringToBytes(keyStr, key);
. A6 i+ u5 N+ d7 m3 I! v; f16  1 s0 e, G, j+ `
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) " v$ O/ q; X% {) `2 e% A4 E3 M
18         return -1;
9 u3 }0 D. @3 m; Z, m1 W19  + b# n* _% w4 {3 m7 P
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 4 `% Y( ]/ q0 @
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
" s& g5 |1 a0 o4 q/ o: t22  
! ~7 f5 f1 W- w7 I( s# D) V- n23     TEA tea(key, 16, true);
* O+ A' ^% Z9 r6 q24     tea.encrypt(plain, crypt); 0 K* G7 v; x7 u; K% M. a  \% \
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl;
6 u& r8 n  `; z) b: t/ N- o; h26  : ]8 `0 t7 W  c* @* l1 a  q. }. `4 s
27     tea.decrypt(crypt, plain);
7 v! n8 @! c4 g( w! [6 L$ d28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
, f! G" ]; m6 I29     return 0;
5 K# k7 k/ K. T30 }
6 I' e9 X. Q4 j  n+ ?5 t6 h  S$ n
) h+ f% a. }  F8 ~: V4 r, o本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
- {/ G' X6 ]1 f5 M) B. e; ~运行结果:
$ J+ Q( ^0 C. ]: H& g$ _1 L0 lPlain: AD DE E2 DB B3 E2 DB B3 6 R3 l3 P# P+ ^' X4 z
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4
  k  e( Z. Z+ C7 }7 y6 vCrypt: 3B 3B 4D 8C 24 3A FD F2 ) {, f/ X1 y! J
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 16:49 , Processed in 0.045377 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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