2021-05-12 14:32:11
在OpenSSL中新增自定義加密演算法
一、簡介
本文以新增自定義演算法EVP_ssf33為例,介紹在OpenSSL中新增自定義加密演算法的方法
二、步驟
1、修改crypto/object/objects.txt,註冊演算法OID,如下:
rsadsi 3 255 : SSF33 : ssf33
2、進入目錄:crypto/object/,執行如下命令,生成演算法的宣告
perl objects.pl objects.txt obj_mac.num obj_mac.h
3、在crypto/evp/下新增e_ssf33.c,內容如下
#include <stdio.h>
#include "cryptlib.h"
#ifndef OPENSSL_NO_RC4
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/rc4.h>
/* FIXME: surely this is available elsewhere? */
#define EVP_SSF33_KEY_SIZE 16
typedef struct
{
RC4_KEY ks; /* working key */
} EVP_SSF33_KEY;
#define data(ctx) ((EVP_SSF33_KEY *)(ctx)->cipher_data)
static int ssf33_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv,int enc);
static int ssf33_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl);
static const EVP_CIPHER ssf33_evp_cipher=
{
NID_ssf33,
1,
EVP_SSF33_KEY_SIZE,
0,
EVP_CIPH_VARIABLE_LENGTH,
ssf33_init_key,
ssf33_cipher,
NULL,
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;
}
#endif
4、修改crypto/evp/evp.h,新增對演算法的宣告,如下
const EVP_CIPHER *EVP_ssf33(void);
5、修改crypto/evp/c_allc.c,在OpenSSL_add_all_ciphers函數中使用EVP_add_cipher註冊加密函數,如下
EVP_add_cipher(EVP_ssf33());
6、修改crypto/evp/Makefile,如下
7、完成
通過OpenSSL提供FTP+SSL/TLS認證功能,並實現安全資料傳輸 http://www.linuxidc.com/Linux/2013-05/84986.htm
Linux下使用OpenSSL生成證書 http://www.linuxidc.com/Linux/2015-05/117034.htm
利用OpenSSL簽署多域名證書 http://www.linuxidc.com/Linux/2014-10/108222.htm
相關文章