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

OpenSSL 新增自訂加密演算法:以 EVP_ssf33 為例完整步驟

     編輯:關於C語言

前言

OpenSSL 透過 EVP 高層介面統一各類加密演算法。新增自訂演算法需修改物件識別碼註冊、實作 EVP_CIPHER 結構、註冊至演算法表。本文以 `EVP_ssf33` (基於 RC4) 為例說明完整流程。

步驟概覽

  1. 修改 `crypto/objects/objects.txt` 註冊 OID。
  2. 執行 `perl objects.pl` 產生 `obj_mac.h` / `obj_mac.num`。
  3. 新增 `crypto/evp/e_ssf33.c` 實作演算法邏輯。
  4. 修改 `crypto/evp/evp.h` 宣告 `EVP_ssf33()`。li>
  5. 修改 `crypto/evp/c_allc.c` 在 `OpenSSL_add_all_ciphers` 中註冊。
  6. 修改 `crypto/evp/Makefile` 編譯新檔案。
  7. 重新編譯 OpenSSL。

關鍵程式碼片段

1. objects.txt 註冊 OID

rsadsi 3 255 : SSF33 : ssf33

2. e_ssf33.c 核心實作

static const EVP_CIPHER ssf33_evp_cipher = {
    NID_ssf33,           /* NID */
    1,                   /* block size (串流密碼為 1) */
    EVP_SSF33_KEY_SIZE,  /* key length = 16 */
    0,                   /* iv length */
    EVP_CIPH_VARIABLE_LENGTH,
    ssf33_init_key,      /* 初始化 */
    ssf33_cipher,        /* 加解密核心 */
    NULL,                /* cleanup */
    sizeof(EVP_SSF33_KEY),
    NULL, NULL, NULL, NULL
};

const EVP_CIPHER *EVP_ssf33(void) { return &ssf33_evp_cipher; }

static int ssf33_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                          const unsigned char *iv, int enc) {
    RC4_set_key(&data(ctx)->ks, EVP_CIPHER_CTX_key_length(ctx), key);
    return 1;
}

static int ssf33_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
                        const unsigned char *in, unsigned int inl) {
    RC4(&data(ctx)->ks, inl, in, out);
    return 1;
}

3. 註冊入口

/* evp.h */
const EVP_CIPHER *EVP_ssf33(void);

/* c_allc.c */
EVP_add_cipher(EVP_ssf33());

注意事項

  • OID 需全域唯一,遵循企業/組織分配規則。
  • 串流密碼 `block size = 1`,`EVP_CIPH_VARIABLE_LENGTH` 旗標允許任意長度輸入。
  • 金鑰長度、IV 長度需與演算法規範一致。
  • OpenSSL 3.0+ 架構改用 Provider 機制,本文適用 1.1.1 等傳統版本。

總結

新增 OpenSSL 演算法核心在於實作 `EVP_CIPHER` 結構體的 `init_key`/`cipher` 回呼,並完成 OID 註冊與編譯系統整合。理解 EVP 抽象層設計,可快速整合國密/專有演算法。

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