- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下问题。有人可以给我建议一个解决方案吗。
我是第一次做文件的加密和解密。
我使用以下命令通过命令提示符加密了文件:
openssl enc -aes-256-cbc -in file.txt -out file.enc -k "key value" -iv "iv value"
我必须以编程方式解密它。所以我已经为它编写了程序,但它抛出了以下错误:
./exe_file enc_file_directory
...
error: 06065064: digital envelope routines: EVP_DecryptFInal_ex: bad decrypt: evp_enc.c
下面的程序将输入作为目录路径并搜索加密文件“.enc”并尝试将其读入缓冲区进行解密。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/conf.h>
#include <libxml/globals.h>
void handleErrors(char *msg)
{
{
ERR_print_errors_fp(stderr);
printf("%s", msg);
abort();
}
}
void freeMemory(char *mem)
{
if (NULL != mem)
{
free(mem);
mem = NULL;
}
}
/* Function to decrypt the XML files */
int decryptXML(unsigned char *indata, unsigned char *outdata, int fsize)
{
int outlen1 = 0, outlen2 = 0;
unsigned char iv[] = "b63e541bc9ece19a1339df4f8720dcc3";
unsigned char ckey[] = "70bbc518c57acca2c2001694648c40ddaf19e3b4fe1376ad656de8887a0a5ec2" ;
if (NULL == indata)
{
printf ("input data is empty\n");
return 0;
}
if (0 >= fsize)
{
printf ("file size is zero\n");
return 0;
}
outdata = (char *) malloc (sizeof (char) * fsize * 2);
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if (! EVP_DecryptInit_ex (&ctx, EVP_aes_256_cbc(), NULL, ckey, iv))
{
EVP_CIPHER_CTX_cleanup(&ctx);
handleErrors("DInit");
}
if (! EVP_DecryptUpdate (&ctx, outdata, &outlen1, indata, fsize))
{
EVP_CIPHER_CTX_cleanup(&ctx);
handleErrors("DUpdate");
}
if (! EVP_DecryptFinal_ex (&ctx, outdata + outlen1, &outlen2))
{
EVP_CIPHER_CTX_cleanup(&ctx);
handleErrors("DFinal");
}
EVP_CIPHER_CTX_cleanup(&ctx);
return outlen1+outlen2;
}
int isDirectory(char *path)
{
DIR *dir = NULL;
FILE *fin = NULL, *fout = NULL;
int enc_len = 0, dec_len = 0, fsize = 0, ksize = 0;
unsigned char *indata = NULL, *outdata = NULL;
char buff[BUFFER_SIZE], file_path[BUFFER_SIZE], cur_dir[BUFFER_SIZE];
struct dirent *in_dir;
struct stat s;
if (NULL == (dir = opendir(path)))
{
printf ("ERROR: Failed to open the directory %s\n", path);
perror("cannot open.");
exit(1);
}
while (NULL != (in_dir = readdir(dir)))
{
if (!strcmp (in_dir->d_name, ".") || !strcmp(in_dir->d_name, ".."))
continue;
sprintf (buff, "%s/%s", path, in_dir->d_name);
if (-1 == stat(buff, &s))
{
perror("stat");
exit(1);
}
if (S_ISDIR(s.st_mode))
{
isDirectory(buff);
}
else
{
strcpy(file_path, buff);
if (strstr(file_path, ".enc"))
{
/* File to be decrypted */
fout = fopen(file_path,"rb");
fseek (fout, 0L, SEEK_END);
fsize = ftell(fout);
fseek (fout, 0L, SEEK_SET);
indata = (char*)malloc(fsize);
fread (indata, sizeof(char), fsize, fout);
if (NULL == fout)
{
perror("Cannot open enc file: ");
return 1;
}
dec_len = decryptXML (indata, outdata, fsize);
outdata[dec_len] = '\0';
printf ("%s\n", outdata);
fclose (fin);
fclose (fout);
}
}
}
closedir(dir);
freeMemory(outdata);
freeMemory(indata);
return 1;
}
int main(int argc, char *argv[])
{
int result;
if (argc != 2)
{
printf ("Usage: <executable> path_of_the_files\n");
return -1;
}
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
OPENSSL_config(NULL);
/* Checking for the directory existance */
result = isDirectory(argv[1]);
EVP_cleanup();
ERR_free_strings();
if (0 == result)
return 1;
else
return 0;
}
谢谢。
最佳答案
当您使用不兼容版本的 openssl 进行加密和解密时,也会出现此消息 digital envelope routines: EVP_DecryptFInal_ex: bad decrypt
。
我遇到的问题是我在具有 1.1.0 版本的 Windows 上加密,然后在具有 1.0.2g 的通用 Linux 系统上解密。
这不是一个非常有用的错误信息!
来自@AndrewSavinykh 的可能解决方案适用于许多人(参见评论):
Default digest has changed between those versions from md5 to sha256. One can specify the default digest on the command line as
-md sha256
or-md md5
respectively
关于c - 文件解密时出现 "EVP_DecryptFInal_ex: bad decrypt"如何解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304570/
我已经在 nodejs 中重新实现了这个 AES c++ 解密。 “缓冲区”包含加密内容。“decryptKey”包含解密“缓冲区”的 key 。“expectedOutput”包含预期的输出。 为了
我正在尝试解密从后端服务器接收到的字符串 "~9?8?m???=?T?G",该服务器使用 OpenSSL 加密字符串,使用AES-256-CBC。有代码块: public static String
输入图像是被分解为64像素块的灰度图像,加密函数采用64像素(512位)作为输入值和64位密钥。我们将INPUT_VALUE分成8个像素值的块。我们对一组8个像素进行16轮加密。其他每个函数都进行一些
输入图像是被分解为64像素块的灰度图像,加密函数采用64像素(512位)作为输入值和64位密钥。我们将INPUT_VALUE分成8个像素值的块。我们对一组8个像素进行16轮加密。其他每个函数都进行一些
目前我正在使用 PyPDF 2,我也尝试将 PyPDF 4 作为依赖项。 我遇到了一些加密文件并像往常一样处理它们(在以下代码中): import PyPDF2 import PyPDF4 pdfFi
我需要解密 JavaScript 中的十六进制消息,其结果与用 Java 编写的代码完全相同。然而,使用 CryptoJs 的 Javascript 版本返回一个空结果 Java中的代码: priva
我正在设计一个使用加密的匿名聊天网站。我应该在客户端解密消息还是在服务器端解密消息?哪种方法更安全?我使用Node.js + Socket.io来开发聊天系统。 例如: 用户A加密消息,将加密消息发送
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: How come MD5 hash values are not reversible? 我正在阅读一个关于 MD5
因此,我使用以下代码成功将密码加密为密码哈希: class PassHash { // blowfish private static $algo = '$2a'; // co
我不确定,但我认为我的问题是我的函数没有比较字符的正确性。我使用 Switch 也是对的吗? 我的输入 x 是一个字符串,当 x = "aaaaa"时它返回 "aaaaa"而不是 "zzzzz"。 S
我很难逆转这个算法: decrypt_algorithm = function (text) { var parser = new TextParser(text); var decrypt_
我正在编写一个程序,它接受来自控制台的输入 - 一个 zip 文件的名称,一个包含从第一个 zip 生成的(de/en)加密文件的 zip 文件的名称和一个包含公钥。解密时出现异常: exceptio
我正在使用回溯来打印应用程序的堆栈跟踪,我得到类似的东西 libQtCore.so.4(_ZN11QMetaObject8activateEP7QObjectPKS_iPPv+0x843) [0x7f
为什么 Pycrypto AES 解密在使用用于加密的 AES 对象解密时给出不同的输出,而在使用仅用于解密的 AES 对象解密时给出正确的输出? from Crypto.Cipher import
在以下代码中:symmetryCryptoKey 表示应始终受到保护的私有(private)信息,因为它是加密对称 key 的解密版本。 问题: 是否可以进行其他增强来保护 Multi-Tenancy
我正在开展一个项目,部分要求: 添加一个复选框菜单项 Decrypt,可以选中该选项进行解密,也可以取消选中该选项进行加密。该项目应与 GUI 中的切换按钮相关联。两者都应反射(reflect)应用程
我在 ColdFusion 中有一个函数可以加密和解密密码。我需要有人查看该函数并指出我或给我写一个 c# 等效项。一个项目尽快需要它,所以如果你能帮忙的话,我可以通过 paypal 给你一些现金。
我目前正在编写一个非常小的Java程序来实现一次性pad,其中pad(或 key )本身是使用SecureRandom对象生成为一系列字节的,该对象使用一个简单的字符串进行播种SHA-512 算法。
这是我在运行编码和解码类时遇到的错误。 javax.crypto.BadPaddingException: Decryption error at sun.security.rsa.RSAPa
我正在尝试在我的客户端和服务器之间实现基于 RSA 的加密通信。为此,我通过以下方式使用 openssl 生成了 RSA 公钥和私钥: openssl genrsa -out private.pem
我是一名优秀的程序员,十分优秀!