【数据库】SQLITE3 加密2

2       自己实现加解密接口函数4 |; Y6 a* x3 [5 k/ L
5 O8 t; k/ _. S/ W
如果真要我从一份 http://www.sqlite.org/ 网上down下来的 sqlite3.c 文件,直接摸索出这些接口的实现,我认为我还没有这个能力。
) k- d) y- s! n& q$ \. e9 t6 d* P5 d5 s0 I% k
好在网上还有一些代码已经实现了这个功能。通过参照他们的代码以及不断编译中vc给出的错误提示,最终我把整个接口整理出来。8 E' G9 @6 U1 j8 ~! f, V( d
1 ]8 S5 T) _2 L6 O% x, Z
实现这些预留接口不是那么容易,要重头说一次怎么回事很困难。我把代码都写好了,直接把他们按我下面的说明拷贝到 sqlite3.c 文件对应地方即可。我在下面也提供了sqlite3.c 文件,可以直接参考或取下来使用。( e" V! h; m( o8 X5 v
   C% E+ ?- b! P+ s9 p. T
2 \6 H+ {, C+ [! S
* G7 j% N   ^! i. o6 e
这里要说一点的是,我另外新建了两个文件:crypt.c和crypt.h。
: n1 {   d# M) S- p& a, M' P5 ]; l- G   h2 z, ~$ u# p
其中crypt.h如此定义:
复制内容到剪贴板
代码:
#ifndef   DCG_SQLITE_CRYPT_FUNC_

#define   DCG_SQLITE_CRYPT_FUNC_

/***********

董淳光写的 SQLITE 加密关键函数库

***********/



/***********

关键加密函数

***********/

int My_Encrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key );



/***********

关键解密函数

***********/

int My_DeEncrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key );



#endif

其中的 crypt.c 如此定义:
复制内容到剪贴板
代码:
#include "./crypt.h"

#include "memory.h"

/***********

关键加密函数

***********/

int My_Encrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )

{

return 0;

}



/***********

关键解密函数

***********/

int My_DeEncrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )

{

return 0;

}

这个文件很容易看,就两函数,一个加密一个解密。传进来的参数分别是待处理的数据、数据长度、密钥、密钥长度。
# s$ Y0 b" I) a
1 q# X! i" O: ^. c" O2 X处理时直接把结果作用于 pData 指针指向的内容。- J7 ~% J% g0 |( Z6 }   y5 _
5 h2 E9 P1 s& F8 x# q4 i
你需要定义自己的加解密过程,就改动这两个函数,其它部分不用动。扩展起来很简单。0 x% z: b; @! \1 B) E

& ?- l8 \9 {" n2 O: m$ d这里有个特 点,data_len 一般总是 1024 字节。正因为如此,你可以在你的算法里使用一些特定长度的加密算法,比如AES要求被加密数据一定是128位(16字节)长。这个1024不是碰巧,而是 Sqlite 的页定义是1024字节,在sqlite3.c文件里有定义:
复制内容到剪贴板
代码:
# define SQLITE_DEFAULT_PAGE_SIZE 1024
你可以改动这个值,不过还是建议没有必要不要去改它。
posted @ 2009-05-16 13:52  jcss  阅读(579)  评论(0编辑  收藏  举报