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

檔案加密實作:逐位元組 XOR 演算法與密碼驗證機制

     編輯:關於VC++

緣起

筆者嘗試 VCKBASE 上「加密之星」工具,發現其加密效果不佳:文字檔僅前段加密、MP3 加密後仍可正常播放。遂自行設計一種簡單卻能完整加密任意檔案、支援同密碼多次加密的方法。

核心加密邏輯

將檔案從頭到尾逐位元組讀取並加密:

for (int i = 0; i < flen; i++) {
    data[i] ^= m_password;
    data[i] ^= flen;  // 檔案長度參與運算,使同密碼多次加密結果不同
}

完整實作程式碼 (MFC)

介面設計

  • 對話框基礎專案
  • 三個按鈕:瀏覽、加密、解密
  • 兩個編輯框:檔案路徑 (m_path)、密碼 (m_pass)

核心函數宣告

__int64 epass();           // 密碼初始化
BOOL ecfile(LPCTSTR fpath); // 加密
BOOL dcfile(LPCTSTR fpath); // 解密

密碼初始化函數

__int64 CEcfileDlg::epass() {
    DWORD plen;
    char *ppass;
    __int64 mc = 8757735233305;  // 固定種子
    UpdateData(TRUE);
    ppass = m_pass.GetBuffer(0);
    plen = strlen(ppass);
    for (int i = 0; i < (int)plen; i++) {
        mc ^= ppass[i] | 128;
    }
    return mc;
}

加密函數

BOOL CEcfileDlg::ecfile(LPCTSTR fpath) {
    char *data;
    CFile *file;
    DWORD flen;
    m_password = epass();
    
    file = new CFile;
    if (!file->Open(fpath, CFile::shareDenyNone | CFile::modeReadWrite))
        return FALSE;
    
    flen = file->GetLength();
    data = new char[(int)flen];
    file->SeekToBegin();
    file->Read(data, flen);
    
    // 逐位元組加密
    for (int i = 0; i < (int)flen; i++) {
        data[i] ^= m_password;
        data[i] ^= flen;
    }
    
    file->SeekToBegin();
    file->Write(data, flen);
    delete[] data;
    
    // 附加密碼驗證碼 (5 bytes "love" 加密後)
    char cpass[5] = "love";
    for (int j = 0; j < 5; j++)
        cpass[j] ^= m_password;
    
    file->SeekToEnd();
    file->Write(&cpass, 5);  // 檔案長度增加 5 bytes
    file->Close();
    delete file;
    return TRUE;
}

解密函數

BOOL CEcfileDlg::dcfile(LPCTSTR fpath) {
    char *data;
    CFile *file;
    DWORD flen;
    char love[5];
    
    file = new CFile;
    if (!file->Open(fpath, CFile::shareDenyNone | CFile::modeReadWrite))
        return FALSE;
    
    flen = file->GetLength();
    data = new char[(int)flen];
    
    // 驗證密碼:讀取末尾 5 bytes
    file->Seek(-5, CFile::end);
    file->Read(&love, 5);
    m_password = epass();
    for (int i = 0; i < 5; i++)
        love[i] ^= m_password;
    
    if (strcmp(love, "love") != 0)  // 密碼錯誤
        return FALSE;
    
    // 解密(XOR 可逆,須用原始長度 flen-5)
    file->SeekToBegin();
    file->Read(data, flen);
    for (int j = 0; j < (int)flen; j++) {
        data[j] ^= m_password;
        data[j] ^= (flen - 5);
    }
    
    file->SeekToBegin();
    file->Write(data, flen);
    file->SetLength(flen - 5);  // 移除驗證碼
    file->Close();
    delete[] data;
    delete file;
    return TRUE;
}

安全性分析

  • ✅ 完整加密檔案每一位元組
  • ✅ 檔案長度參與運算,同密碼多次加密產生不同密文
  • ✅ 末尾附加驗證碼防止錯誤密碼解密損壞檔案
  • ⚠️ 演算法屬簡易 XOR,非軍事級加密,適合一般檔案保護
  • ⚠️ 已知明文攻擊下可推導金鑰

測試環境

Windows XP 下編譯通過並實測有效。

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