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) {
// 對應解密
}
};
主程序交互流程
- 讀取 `key_prepared.txt` 明文密碼。
- 用戶選擇:修改密碼 / 測試解密 / 加密文件/文件夾。
- 加密文件夾:遞歸收集所有文件,保持目錄結構輸出到 `cryfolder/`。
- 解密測試:單文件解密輸出內容驗證。
工程注意點
- **填充方案**需統一,解密時去除填充。
- **大文件**分塊處理,避免一次性讀入內存。
- **密鑰派生**建議用 PBKDF2/Argon2 而非直接截取,防止弱口令。
- **異或模式**:TEA 原生為 ECB,生產環境建議 CBC/CTR + IV。