gpt4 book ai didi

c - OpenSSL AES 256 CBC 通过 C 中的 EVP api

转载 作者:太空狗 更新时间:2023-10-29 16:59:57 27 4
gpt4 key购买 nike

我正在尝试做的事情:用 C 编写一个程序,打开一个任意大小的文件并读取其内容。读取内容后,它将使用 AES 256 CBC 对其进行加密,并将密文保存到名为 ciphertext 的文件中。保存后,它将关闭这两个文件。然后将从刚刚保存的文件中打开密文并解密密文并将其保存到名为 decrypted 的文件中。

我的问题:它似乎永远不会解密我的密文。我得到垃圾,我不知道我做错了什么。请帮忙。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/aes.h>

void encrypt(FILE *ifp, FILE *ofp)
{
//Get file size
fseek(ifp, 0L, SEEK_END);
int fsize = ftell(ifp);
//set back to normal
fseek(ifp, 0L, SEEK_SET);

int outLen1 = 0; int outLen2 = 0;
unsigned char *indata = malloc(fsize);
unsigned char *outdata = malloc(fsize*2);
unsigned char ckey[] = "thiskeyisverybad";
unsigned char ivec[] = "dontusethisinput";

//Read File
fread(indata,sizeof(char),fsize, ifp);//Read Entire File

//Set up encryption
EVP_CIPHER_CTX ctx;
EVP_EncryptInit(&ctx,EVP_aes_256_cbc(),ckey,ivec);
EVP_EncryptUpdate(&ctx,outdata,&outLen1,indata,fsize);
EVP_EncryptFinal(&ctx,outdata,&outLen2);
fwrite(outdata,sizeof(char),fsize,ofp);
}

void decrypt(FILE *ifp, FILE *ofp)
{
//Get file size
fseek(ifp, 0L, SEEK_END);
int fsize = ftell(ifp);
//set back to normal
fseek(ifp, 0L, SEEK_SET);

int outLen1 = 0; int outLen2 = 0;
unsigned char *indata = malloc(fsize);
unsigned char *outdata = malloc(fsize*2);
unsigned char ckey[] = "thiskeyisverybad";
unsigned char ivec[] = "dontusethisinput";

//Read File
fread(indata,sizeof(char),fsize, ifp);//Read Entire File

//setup decryption
EVP_CIPHER_CTX ctx;
EVP_DecryptInit(&ctx,EVP_aes_256_cbc(),ckey,ivec);
EVP_DecryptUpdate(&ctx,outdata,&outLen1,indata,fsize);
EVP_DecryptFinal(&ctx,outdata,&outLen2);
fwrite(outdata,sizeof(char),fsize,ofp);
}

int main(int argc, char *argv[])
{
FILE *fIN, *fOUT;

fIN = fopen("plain.txt", "rb");//File to be encrypted; plain text
fOUT = fopen("cyphertext.txt", "wb");//File to be written; cipher text
encrypt(fIN, fOUT);

fclose(fIN);
fclose(fOUT);

//Decrypt file now
fIN = fopen("cyphertext.txt", "rb");//File to be written; cipher text
fOUT = fopen("decrypted.txt", "wb");//File to be written; cipher text
decrypt(fIN,fOUT);

fclose(fIN);
fclose(fOUT);

return 0;
}

注意:可能会有一些拼写错误。编辑:好像我在 key 和 IV 上犯了一个错误,它们都是 128 位的,我正在尝试使用 256 位的 CBC。这是我的问题,一旦我将其更改为

似乎就可以了
EVP_aes_128_cbc()

最佳答案

这是我的代码版本。我自然更喜欢它,但我提供它只是作为替代品。请注意完全没有错误检查:真正的代码会有它。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/aes.h>

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif


/**
* Encrypt or decrypt, depending on flag 'should_encrypt'
*/
void en_de_crypt(int should_encrypt, FILE *ifp, FILE *ofp, unsigned char *ckey, unsigned char *ivec) {

const unsigned BUFSIZE=4096;
unsigned char *read_buf = malloc(BUFSIZE);
unsigned char *cipher_buf;
unsigned blocksize;
int out_len;
EVP_CIPHER_CTX ctx;

EVP_CipherInit(&ctx, EVP_aes_256_cbc(), ckey, ivec, should_encrypt);
blocksize = EVP_CIPHER_CTX_block_size(&ctx);
cipher_buf = malloc(BUFSIZE + blocksize);

while (1) {

// Read in data in blocks until EOF. Update the ciphering with each read.

int numRead = fread(read_buf, sizeof(unsigned char), BUFSIZE, ifp);
EVP_CipherUpdate(&ctx, cipher_buf, &out_len, read_buf, numRead);
fwrite(cipher_buf, sizeof(unsigned char), out_len, ofp);
if (numRead < BUFSIZE) { // EOF
break;
}
}

// Now cipher the final block and write it out.

EVP_CipherFinal(&ctx, cipher_buf, &out_len);
fwrite(cipher_buf, sizeof(unsigned char), out_len, ofp);

// Free memory

free(cipher_buf);
free(read_buf);
}

int main(int argc, char *argv[]) {

unsigned char ckey[] = "thiskeyisverybad";
unsigned char ivec[] = "dontusethisinput";
FILE *fIN, *fOUT;

if (argc != 2) {
printf("Usage: <executable> /path/to/file/exe");
return -1;
}

// First encrypt the file

fIN = fopen("plain.txt", "rb"); //File to be encrypted; plain text
fOUT = fopen("cyphertext.txt", "wb"); //File to be written; cipher text

en_de_crypt(TRUE, fIN, fOUT, ckey, ivec);

fclose(fIN);
fclose(fOUT);

//Decrypt file now

fIN = fopen("cyphertext.txt", "rb"); //File to be read; cipher text
fOUT = fopen("decrypted.txt", "wb"); //File to be written; cipher text

en_de_crypt(FALSE, fIN, fOUT, ckey, ivec);

fclose(fIN);
fclose(fOUT);

return 0;
}

关于c - OpenSSL AES 256 CBC 通过 C 中的 EVP api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com