gpt4 book ai didi

c - 在 fread/fwrite 期间去除 AES 填充

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:20 25 4
gpt4 key购买 nike

我正在使用 libgcrypt 来加密和解密文件。当我使用 fread 获取适当数量的字节时,我需要用 16-n 字节填充它,以便它能够被 gcry_cipher_encrypt 正确加密。然而,在解密时,空字节/填充仍然存在。有什么办法可以读写16字节的 block ,还去掉最后的padding吗?

#include <stdio.h>
#include <gcrypt.h>

#define algo GCRY_CIPHER_AES128
#define mode GCRY_CIPHER_MODE_CBC
#define KEY_LENGTH 16
#define BLOCK_LENGTH 16

int main(){

char IV[16];
char *encBuffer = NULL;
FILE *in, *out, *reopen;
char *key = "A key goes here!";
gcry_cipher_hd_t handle;
int bufSize = 16, bytes;

memset(IV, 0, 16);

encBuffer = malloc(bufSize);

in = fopen("in.txt", "r");
out = fopen("out.txt", "w");

gcry_cipher_open(&handle, algo, mode, 0);
gcry_cipher_setkey(handle, key, KEY_LENGTH);
gcry_cipher_setiv(handle, IV, BLOCK_LENGTH);

while(1){
bytes = fread(encBuffer, 1, bufSize, in);
if (!bytes) break;
while(bytes < bufSize)
encBuffer[bytes++] = 0x0;
gcry_cipher_encrypt(handle, encBuffer, bufSize, NULL, 0);
bytes = fwrite(encBuffer, 1, bufSize, out);
}

gcry_cipher_close(handle);
fclose(in);
fclose(out);

gcry_cipher_open(&handle, algo, mode, 0);
gcry_cipher_setkey(handle, key, KEY_LENGTH);
gcry_cipher_setiv(handle, IV, BLOCK_LENGTH);

reopen = fopen("out.txt", "r");
out = fopen("decoded.txt", "w");

while(1){
bytes = fread(encBuffer, 1, bufSize, reopen);
if (!bytes) break;
gcry_cipher_decrypt(handle, encBuffer, bufSize, NULL, 0);
bytes = fwrite(encBuffer, 1, bufSize, out);
}

gcry_cipher_close(handle);

free(encBuffer);

return 0;
}

最佳答案

分组密码有多种操作模式。有些要求输入数据长度是 block 大小的倍数,因此本质上需要明文填充;有些没有。查看更多相关信息 here .

如果必须使用需要填充的模式,则必须将明文长度与加密数据一起保存。最简单的方法是最后将它写入一个附加 block (也加密该 block !)。还有其他更复杂的方案,并不总是需要添加一个 block ;见this .

关于c - 在 fread/fwrite 期间去除 AES 填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35835927/

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