OpenSSL 透過 EVP 高層介面統一各類加密演算法。新增自訂演算法需修改物件識別碼註冊、實作 EVP_CIPHER 結構、註冊至演算法表。本文以 `EVP_ssf33` (基於 RC4) 為例說明完整流程。
rsadsi 3 255 : SSF33 : ssf33
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;
}
/* evp.h */
const EVP_CIPHER *EVP_ssf33(void);
/* c_allc.c */
EVP_add_cipher(EVP_ssf33());
新增 OpenSSL 演算法核心在於實作 `EVP_CIPHER` 結構體的 `init_key`/`cipher` 回呼,並完成 OID 註冊與編譯系統整合。理解 EVP 抽象層設計,可快速整合國密/專有演算法。