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
你可以改動這個值,不過還是建議沒有必要不要去改它。