使用OpenSSL的AES_encrypt和AES_decrypt函数出问题

发布于 2021-11-24 09:02:33 字数 2190 浏览 705 评论 9

我做了两个接口,使用加密接口aes_encrypt_cli加密后,使用解密接口aes_decrypt_cli解密输出是乱码



下面是测试程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <openssl/aes.h>
#include <fcntl.h>

#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 ] <infile> <outfile> 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:%sn", strerror(errno));
                           exit(EXIT_FAILURE);
                 }
                if (AES_set_encrypt_key(key, 128, &aes) < 0){
                          fprintf(stderr, "AES_set_encrypt_key errorn");
                          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 errorn");
                          exit(1);
                 }
                aes_decrypt_cli(in, out,  &aes);
                write(wfd, out, strlen(out));
                break;
        }
        break;
    }

    close(rfd);
    close(wfd);
    close(kfd);
    return 0;
}



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

筱果果 2021-11-27 18:33:59

不能用strlen测试吗?那怎么得到内容的大小呢?sizeof?

断爱 2021-11-27 18:27:39

改过解密函数后还是有问题哦

牵你的手,一向走下去 2021-11-27 18:20:19

解决了,测试函数里面还有错误

草莓味的萝莉 2021-11-27 17:10:38

回复
不能用strlen是因为aes加密后的内容是二进制的,并不是文本,很可能会出现的。

断爱 2021-11-27 12:59:24

那用sizeof可以了吗?

不乱于心 2021-11-27 09:29:39

我能打个流汗的表情吗?两个函数里的内容一模一样。


再说加密后的内容也不能用strlen来测试长度吧,请传一个长度参数进去。

狼亦尘 2021-11-26 21:56:03

改过来后还是解密不出明文来哦

小情绪 2021-11-26 18:45:33

解决了,测试函数里面还有错误,已经改过来了,包括帖子里

小情绪 2021-11-26 13:13:43

你的aes_decrypt_cli函数中调用的是AES_encrypt , 没有使用AES_decrypt

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文