资源简介
实现加密算法:
【NULL算法】
函数:EVP_enc_null()该算法不作任何事情,也就是没有进行加密处理
【DES算法】
函数:EVP_des_cbc(void), EVP_des_ecb(void), EVP_des_cfb(void), EVP_des_ofb(void)
说明:分别是CBC方式、ECB方式、CFB方式以及OFB方式的DES算法
【使用两个密钥的3DES算法】
函数:EVP_des_ede_cbc(void), EVP_des_ede(), EVP_des_ede_ofb(void),EVP_des_ede_cfb(void)
说明:分别是CBC方式、ECB方式、CFB方式以及OFB方式的3DES算法,算法的第一个密钥和最后一个密钥相同,事实上就只需要两个密钥
【使用三个密钥的3DES算法】
函数:EVP_des_ede3_cbc(void), EVP_des_ede3(), EVP_des_ede3_ofb(void), EVP_des_ede3_cfb(void)
说明:分别是CBC方式、ECB方式、CFB方式以及OFB方式的3DES算法,算法的三个密钥都不相同
。
。
。
。
。
。
注: 这些加密算法函数调用时返回的都是对应EVP_CIPHER结构体指针
*/
代码片段和文件信息
#include
#include
#include
typedef unsigned char uchar;
/*使用openssl提供的API实现*/
int aes_encrypt_api()
{
uchar userkey[AES_BLOCK_SIZE];
uchar *data = malloc(AES_BLOCK_SIZE*3);
uchar *encrypt = malloc(AES_BLOCK_SIZE*6);
uchar *plain = malloc(AES_BLOCK_SIZE*3);
AES_KEY key;
memset((void*)userkey ‘k‘ AES_BLOCK_SIZE);
memset((void*)data ‘h‘ AES_BLOCK_SIZE*3);
memset((void*)encrypt 0 AES_BLOCK_SIZE*6);
memset((void*)plain 0 AES_BLOCK_SIZE*3);
/*设置加密key及密钥长度*/
AES_set_encrypt_key(userkey AES_BLOCK_SIZE*8 &key);
int len = 0;
/*循环加密,每次只能加密AES_BLOCK_SIZE长度的数据*/
while(len < AES_BLOCK_SIZE*3) {
AES_encrypt(data+len encrypt+len &key);
len += AES_BLOCK_SIZE;
}
/*设置解密key及密钥长度*/
AES_set_decrypt_key(userkey AES_BLOCK_SIZE*8 &key);
len = 0;
/*循环解密*/
while(len < AES_BLOCK_SIZE*3) {
AES_decrypt(encrypt+len plain+len &key);
len += AES_BLOCK_SIZE;
}
printf(“encrypt: “);
int i = 0;
for(i = 0; i < AES_BLOCK_SIZE*6; i++){
printf(“%02x“ encrypt[i]);
if((i+1) % 32 == 0){
printf(“\n“);
}
}
printf(“\n“);
printf(“plain: %s\n“ plain);
return 0;
}
/*使用EVP框架*/
int aes_encrypt_evp()
{
char userkey[EVP_MAX_KEY_LENGTH];
char iv[EVP_MAX_IV_LENGTH];
uchar *data = malloc(AES_BLOCK_SIZE*3);
uchar *encrypt = malloc(AES_BLOCK_SIZE*6);
uchar *plain = malloc(AES_BLOCK_SIZE*6);
EVP_CIPHER_CTX *ctx;
int ret;
int tlen = 0;
int mlen = 0;
int flen = 0;
memset((void*)userkey ‘k‘ EVP_MAX_KEY_LENGTH);
memset((void*)iv ‘i‘ EVP_MAX_IV_LENGTH);
memset((void*)data ‘h‘ AES_BLOCK_SIZE*3);
memset((void*)encrypt 0 AES_BLOCK_SIZE*6);
memset((void*)plain 0 AES_BLOCK_SIZE*6);
/*初始化ctx*/
ctx = EVP_CIPHER_CTX_new();
/*指定加密算法及key和iv(此处IV没有用)*/
ret = EVP_EncryptInit_ex(ctx EVP_aes_128_ecb() NULL userkey iv);
if(ret != 1) {
printf(“EVP_EncryptInit_ex failed\n“);
exit(-1);
}
/*禁用padding功能*/
EVP_CIPHER_CTX_set_padding(ctx 0);
/*进行加密操作*/
ret = EVP_EncryptUpdate(ctx encrypt &mlen data AES_BLOCK_SIZE*3);
if(ret != 1) {
printf(“EVP_EncryptUpdate failed\n“);
exit(-1);
}
/*结束加密操作*/
ret = EVP_EncryptFinal_ex(ctx encrypt+mlen &flen);
if(ret != 1) {
printf(“EVP_EncryptFinal_ex failed\n“);
exit(-1);
}
tlen = mlen + flen;
tlen = 0;
mlen = 0;
flen = 0;
EVP_CIPHER_CTX_cleanup(ctx);
EVP_CIPHER_CTX_init(ctx);
ret = EVP_DecryptInit_ex(ctx EVP_aes_128_ecb() NULL userkey iv);
if(ret != 1) {
printf(“EVP_DecryptInit_ex failed\n“);
exit(-1);
}
EVP_CIPHER_CTX_set_pa
- 上一篇:GUIBuilder_V530.rar
- 下一篇:c语言学习例题.docx
评论
共有 条评论