FoxBase+/FoxPro 等早期資料庫缺乏檔案層級加密功能(Access 可設定資料庫密碼),資料檔 (.dbf) 易被直接讀取竄改。本文提供一個簡易加密模組,可整合至應用程式中,對 DBF 檔進行可逆加密,加密後 FoxBase 等工具無法識別,解密後恢復正常存取。
讀取 DBF 檔頭(前 32 位元組),取得記錄長度,對檔頭與資料區進行位元異或 (XOR) 運算並修改特定位元組,破壞檔案結構識別特徵。解密時反向操作即可還原。
void CAa6Dlg::OnButton1() {
int buf[512], tcd, tcd1, *p1, i;
CFile file;
char* filename = "c:\\aa.dbf";
file.Open(filename, CFile::modeReadWrite);
file.Read(buf, 32); // 讀取檔頭
p1 = (int*)buf; p1++; tcd = *p1; // 取得記錄長度
tcd1 = (tcd - 1) / 2;
file.SeekToBegin();
file.Read(buf, tcd); // 讀取完整記錄
buf[0] += 0x0017; // 修改檔頭標識
for (i = 16; i < tcd1; i++) buf[i] ^= 0xFFFF; // 位元異或加密
file.SeekToBegin();
file.Write(buf, tcd);
file.Flush(); file.Close();
}
void CAa6Dlg::OnButton2() {
int buf[512], tcd, tcd1, *p1, i;
CFile file;
char* filename = "c:\\aa.dbf";
file.Open(filename, CFile::modeReadWrite);
file.Read(buf, 32);
p1 = (int*)buf; p1++; tcd = *p1;
tcd1 = (tcd - 1) / 2;
file.SeekToBegin();
file.Read(buf, tcd);
buf[0] -= 0x0017; // 還原檔頭標識
for (i = 16; i < tcd1; i++) buf[i] ^= 0xFFFF; // 反向異或解密
file.SeekToBegin();
file.Write(buf, tcd);
file.Flush(); file.Close();
}
此模組可作為應用程式的資料保護基礎層,防止一般使用者直接竄改 DBF 檔案。