要看OpenSSL了.作为研究的第一个开源代码, 没有多大的头绪.就先通过书《PKI网络安全论证技术与编程实现》来熟悉一下OpenSSL的基本应用。这里把它讲到的函数列出来。为下一步研究作了准备。
一、OpenSSL加密和解密
1、首先初始化EVP算法上下文
voidEVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a)
函数功能:初始化一个EVP_CIPHER_CTX结构体。这个结构体将在算法中的其它函数中调用。
参数说明:[IN]EVP_CIPHER_CTX结构体,密码算法上下文关系句柄。用于保存密码算法、密码算法引擎、加密或解密的标志位、初始初始化向量、当前初始化向量等信息。
2、加解密初始化函数
intEVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,ENGINE *imp1, const unsigned char *key, const unsigned char*iv);
intEVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,ENGINE *imp1, const unsigned char *key, const unsigned char*iv);
函数功能:加解密初始化,设置密码算法、加密引擎、密钥、初始化向量等参数。
参数constEVP_CIPHER *cipher :表示加解密使用的密码算法
const EVP_CIPHER *EVP_enc_null(void)const EVP_CIPHER *EVP_des_ecb(void)const EVP_CIPHER *EVP_rc4(void)const EVP_CIPHER *EVP_idea_cbc(void)const EVP_CIPHER *EVP_aes_128_ecb(void)const EVP_CIPHER *EVP_aes_192_cbc(void)const EVP_CIPHER *EVP_aes_256_ecb(void)const EVP_CIPHER *EVP_des_ede3cbc(void)
返回值:成功返回1,否则返回0
3、数据加解密Update函数
intEVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int*out1, const unsigned char *in, int in1);
intEVP_DeyptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *out1,const unsigned char *in, int in1);
功能:数据加解密
参数:[OUT]out,输出数据指针。[OUT]out1输出数据长度
返回值:1成功,0失败
4、数据加解密结束函数
intEVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int*out1);
intEVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int*out1);
功能:数据加密结束,输出最后剩余的密(加密)/明(解密)文。
5、释放内存。
intEVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);
二、OpenSSL消息摘要
消息摘要就是把不定长的数据通过数学变换转化为固定长度的短数据。不可逆。
1、初始化函数
voidEVP_MD_CTX_init(EVP_MD_CTX *ctx);
功能:初始化EVP_MD_CTX结构体
2、设置摘要算法函数
intEVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE*imp1);
功能:摘要初始化,设置摘要算法、摘要算法引擎。
参数:type[IN]计算摘要使用的算法。
const EVP_MD *EVP_md2(void)const EVP_MD *EVP_md4(void)const EVP_MD *EVP_md5(void)const EVP_MD *EVP_sha(void);const EVP_MD *EVP_sha1(void);const EVP_MD *EVP_dss(void);const EVP_MD *EVP_mdc2(void);const EVP_MD *EVP_ripemd160(voi)
3、摘要Update函数
intEvP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
功能:计算数据摘要。此函数可以被调用多次,适用于计算大段数据的摘要。
4、摘要结束函数
intEVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int*s);
功能:结束计算摘要,输出摘要值。
5、一次性计算摘要函数
intEVP_Digest(const void *data, size_t count, unsigned char *md,unsigned int *size, const EVP_MD *type, ENGINE *imp1);
6、清除摘要算法结构体EVP_MD_CTX,释放内存函数
int EVP_MD_CTX_cleanup(EVP_MD_CTX*ctx);