openssl常用的EVP_CIPHER值
目录
一. 加解密步骤
1. 创建结构体
EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void);
2. 初始化结构体
void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a);
3. 初始化上下文
int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
const unsigned char *key, const unsigned char *iv,
int enc);
int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
ENGINE *impl, const unsigned char *key,
const unsigned char *iv, int enc);
int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
const unsigned char *key, const unsigned char *iv);
int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
ENGINE *impl, const unsigned char *key,
const unsigned char *iv);
int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
const unsigned char *key, const unsigned char *iv);
int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
ENGINE *impl, const unsigned char *key,
const unsigned char *iv);
4. 更新(塞数据)
int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
const unsigned char *in, int inl);
int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
const unsigned char *in, int inl);
int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
const unsigned char *in, int inl);
其实可以全用EVP_CipherUpdate塞数据数据
int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
const unsigned char *in, int inl)
{
if (ctx->encrypt)
return EVP_EncryptUpdate(ctx, out, outl, in, inl);
else
return EVP_DecryptUpdate(ctx, out, outl, in, inl);
}
5. 最终(获得数据长度)
int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
最终调用的是EVP_EncryptFinal_ex和EVP_DecryptFinal_ex两个函数
int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
{
if (ctx->encrypt)
return EVP_EncryptFinal_ex(ctx, out, outl);
else
return EVP_DecryptFinal_ex(ctx, out, outl);
}
int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
{
if (ctx->encrypt)
return EVP_EncryptFinal(ctx, out, outl);
else
return EVP_DecryptFinal(ctx, out, outl);
}
int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
{
int ret;
ret = EVP_EncryptFinal_ex(ctx, out, outl);
return ret;
}
int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
{
int ret;
ret = EVP_DecryptFinal_ex(ctx, out, outl);
return ret;
}
6. 清理结构体
int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);
7. 释放结构体
void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a);
二. EVP_CIPHER值
初始化结构体上下文时,第二个参数配置加解密方式。
int EVP_CipherInit
int EVP_CipherInit_ex
int EVP_EncryptInit
int EVP_EncryptInit_ex
int EVP_DecryptInit
int EVP_DecryptInit_ex
第二个参数是一个常量的EVP_CIPHER结构体,openssl准备了很多例程,下面是常见的例程
1. AES
AES_128
// AES128位密钥加密(加密模式:ecb,cbc,ctr,ofb,cfb)
EVP_aes_128_ecb()
EVP_aes_128_cbc()
EVP_aes_128_ctr()
EVP_aes_128_ofb()
EVP_aes_128_cfb()
AES_192
// AES192位密钥加密(加密模式:ecb,cbc,ctr,ofb,cfb)
EVP_aes_192_ecb()
EVP_aes_192_cbc()
EVP_aes_192_ctr()
EVP_aes_192_ofb()
EVP_aes_192_cfb()
AES_256
// AES256位密钥加密(加密模式:ecb,cbc,ctr,ofb,cfb)
EVP_aes_256_ecb()
EVP_aes_256_cbc()
EVP_aes_256_ctr()
EVP_aes_256_ofb()
EVP_aes_256_cfb()
2. DES
DES加密 (一次加密)
密钥长度64位,使用56位数据
// DES加密(加密模式:ecb,cbc,ofb,cfb)
EVP_des_ecb()
EVP_des_cbc()
EVP_aes_ofb()
EVP_des_cfb()
DES ede2 加密(两个密钥三重加密)
密钥长度128位,使用112位数据
//DES两个密钥三重加密(加密模式:ecb,cbc,ofb,cfb)
EVP_des_ede_ecb()
EVP_des_ede_cbc()
EVP_aes_ede_ofb()
EVP_des_ede_cfb()
DES ede3 加密(三个密钥三重加密)
密钥长度192位,使用168位数据
//DES三键三重加密(加密模式:ecb,cbc,ofb,cfb)
EVP_des_ede3_ecb()
EVP_des_ede3_cbc()
EVP_aes_ede3_ofb()
EVP_des_ede3_cfb()