openssl编程--AES_cbc_encrypt()
openssl
传输层安全性/安全套接层及其加密库
项目地址:https://gitcode.com/gh_mirrors/ope/openssl

·
转自: http://yuanshuilee.blog.163.com/blog/static/21769727520140942826137/
稍作注释。
AES有几种扩展算法,其中ecb和cbc需要填充,即加密后长度可能会不一样,cfb和ofb不需要填充,密文长度与明文长度一样
1. 对称加密(比如AES)加密后的结果都是一个某个数(比如128bit=16字节)的整倍数。
2. 对称加密(比如AES)大部分都是分块加密的。比如你加密1个字节和加密2个字节的结果长多都是一样的。
因为都没有超过加密最小块的大小,如果不足,会自动填充的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/aes.h>
#define AES_BITS 128
#define MSG_LEN 128
int aes_encrypt(char* in, char* key, char* out,int len)//, int olen)可能会设置buf长度
{
if(!in || !key || !out) return 0;
unsigned char iv[AES_BLOCK_SIZE];//加密的初始化向量
for(int i=0; i<AES_BLOCK_SIZE; ++i)//iv一般设置为全0,可以设置其他,但是加密解密要一样就行
iv[i]=0;
AES_KEY aes;
if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
//int len=strlen(in);//这里的长度是char*in的长度,但是如果in中间包含'\0'字符的话
//那么就只会加密前面'\0'前面的一段,所以,这个len可以作为参数传进来,记录in的长度
//至于解密也是一个道理,光以'\0'来判断字符串长度,确有不妥,后面都是一个道理。
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_ENCRYPT);
return 1;
}
int aes_decrypt(char* in, char* key, char* out,int len)
{
if(!in || !key || !out) return 0;
unsigned char iv[AES_BLOCK_SIZE];//加密的初始化向量
for(int i=0; i<AES_BLOCK_SIZE; ++i)//iv一般设置为全0,可以设置其他,但是加密解密要一样就行
iv[i]=0;
AES_KEY aes;
if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
// int len=strlen(in);
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_DECRYPT);
return 1;
}
int main(int argc,char *argv[])
{
char sourceStringTemp[MSG_LEN];
char dstStringTemp[MSG_LEN];
memset((char*)sourceStringTemp, 0 ,MSG_LEN);
memset((char*)dstStringTemp, 0 ,MSG_LEN);
strcpy((char*)sourceStringTemp, "123456789 123456789 123456789 12a");
//strcpy((char*)sourceStringTemp, argv[1]);
char key[AES_BLOCK_SIZE];
int i;
for(i = 0; i < 16; i++)//可自由设置密钥
{
key[i] = 32 + i;
}
int sour_len = strlen((char*)sourceStringTemp);
if(!aes_encrypt(sourceStringTemp,key,dstStringTemp,MSG_LEN))
{
printf("encrypt error\n");
return -1;
}
printf("enc %d:",strlen((char*)dstStringTemp));
for(i= 0;dstStringTemp[i];i+=1){
printf("%x",(unsigned char)dstStringTemp[i]);
}
memset((char*)sourceStringTemp, 0 ,MSG_LEN);
if(!aes_decrypt(dstStringTemp,key,sourceStringTemp,MSG_LEN))
{
printf("decrypt error\n");
return -1;
}
printf("\n");
printf("dec %d:",strlen((char*)sourceStringTemp));
printf("%s\n",sourceStringTemp);
for(i= 0;i < sour_len;i+=1){
printf("%x",(unsigned char)sourceStringTemp[i]);
}
printf("\n");
return 0;
}




传输层安全性/安全套接层及其加密库
最近提交(Master分支:5 个月前 )
75bc132d
Current preforms the following operations
1) Generates arbitrary key pairs
2) Generates key pairs with parameters (both correct and incorrect)
based on fuzzer input buffer
3) Exports and re-imports keys, confirming validity
4) Preforms Sign and Verify operations with optional parameters based on
fuzzer input buffer
Reviewed-by: Paul Dale <ppzgs1@gmail.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/26708)
29 天前
0e436524
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Viktor Dukhovni <viktor@openssl.org>
Reviewed-by: Paul Dale <ppzgs1@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/26701)
29 天前
更多推荐
所有评论(0)