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

3DES (Triple DES) 加解密 C 語言實作:從 OpenSSL 源碼萃取到 UDF 資料庫函數

     編輯:關於C語言

3DES (Triple DES) 加解密 C 語言實作:從 OpenSSL 源碼萃取到 UDF 資料庫函數

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 位元組子金鑰。
  • 填補模式: PKCS7(區塊大小 8 位元組)。

PKCS7 填補規則

k = 8 (區塊大小), l = 資料長度
若 l mod k = k-1 → 補 0x01
若 l mod k = k-2 → 補 0x02 0x02
...
若 l mod k = 0   → 補 8 個 0x08

核心實作程式碼(des3_func.c)

完整程式包含: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;
}

關鍵函式流程

  1. DES_set_key_unchecked():將 8 位元組金鑰經 PC-1 置換、位移、PC-2 置換產生 16 輪子金鑰。
  2. DES_ecb3_encrypt():對單一 8 位元組區塊執行 DES_encrypt3()(加密)或 DES_decrypt3()(解密)。
  3. DES_encrypt3()/DES_decrypt3():依序呼叫三次 DES_encrypt2(),模式為 ENC-DEC-ENC 或 DEC-ENC-DEC。
  4. DES_encrypt2():核心單輪 DES,含 IP 置換、16 輪 Feistel 網路(使用 S-Box)、FP 逆置換。

移植為資料庫 UDF 的要點

  • 移除 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。
  • MySQL/PostgreSQL 建立 UDF 時需宣告回傳型別、引數型別、動態庫路徑。
  • 效能考量:ECB 模式不適用大量資料,實務建議改用 CBC/GCM 模式並加入 IV。

⚠️ 安全性提醒: 3DES 已被 NIST 棄用(2023 年後禁用),新系統請改用 AES-256-GCM 或 ChaCha20-Poly1305。本實作僅供維護舊系統、教學研究或相容性測試使用。

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