关于网友提出的“ 使用openssl的AES_encrypt加解密出问题”问题疑问,本网通过在网上对“ 使用openssl的AES_encrypt加解密出问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 使用openssl的AES_encrypt加解密出问题描述:
本帖最后由 Gfeng168 于 2014-11-10 11:54:15 编辑
openssl解密加密
我做了两个接口,使用加密接口aes_encrypt_cli加密后,使用解密接口aes_decrypt_cli解密输出是乱码int aes_encrypt_cli(const char *in, char *out, AES_KEY *aes)
{
if(!in || !out || !aes)
return(-1);
int in_len, en_len;
in_len = strlen(tin), en_len = 0;
while(en_len < in_len){
AES_encrypt((unsigned char*)in, (unsigned char*)out, aes);
in += AES_BLOCK_SIZE;
out += AES_BLOCK_SIZE;
en_len += AES_BLOCK_SIZE;
}
}
int aes_decrypt_cli(const char *in, char *out, AES_KEY *aes)
{
if(!in || !out || !aes)
return(-1);
int in_len, de_len;
in_len = strlen(in), de_len = 0;
while(de_len < in_len){
AES_decrypt((unsigned char*)in, (unsigned char*)out, aes);
in += AES_BLOCK_SIZE;
out += AES_BLOCK_SIZE;
de_len += AES_BLOCK_SIZE;
}
}
下面是测试程序
#include
#include
#include
#include
#include
#include
#include
#define NBUFF 4096
int main(int argc, char *argv[])
{
AES_KEY aes;
unsigned char key[AES_BLOCK_SIZE];
unsigned char in[NBUFF], out[NBUFF];
unsigned char iv[AES_BLOCK_SIZE];
int rfd, wfd, kfd, nread, n;
unsigned char c;
if (argc != 4){
printf("usage: a.out [ -e ] [ -d ]\n");
exit(EXIT_FAILURE);
}
rfd = open(argv[2], O_RDONLY, 0);
wfd = open(argv[3], O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
kfd = open("key", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
nread = read(rfd, in, NBUFF);
while((c = getopt(argc, argv, "ed")) != -1){
switch(c){
case 'e':
if (create_key(key, AES_BLOCK_SIZE) < 0){
fprintf(stderr, "create key error:%s\n", strerror(errno));
exit(EXIT_FAILURE);
}
if (AES_set_encrypt_key(key, 128, &aes) < 0){
fprintf(stderr, "AES_set_encrypt_key error\n");
exit(1);
}
write(kfd, key, AES_BLOCK_SIZE); //如果加密,将密钥写入key文件
aes_encrypt_cli(in, out, &aes);
write(wfd, out, strlen(out));
break;
case 'd':
read(kfd, key, AES_BLOCK_SIZE); //如果是解密,从key文件读出密钥
if (AES_set_decrypt_key(key, 128, &aes) < 0){
fprintf(stderr, "AES_set_encrypt_key error\n");
exit(1);
}
aes_decrypt_cli(in, out, &aes);
write(wfd, out, strlen(out));
break;
}
break;
}
close(rfd);
close(wfd);
close(kfd);
return 0;
}