gpt4 book ai didi

c - 加密/解密文件 libgcrypt

转载 作者:行者123 更新时间:2023-11-30 15:17:29 28 4
gpt4 key购买 nike

我一直在努力理解如何正确使用 libgcrypt,并尽力编写了一些代码。尽管如此,我正在尝试使用上述库加密(AES 256)和解密文件。用户将输入文件名作为命令行参数。加密的文件将保存为第二个文件 (output.txt)。然后,我想解密该文件以确保我的结果是正确的。每次运行该程序时,生成的 key 都有一些外来字符,并且生成的输出文件是空白的。我是否正确使用了导出函数?我只是错误地解密了文件吗?我为我糟糕的代码提前道歉。

#include <stdio.h>
#include <gcrypt.h>
#include <time.h>
#include <sys/stat.h>
//#define GCRY_CIPHER_AES256
//#define GCRY_KDF_PBKDF2
void intitializeLibrary();

int main(int argc, char **argv)
{
if(argc ==2){
char *filename = argv[1];
printf("The file you've requested to be encrypted is %s \n", filename);
FILE *ifp, *ifpout;
char *mode ="r";

ifp = fopen(filename, mode);
ifpout = fopen("output.txt", "w");
if (ifp == NULL || ifpout == NULL){
fprintf(stderr, "Can't open file! \n");
exit(1);
} else{
intitializeLibrary();
struct stat st;
stat(filename, &st);
int size = st.st_size;

char *encBuffer = malloc(32);
char str[100];
char keybuffer[32];
char* salt = "CNT5410";
char* iv = "assignment222222";
printf("Enter password: ");
gcry_cipher_hd_t handle;
gets(str);

gpg_error_t err;
err = gcry_kdf_derive(str, 100, GCRY_KDF_PBKDF2, GCRY_CIPHER_AES256, salt, 7, 3, 32, keybuffer);
if(err){
printf("Error in PBKDF2 \n");
exit(1);
}

puts(keybuffer);

err = gcry_cipher_open(&handle, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB, 0);
if(err){
printf("Error in cipheropen\n");
exit(1);
}

err = gcry_cipher_setkey(handle, keybuffer, 32);
if(err){
printf("Error in cipheropen\n");
exit(1);
}

err = gcry_cipher_setiv(handle, iv, 16);
int bytes;
while(!feof(ifp)){
bytes = fread(encBuffer, 1, size, ifp);
if(!bytes){
break;
}
while(bytes < 32){
encBuffer[bytes++] = 0x0;
gcry_cipher_encrypt(handle, encBuffer, size, NULL,0);
bytes = fwrite(encBuffer, size, 16, ifpout);
}
}

gcry_cipher_close(handle);
fclose(ifp);
fclose(ifpout);

struct stat st2;
stat(filename, &st2);
int size2 = st2.st_size;

err = gcry_cipher_open(&handle, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB, 0);
if(err){
printf("Error in cipheropen\n");
exit(1);
}

err = gcry_cipher_setkey(handle, keybuffer, 32);
if(err){
printf("Error in cipheropen\n");
exit(1);
}

err = gcry_cipher_setiv(handle, iv, 16);
ifp = fopen("output.txt", mode);
ifpout = fopen(filename, "w");
while(!feof(ifp)){
bytes = fread(encBuffer, 1, size2, ifp);
if(!bytes){
break;
}
while(bytes < 32){
encBuffer[bytes++] = 0x0;
gcry_cipher_encrypt(handle, encBuffer, size2, NULL,0);
bytes = fwrite(encBuffer, 1, size2, ifpout);
}
}

free(encBuffer);
encBuffer = NULL;


}
}else{
puts("Please enter one file to encrypt");
}
return 0;
}

void intitializeLibrary(){

/* Version check should be the very first call because it
makes sure that important subsystems are intialized. */
if (!gcry_check_version (GCRYPT_VERSION)){
fputs ("libgcrypt version mismatch\n", stderr);
exit (2);
}

/* Disable secure memory. */
gcry_control (GCRYCTL_DISABLE_SECMEM, 0);

/* ... If required, other initialization goes here. */

/* Tell Libgcrypt that initialization has completed. */
gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);

/* Disable secure memory. */
gcry_control (GCRYCTL_DISABLE_SECMEM, 0);

/* ... If required, other initialization goes here. */

/* Tell Libgcrypt that initialization has completed. */
gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
}

最佳答案

您假设 key 由可打印字符组成。它不是,它由可能具有任何值(0..255,或者在您的情况下,如果无符号,-128 到 127)的字节(C/C++ 中的 char)组成。如果将它们打印到标准输出,那么标准输出将使用当前配置的字符编码对这些字节进行解码并显示结果。所以这基本上显示了任何类型的垃圾。所以这没有问题;以十六进制打印出 key 以了解 key 值。

至于错误,您正在以文本模式而不是二进制模式打开文件。密文与 key 一样,包含随机字节。您应该以二进制模式打开密文文件。或者,您可以将密文字节转换为十六进制或基数 64。

来自 fopen 手册页:

In order to open a file as a binary file, a "b" character has to be included in the mode string. This additional "b" character can either be appended at the end of the string (thus making the following compound modes: "rb", "wb", "ab", "r+b", "w+b", "a+b") or be inserted between the letter and the "+" sign for the mixed modes ("rb+", "wb+", "ab+").

尝试了解十六进制和 Base 64 等编码以及 ASCII 和 UTF-8 等字符编码。如果您想执行任何类型的加密/解密,则需要它。

关于c - 加密/解密文件 libgcrypt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445699/

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