首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 加密 FoxBase 資料庫檔案:簡易位元運算保護 DBF 檔

     編輯:關於VC++

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();
}

注意事項

  • 本範例針對單一記錄示範,實際應用需遍歷全檔所有記錄加密
  • 加密後檔案無法被 FoxBase/FoxPro 直接開啟,需先解密
  • 此為簡易混淆加密,非軍事級加密,敏感資料建議使用成熟加密庫
  • 檔案路徑硬編碼,實際專案應改為使用者選擇或配置

此模組可作為應用程式的資料保護基礎層,防止一般使用者直接竄改 DBF 檔案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved