3DES(Triple DES)對每個 8 位元組資料區塊套用三次 DES 演算法,使用 24 位元組(3×8)金鑰。本文記錄從 OpenSSL 原始碼萃取核心演算法、移植為獨立 C 實作、編譯測試,並整理為可用於資料庫 UDF(User Defined Function)的完整流程與程式碼。
C = Ek3(Dk2(Ek1(P)))P = Dk1(Ek2(Dk3(C)))Ek()、Dk() 為 DES 加密/解密,K1、K2、K3 為三把 8 位元組子金鑰。k = 8 (區塊大小), l = 資料長度
若 l mod k = k-1 → 補 0x01
若 l mod k = k-2 → 補 0x02 0x02
...
若 l mod k = 0 → 補 8 個 0x08
完整程式包含:S-Box 置換表、金鑰排程、ECB 模式三重加解密、PKCS7 填補、主程式測試。編譯指令:
$ gcc -Wall -O2 -o des3_func des3_func.c -lcrypto
/* 關鍵巨集與資料結構 */
#define DES_LONG unsigned long
#define LEN_OF_KEY 24
#define ITERATIONS 16
/* 位元操作巨集 */
#define c2l(c,l) (l =((DES_LONG)(*((c)++))) , \
l|=((DES_LONG)(*((c)++)))<< 8L, \
l|=((DES_LONG)(*((c)++)))<<16L, \
l|=((DES_LONG)(*((c)++)))<<24L)
#define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
*((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
*((c)++)=(unsigned char)(((l)>>16L)&0xff), \
*((c)++)=(unsigned char)(((l)>>24L)&0xff))
/* S-Box 置換表 DES_SPtrans[8][64]、金鑰排程表 des_skb[8][64] ... (略,完整見原始碼) */
/* 3DES ECB 加解密入口 */
void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
DES_key_schedule *ks1, DES_key_schedule *ks2,
DES_key_schedule *ks3, int enc);
/* 金鑰設定 */
void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule);
/* 主程式測試 */
int main() {
char *key = "ABCDEFGHABCDEFGHABCDEFGH"; // 24 bytes
char *data = "123456789ABCDEFG"; // 16 bytes 原始明文
// ... 金鑰分割 ks1/ks2/ks3、PKCS7 填補、分區塊加密、解密驗證 ...
// 輸出加密後十六進位、解密後十六進位與原文
return 0;
}
DES_encrypt3()(加密)或 DES_decrypt3()(解密)。DES_encrypt2(),模式為 ENC-DEC-ENC 或 DEC-ENC-DEC。main(),封裝為 des3_encrypt(const char *in, int len, const char *key, char *out) 與 des3_decrypt(...)。gcc -shared -fPIC -o des3_udf.so des3_udf.c -lcrypto。⚠️ 安全性提醒: 3DES 已被 NIST 棄用(2023 年後禁用),新系統請改用 AES-256-GCM 或 ChaCha20-Poly1305。本實作僅供維護舊系統、教學研究或相容性測試使用。