找回密码
 注册
搜索
查看: 37517|回复: 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轮):
" E5 k; H8 [; f" S微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
* F7 \( L7 o: Y! w  G  vTEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 3 s& B2 h8 N9 f9 l/ D- Q) y+ T
之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
7 A/ Q7 T/ t! S在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。 " ~# {$ q% w) U% U
在 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.   A5 c+ N& f, H8 q. x
  2. void encrypt(unsigned long *v, unsigned long *k) { ; P9 ^$ O! Y6 I4 f" O; {
  3.      unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */ 3 h# P/ Q% _4 s9 e3 e
  4.      unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
    . ]+ v% w4 J- Y5 l
  5.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */ 4 Y5 L: p+ q. M3 B
  6.      for (i=0; i < 32; i++) {                        /* basic cycle start */ 8 E; b. ^% y' j( C- L4 S6 H/ |
  7.          sum += delta;
    ! Z* K1 M) }: |
  8.          y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b); & y: f, h, i: H
  9.          z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */ 5 U# G' O6 ^, G9 z! H" x0 V
  10.      } 8 g" K7 \7 Q7 v2 ^  _
  11.      v[0]=y; 9 |' u# ^* ]6 L% ^5 y! ~3 U
  12.      v[1]=z; * k/ @% i4 j" N
  13. } ) I6 B; M: S7 U4 t, Y
  14.   1 h! W7 l) U+ m% O! V0 G
  15. void decrypt(unsigned long *v, unsigned long *k) {
    ; U- p0 o. v2 Z; l
  16.      unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    / u' {  g% y, Z
  17.      unsigned long delta=0x9e3779b9;                  /* a key schedule constant */ , d( ?2 o2 D8 ?- v% D& `1 J$ N4 z
  18.      unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    " _2 k' M+ o; {: Z, M& I
  19.      for(i=0; i<32; i++) {                            /* basic cycle start */
    2 D# ~4 B- ?. J; i0 S
  20.          z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); 9 @0 f9 Y9 h( |2 V' |: D2 P
  21.          y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    ; y( I; u1 q- X0 g5 R. Y1 Q; x# H
  22.          sum -= delta;                                /* end cycle */ 4 D1 F5 |$ T) e3 t) Q
  23.      }
    4 e- [2 F; R4 ]& F, w6 c
  24.      v[0]=y; . G+ w7 f. x% Z: P8 Q1 W
  25.      v[1]=z;
    " T3 w% A& _. n
  26. }8 u# t: Y/ ^! D' W
复制代码
C语言写的用起来当然不方便,没关系,用C++封装以下就OK了:
回复

使用道具 举报

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

unit.h

#ifndef UTIL_H
, H0 n6 u9 G" S3 v- C2 `#define UTIL_H
+ t/ Z" s5 I( R( ]# F$ V1 u3 x2 |
#include <string> 1 M, \" s1 D! R
#include <cmath>
) U/ U% Q2 ^' _#include <cstdlib> 9 N9 Y7 x# Q, C7 e& F

' ]. {: A% q/ d: f( ttypedef unsigned char byte; + c6 m5 J/ z: ^6 @5 c
typedef unsigned long ulong;
& W7 I- T/ X; o: R4 Z % ^# S1 U1 x) K3 D
inline double logbase(double base, double x) {
  Y  W  J$ ]" D; e5 y% @    return log(x)/log(base); % S2 J; n' B7 S' ^9 ^& k
} " l5 c7 Q' p/ w1 S' n' O- h- N! w

0 Q2 r" W. r/ O5 a& l' {+ {/* " @, x6 z7 z" q
*convert int to hex char.
! ~0 \* a/ n' e* s*example:10 -> 'A',15 -> 'F'
0 J( e6 w. S' V% [4 Y# P* P9 ]# k*/
# |8 l/ t! O: X3 @; ~+ ?char intToHexChar(int x);
0 c+ y2 j# D% c. G
+ K( a. }$ |; s( B9 Z/*
. p8 d+ V! P) T( {5 `* i4 J- @+ |*convert hex char to int.
( J7 m. P& n0 d7 Y3 O*example:'A' -> 10,'F' -> 15 ; T3 \# w$ R: x# I
*/
6 w0 E: B' A2 Z' mint hexCharToInt(char hex);
% X" z4 n% q2 {0 k. n$ d  R' g
8 ^" i; Q7 _. Q# Yusing std::string; - ?; R7 o. @1 A, K( Q
/*
" _+ J0 ~# D; x' T4 O1 y  ]3 Y*convert a byte array to hex string. 6 a8 h- O2 ~2 w8 d! X
*hex string format example:"AF B0 80 7D"
& j/ P6 d- T+ F. J( r6 N. L*/
. L/ {3 w3 z' G0 R* f+ tstring bytesToHexString(const byte *in, size_t size);
) Y, Z& F% b% H- A% w1 {
( ^5 D* i# L" {% q/* % u9 x0 C8 R. e* Y- |0 g, I. R
*convert a hex string to a byte array.
$ O9 @6 d  _7 z5 b*hex string format example:"AF B0 80 7D"
, k2 {$ y+ _7 b*/ 2 l  H) e  x3 [4 A5 i
size_t hexStringToBytes(const string &str, byte *out);
2 `6 j" N( N2 J/ S3 o 7 k) @& H6 A1 t- ~& h
#endif/*UTIL_H*/
回复

使用道具 举报

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

util.cpp

#include "util.h" 7 E; X0 y4 T: y! i) ]
#include <vector>
% `. `, B) W' [9 D 4 Z+ L2 k/ Z6 @; S! k  U# I
using namespace std;
: }' z. G( B) h7 c 0 }$ |" Z" E1 ^5 ~( o; G. T! k3 k
char intToHexChar(int x) {
) j0 z( {3 D( R' s5 t, j    static const char HEX[16] = { 5 Y8 I) v% f% O4 v( }& W  i
        '0', '1', '2', '3',
4 |  \2 A' P0 K/ H1 t        '4', '5', '6', '7',
/ L3 }7 E# e- A) x4 n$ R        '8', '9', 'A', 'B',
" E- ~$ Y# A: }& N% l0 w; v. `0 z        'C', 'D', 'E', 'F' 4 p1 ]2 U' g4 Z1 |0 F5 E% U
    };
, v( ?) g, L1 e) i8 x+ E- c    return HEX[x];
1 P1 O0 G" f% Z( d& g8 `} ' `/ m" d3 _1 w/ L' f5 W( U5 U

4 _# m& k) S! A9 `! q" ^& ]int hexCharToInt(char hex) {   w$ t- f2 y4 r0 M3 y1 y9 b1 c
    hex = toupper(hex); # C+ v& |* g* G/ e
    if (isdigit(hex))
% B1 y& m7 k' W0 O& k- `        return (hex - '0'); , V+ h. m6 L2 d0 @7 @8 L: p
    if (isalpha(hex))
& u- L7 ^8 W# v" h. N        return (hex - 'A' + 10); * q2 X) e0 y- J6 d
    return 0;
1 _; ]% J2 m, w! Z# d! i}
/ p! G) B; V& V8 u5 ^
3 G- j, ?7 x4 m2 ]string bytesToHexString(const byte *in, size_t size) {
" q: V$ ~, ^) Y7 l5 Q$ s0 I6 E$ M    string str; . w. |8 `7 u+ }) n5 X5 I' d
    for (size_t i = 0; i < size; ++i) { * e5 \$ C: M9 Q1 R0 S, C
        int t = in[i];
# N6 E1 E! {# e        int a = t / 16;
; o8 J+ d  d- H4 L2 s        int b = t % 16;
  b7 O. g3 L6 O; k, r% ]6 K* ]1 u        str.append(1, intToHexChar(a)); + c0 g. C3 _( \' A* C
        str.append(1, intToHexChar(b));
  A/ I8 ~! j5 T) D: K        if (i != size - 1) ' d5 D9 U3 y4 [8 q1 F" _
            str.append(1, ' '); , \5 w+ p6 T% |4 C2 d
    } 9 ^5 o& T8 e3 h
    return str; 0 e( G% j; Z& H( W* F
} $ t* _2 ]- Y( b6 N: J  ~
* v5 G: q/ W5 I. Z
size_t hexStringToBytes(const string &str, byte *out) { % a. X# \, G$ [3 ^8 H) ]

/ ~- T5 ~! D8 A3 {    vector<string> vec; : z5 H4 l' e" a
    string::size_type currPos = 0, prevPos = 0;
5 W: B9 l  F4 N% F    while ((currPos = str.find(' ', prevPos)) != string::npos) {
) H$ O- H' @6 a- z% j        string b(str.substr(prevPos, currPos - prevPos));
; k, ?) s/ }2 a& i" U& _        vec.push_back(b); - ]" n3 F9 P. K5 L6 ]* v
        prevPos = currPos + 1;   ?" H! G" U2 z, d
    } - p0 H0 A' r! I/ x: S7 r
    if (prevPos < str.size()) {
0 R" T: ^7 |( h/ J; i        string b(str.substr(prevPos));
" \5 @8 S1 |9 l9 J+ D        vec.push_back(b);
1 t- K2 L$ d" F    }
, I" O" k9 f4 h3 n1 ?8 P    typedef vector<string>::size_type sz_type;   e0 C! L$ s3 r. m& ?2 w
    sz_type size = vec.size(); 7 D4 H, m5 K' K' M- p
    for (sz_type i = 0; i < size; ++i) {
4 c2 Y+ t6 v3 o* @        int a = hexCharToInt(vec[i][0]); . s; ^5 M; Z. E) M6 t
        int b = hexCharToInt(vec[i][1]);
1 o2 F  b) l% n        out[i] = a * 16 + b; * E( g1 _- v6 W* v. c9 c0 M
    } & _2 J0 k2 ?& c4 y) H6 C
    return size;
2 s+ F' q, E$ T}
回复

使用道具 举报

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

tea.h

#ifndef TEA_H
* ~, u3 }' ?1 \6 @$ }$ u#define TEA_H
6 V' M5 C2 f8 \3 M2 A6 J " L6 ?' W0 |0 i5 G' `
/*
0 c2 t+ T7 a- M( |  D$ C*for htonl,htonl
' s7 `  ]3 G+ P( N1 A* b*do remember link "ws2_32.lib" + L: K) K" N1 g  W2 x7 E+ I/ m
*/
2 }6 n4 g2 c1 N- t6 |- N0 E+ N$ i#include <winsock2.h> ( O! ^! X7 E  R) G: ~
#include "util.h"
: w" |0 k9 Y: o3 q% a8 G
- M8 W! P) d) H5 |' Aclass TEA {
7 @, w  r1 H" t% j, z! xpublic: 2 U: Z% j+ G% U; _- k+ q
    TEA(const byte *key, int round = 32, bool isNetByte = false);
% a8 `7 X% S% z; }2 {9 U; [2 J- W& M    TEA(const TEA &rhs);
+ v/ W1 O3 P5 M4 C5 i. J- J    TEA& operator=(const TEA &rhs); ( y7 a/ z) k7 _7 ?$ ~
    void encrypt(const byte *in, byte *out);
( @# }  o8 P$ Y4 Z    void decrypt(const byte *in, byte *out);
4 ]5 i* w# B$ d- Hprivate:
5 a( Q6 X" H/ T9 V    void encrypt(const ulong *in, ulong *out); 6 C/ g. E- d9 R$ l/ O1 l
    void decrypt(const ulong *in, ulong *out); # @6 k8 x, y) ?
    ulong ntoh(ulong netlong) { return _isNetByte ? ntohl(netlong) : netlong; }
# I( k: `' R, w" o: V$ U    ulong hton(ulong hostlong) { return _isNetByte ? htonl(hostlong) : hostlong; } 0 @9 c1 l- S  U# ?
private:
' W& o- b3 Q; i( a5 d    int _round; //iteration round to encrypt or decrypt
; I' T) ?" [, q1 S3 a" }6 a    bool _isNetByte; //whether input bytes come from network
0 q, M0 H9 T' f! q    byte _key[16]; //encrypt or decrypt key ' I( R  P. s( B3 c! U
};
, Q/ U) n. y: j1 v7 B1 K( p- b
% N( M  ~7 T5 ?4 {+ I2 Z#endif/*TEA_H*/
回复

使用道具 举报

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

tea.cpp

1 #include "tea.h" ) U% U, T4 w9 Z/ l# T4 {5 B
2 #include <cstring> //for memcpy,memset . U* w( N: L( Z( z
3  , q4 H, E9 f. i! E2 v  x
4 using namespace std; : ?8 ]' v" D" D& X) n0 G) A
5  / W2 K7 d5 I, v% `3 n
6 TEA::TEA(const byte *key, int round /*= 32*/, bool isNetByte /*= false*/) 2 K; n' F8 v# X7 ?9 }
7 :_round(round)
9 R( Q$ {' I  W9 P' `4 B 8 ,_isNetByte(isNetByte) { & h. G) t" M; s4 X4 @" H0 z3 q& D
9     if (key != 0) & }5 D- L7 {6 h$ T  s& H4 F
10         memcpy(_key, key, 16);
- F3 h, M- N/ T- F11     else
0 b8 n# {8 j! l* p' s) n+ M. q12         memset(_key, 0, 16);
* ?; E- U6 n; H0 F; {13 }
" ~, ^6 @; N7 Q( _14  
; z  h  O  P# B1 Y8 g* @# X. k0 I15 TEA::TEA(const TEA &rhs) 1 S& r: [: w+ m5 F
16 :_round(rhs._round) $ U! g" A! w5 H+ ~  z7 |
17 ,_isNetByte(rhs._isNetByte) {
" w  p% A: l6 I8 X18     memcpy(_key, rhs._key, 16);
7 Y7 P$ z# t; C% p3 ~; F0 W0 ?% S19 }
, H: M4 p# @* g# q( p20  1 a% Y0 o  W0 S
21 TEA& TEA::operator=(const TEA &rhs) { . E. F6 q  Q: s' ?, O$ N) B
22     if (&rhs != this) { & G: S  i. L; ^( ~
23         _round = rhs._round;
# e. {+ R; f% V$ g# @! h24         _isNetByte = rhs._isNetByte;
$ R+ E5 c7 M5 W# p1 r7 O' D) ~25         memcpy(_key, rhs._key, 16); 3 T. n0 }4 l  ?7 K3 V
26     } 5 J1 ^3 I3 u2 O) t, S* k1 `1 S  E
27     return *this;
2 }2 h& i; K- t) [8 t' b! O3 s4 j28 } * y: j/ {$ Z! u9 k1 ]) m
29  
* _% ]& I2 t8 X7 f1 i0 r30 void TEA::encrypt(const byte *in, byte *out) {
: z. a1 d4 x8 N- }31     encrypt((const ulong*)in, (ulong*)out); * g. k* {8 p* y" O$ Y
32 } & ^, F2 H0 x$ N( K$ x
33  % T. X5 X0 [: y$ T8 p$ d. o
34 void TEA::decrypt(const byte *in, byte *out) {
; c; e1 K+ G4 Q3 q, k7 X35     decrypt((const ulong*)in, (ulong*)out);
8 Y/ L7 T! _7 s5 f1 Y36 }
! @1 Y, m% R" |2 \5 w* P1 L$ J37  ; l" w8 n4 |6 Z
38 void TEA::encrypt(const ulong *in, ulong *out) {
8 B( b' @* Y, }0 `39  
( _8 x# ]) O% O% c3 }7 s- k$ h40     ulong *k = (ulong*)_key; 1 k) k/ _% s5 g9 q! Q+ o
41     register ulong y = ntoh(in[0]); 5 a7 _% E1 U& I- d
42     register ulong z = ntoh(in[1]); + B9 d1 f: j/ s
43     register ulong a = ntoh(k[0]); 9 ]. m" N# H1 U: z& \
44     register ulong b = ntoh(k[1]); - @- N/ L: h3 L9 e0 i% M
45     register ulong c = ntoh(k[2]); 5 A( w. ?1 ^5 o5 p
46     register ulong d = ntoh(k[3]);
% T% S. S( h& f' Q+ }" C' m  m47     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ 7 [  ?, N3 `' \: v! e
48     register int round = _round;
  H; c, s9 Z# P. W' C49     register ulong sum = 0;
7 F. B6 A# K: y50  
8 v& T. ?& n  y% b7 m$ A, ?51     while (round--) {    /* basic cycle start */ : J! d, @+ {0 D, a2 s
52         sum += delta;
1 N6 i# M. N; Y1 |: V53         y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
: j/ V) L  Y. b0 _# `& q0 S54         z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ! z9 I: y6 y6 b+ S# s" D
55     }    /* end cycle */
& s7 Y, X  g1 P; x& y! X9 ?56     out[0] = ntoh(y); & K8 o  T! z  h  C! K; e. v; ~
57     out[1] = ntoh(z);
  V8 |, [  I; I, L8 }58 } ! i$ F1 _; v) Q0 F$ o! e; n
59  5 Y1 E# X! R  i5 ]$ r5 e) |
60 void TEA::decrypt(const ulong *in, ulong *out) {
  Z, k; c! C0 a# q& L61  % I( y5 b# }5 G" v3 @
62     ulong *k = (ulong*)_key; & A4 N' v5 }+ I
63     register ulong y = ntoh(in[0]);
& \/ [; p9 S& A- W' X* \. Z64     register ulong z = ntoh(in[1]);
+ F+ s$ U* v- D6 _1 s  m" p' n5 K% a65     register ulong a = ntoh(k[0]); & y, e+ v7 k: c. X; Z; D3 Z6 d1 [* M. _
66     register ulong b = ntoh(k[1]);
! m6 o: x1 ]$ y- b& o5 P67     register ulong c = ntoh(k[2]); 2 X9 y! L; R2 J+ h* D2 x! c6 ^( P( u
68     register ulong d = ntoh(k[3]);
; @) _* q8 {/ t) }% B8 d69     register ulong delta = 0x9E3779B9; /* (sqrt(5)-1)/2*2^32 */ , v) T- q8 Q- @* U
70     register int round = _round; 1 e. E0 n4 w9 p$ J8 A/ O) c9 {8 O
71     register ulong sum = 0;
) g* S$ o: R" q72  
) Q+ F+ D8 T9 w+ H73     if (round == 32)
( z3 A" b' f) b4 z74         sum = 0xC6EF3720; /* delta << 5*/
/ s" x# g' h1 z; d6 U+ o75     else if (round == 16) 6 C/ _  R! @% u2 U- t
76         sum = 0xE3779B90; /* delta << 4*/
1 W& \6 p, G5 I) h9 ~5 ?4 |77     else 8 j3 R2 P# Y& @7 Y
78         sum = delta << static_cast<int>(logbase(2, round));
( |5 p. x5 E/ V79  * r. W# g4 t) m8 P: Y$ R$ B
80     while (round--) {    /* basic cycle start */
1 X# D) k& N9 r: S% g- a8 J81         z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); ! K% S4 ]( y& j& \. F% [0 ?2 v/ x
82         y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); + G9 Q, e6 B) Y9 V  w: {
83         sum -= delta;
, y! ^+ s+ ?4 G84     }    /* end cycle */ ; x" ~/ s9 z6 {. w' X4 c
85     out[0] = ntoh(y); 1 z7 a! z: F- b5 ~
86     out[1] = ntoh(z);
4 R( u! N! F" }3 n87 }) ~7 k! H9 V; N7 H& i. D

& y8 v0 I- g, v9 ~! J需要说明的是TEA的构造函数:
- Y( `% @, D# i! F8 }6 f$ C2 HTEA(const byte *key, int round = 32, bool isNetByte = false); 0 v+ Z# O4 R6 C& Y% |1 z
1.key - 加密或解密用的128-bit(16byte)密钥。 - E+ z9 P6 Y( Z' g2 r4 V
2.round - 加密或解密的轮数,常用的有64,32,16。
. E/ I3 M- y( J, w& S3 a  R* p2 J3.isNetByte - 用来标记待处理的字节是不是来自网络,为true时在加密/解密前先要转换成本地字节,执行加密/解密,然后再转换回网络字节。偷偷告诉你,QQ就是这样做的! 0 X1 c' Q3 C8 O8 n& j: @8 l4 @* f

- p7 g/ L( `9 y6 Y/ z( d2 R- ^( D+ V最后当然少不了测试代码:
回复

使用道具 举报

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

test.cpp

1 #include "tea.h" / t1 a4 F, u7 i
2 #include "util.h"
# T( J: A( Q4 m 3 #include <iostream>
' U& a( z# \! i7 x$ G2 P; R+ c 4  , V# l6 C2 L! X$ n2 k
5 using namespace std;
' h. M: t9 t" r4 v# _3 T 6    L* [3 z/ K( S' ^4 J2 K. e( s
7 int main() {
+ J  Q! V% K5 G. [ 8  - u7 }5 e, p( }
9     const string plainStr("AD DE E2 DB B3 E2 DB B3"); # ]( K; ?* x6 p, T
10     const string keyStr("3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4");
% m7 n8 d( Q# c- n5 g11     const int SIZE_IN = 8, SIZE_OUT = 8, SIZE_KEY = 16;
. f  O% A( v! B12     byte plain[SIZE_IN], crypt[SIZE_OUT], key[SIZE_KEY]; % h. H1 I/ ?" r) ^
13  
2 u2 F" c  x+ P14     size_t size_in = hexStringToBytes(plainStr, plain); - o9 e, z9 |9 O5 ^2 b1 g3 W) X; T% j+ m
15     size_t size_key = hexStringToBytes(keyStr, key);   A- P; [3 A+ w  k) J* ?
16  0 ~6 g) K2 Z; z! U6 K# U6 f
17     if (size_in != SIZE_IN || size_key != SIZE_KEY) ( c4 G7 ]9 H7 o# U7 l! ?/ b) H
18         return -1; # `9 B: y3 I/ }$ I
19  8 _( j  [3 R' C$ o1 U0 M0 `
20     cout << "Plain: " << bytesToHexString(plain, size_in) << endl; 6 A+ T7 ]9 ]& ]2 |$ X
21     cout << "Key  : " << bytesToHexString(key, size_key) << endl;
& g. |& A# R7 H4 V' m22  
# T0 E9 J* v: b9 \2 V" P$ T23     TEA tea(key, 16, true);
% l- w+ l, [5 t# h6 E24     tea.encrypt(plain, crypt); # z0 y; J) h0 r* \
25     cout << "Crypt: " << bytesToHexString(crypt, SIZE_OUT) << endl; 7 N; t4 P) d2 y  a+ k
26  
7 o& P6 }8 D$ [+ T+ u' ?27     tea.decrypt(crypt, plain); 2 P5 W6 q2 @* a/ b" h& w  G( x& O
28     cout << "Plain: " << bytesToHexString(plain, SIZE_IN) << endl;
: R4 u( V9 j; D0 y) v( r: M29     return 0; 2 y7 T* Y0 O! Y5 o+ n7 s! T( p3 @
30 }
3 q, M9 K/ f7 y4 H1 U2 `) O
: v# o4 E) u. |$ p* N本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailing0123/archive/2008/04/28/2339231.aspx
0 O& x: b& F+ [运行结果: * ?4 C% F9 k/ F; Z$ k' R# i. Q2 m
Plain: AD DE E2 DB B3 E2 DB B3 7 L) I5 B8 C( R( ~6 O
Key  : 3A DA 75 21 DB E2 DB B3 11 B4 49 01 A5 C6 EA D4 . U! F: C$ r0 f: Q
Crypt: 3B 3B 4D 8C 24 3A FD F2 * r! T& e% }3 }/ l8 g; E
Plain: AD DE E2 DB B3 E2 DB B3
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 02:42 , Processed in 0.020112 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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