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

C++ TEA 加密算法實現:高性能文件加密/解密工具(單例模式管理密鑰)

     編輯:關於C++

TEA (Tiny Encryption Algorithm) 核心

  • 64 位分組,128 位密鑰(4×32 位)。
  • 建議 32 輪(最少 6 輪),每輪極簡運算:加、異或、移位。
  • 無 S-box,適合軟件實現,速度極快。

加密/解密核心代碼

// TeaEd.h
class TeaEd {
    uint32_t _key[4];
    int _rounds = 32;
public:
    explicit TeaEd(const uint8_t *key16) {
        memcpy(_key, key16, 16);
    }
    void encrypt(const uint8_t *in, uint8_t *out) const {
        uint32_t v0 = *(uint32_t*)in, v1 = *(uint32_t*)(in+4);
        uint32_t sum = 0, delta = 0x9E3779B9;
        for (int i = 0; i < _rounds; ++i) {
            sum += delta;
            v0 += ((v1 << 4) + _key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + _key[1]);
            v1 += ((v0 << 4) + _key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + _key[3]);
        }
        *(uint32_t*)out = v0; *(uint32_t*)(out+4) = v1;
    }
    void decrypt(const uint8_t *in, uint8_t *out) const {
        uint32_t v0 = *(uint32_t*)in, v1 = *(uint32_t*)(in+4);
        uint32_t delta = 0x9E3779B9;
        uint32_t sum = delta * _rounds; // 32輪: 0xC6EF3720
        for (int i = 0; i < _rounds; ++i) {
            v1 -= ((v0 << 4) + _key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + _key[3]);
            v0 -= ((v1 << 4) + _key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + _key[1]);
            sum -= delta;
        }
        *(uint32_t*)out = v0; *(uint32_t*)(out+4) = v1;
    }
};

單例密鑰管理與文件處理

class CryTool {
    unique_ptr tea;
    string keyFile; // 存儲加密後的密鑰
public:
    static CryTool* Get() { static CryTool inst; return &inst; }
    void setUpTea(const string &plainKey, const string &keyFilePath) {
        // 將 plainKey 擴展/哈希為 16 字節
        uint8_t key16[16] = {}; memcpy(key16, plainKey.data(), min(plainKey.size(), 16));
        tea = make_unique(key16);
        keyFile = keyFilePath;
        // 可選:加密寫入 keyFile
    }
    void enCryWithFileName(const string &inFile, const string &outFile) {
        // 讀取 inFile,按 8 字節分塊 encrypt,寫出 outFile
        // 處理填充(PKCS#7 或簡單 0 填充)
    }
    void deCryWithFileName(const string &inFile, const string &outFile) {
        // 對應解密
    }
};

主程序交互流程

  1. 讀取 `key_prepared.txt` 明文密碼。
  2. 用戶選擇:修改密碼 / 測試解密 / 加密文件/文件夾。
  3. 加密文件夾:遞歸收集所有文件,保持目錄結構輸出到 `cryfolder/`。
  4. 解密測試:單文件解密輸出內容驗證。

工程注意點

  • **填充方案**需統一,解密時去除填充。
  • **大文件**分塊處理,避免一次性讀入內存。
  • **密鑰派生**建議用 PBKDF2/Argon2 而非直接截取,防止弱口令。
  • **異或模式**:TEA 原生為 ECB,生產環境建議 CBC/CTR + IV。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved