问题标签 [evp-cipher]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1035 浏览

c++11 - 用 OpenSSL 解密 EVP 密码后,8 字节的明文总是不正确

我在使用 EVP 函数和对称密钥使用 OpenSSL 库解密某些数据时遇到问题。我像 using 一样加密命令上的数据openssl enc,然后用 C++ 代码解密。这工作......主要是。

无论我使用什么数据,在我执行解密之后,明文中的第二个 8 字节块是不正确的(字节 8 到 15) - 但文件的其余部分是正确的。我什至用 130 meg 的文件完成了这项工作——所有 130 meg 都是完全正确的,并且在文件中的正确位置,除了那些字节。

这既发生在 ARM 目标上,也发生在 Ubuntu 12.04 上(不同的库、不同的工具链)。

这是一个有问题的简短完整的程序。下面是一些演示它的终端输出。

这是实际问题的演示。我创建了一个全为零的 1 meg 文件,对其进行加密、解密,然后使用od. 如果我多次执行此操作,则这 8 个错误字节的值会随着运行而变化……

0 投票
0 回答
987 浏览

encryption - 如何在 OpenSSL EVP API 中设置和使用初始化向量 (IV)

我正在尝试使用用户输入的密码来开发文件加密功能。我正在这里研究 WiKi 的示例函数,但不明白“key”和“iv”是如何工作的。通过实验,我发现我只需要相同的密钥值来解密文件,但不一样 iv!事实上,我在解密时使用了一个随机的 iv 字符串,它解密得很好。我计划从发件人的密码生成密钥以与文件收件人共享,但我不确定如何处理 iv 值?是否需要与接收者共享并用于解密,或者我可以使用随机生成的值,或者我应该在程序中对值进行硬编码以进行加密和解密?在这种情况下,“iv”是用来做什么的?

0 投票
1 回答
807 浏览

c - 如何验证给定哈希和公钥的数字签名?

有很多用 C 语言编写的关于如何验证消息上的数字签名的示例,但我的用例要求我只提供消息哈希。

那么有没有替代EVP_DigestVerifyUpdate(mdctx, msg, strlen(msg));我可以直接提供哈希的地方?

0 投票
1 回答
482 浏览

c - implementing openssl evp encryption

I am currently doing some testing on brute forcing some simple text using EVP in C.

The plaintext, ciphertext, key size, encryption method and methodology are provided. We simply need to try different key which is a known dictionary word.

THE MAIN ISSUE IS IF I TRY TO CALL THE EVP METHOD DIRECTLY FROM MAIN LIKE THIS:

It fails to find the key(cannot generate the same cipher)

But the call with clock(); called:

It works fine! Why is this happening? What am I doing wrong? Can someone explain what the problem is?

The encryption using aes-128-cbc to encrypt the plaintext, while the iv is 16 bytes NULL and the key is a single dictionary word with the length smaller than 16 and will be feed with empty space when its length is smaller than 16.

The Following code is used to perform the whole process:

The add_space method simply feed the key with empty space:

The read_word method read a single word from the dictionary:

And the encrypt method is the main process to encrypt the plaintext:

0 投票
1 回答
303 浏览

openssl - EVP_PKEY_encrypt 输入和输出缓冲区可以与 RSA 算法相同吗?

RSA加密/解密EVP_PKEY_encrypt的输入和输出缓冲区可以相同吗 ?OpenSSL文档既不明确否认也不允许这样做。

0 投票
2 回答
300 浏览

encryption - 如何检测用于解密 openssl rc2-64-cbc nopad 的错误密钥

我有一些加密数据,使用 rc2-64-cbc NO PADDING 加密。我能够很好地解密。

问题:即使加密的内容是用错误的密钥加密的,我的解密也不会出错,而是解密为一些垃圾值,因为它的 rc2 并且我相信没有填充。

我尝试使用 openssl Linux 命令提示符和我的 C/C++ 程序(使用 EVP_* API 调用)。

是否有任何 openssl 选项/方法来检测使用的错误密钥?(命令行或 EVP_* C/C++ API 调用)

0 投票
1 回答
2422 浏览

c - 从命令行测试自定义 openSSL 引擎

快速提问:如何验证我从命令行编写的自定义 openSSL 引擎的功能?

现在我正在关注这个很棒的教程,并且能够使用我的测试程序(源代码在这里,测试程序位于 test/wssha256engine_test.c)成功地运行引擎(它返回一个全为 2 的摘要值)。

但是,由于某些原因,我还想使用 openssl 命令行界面来练习我刚刚编写的引擎,并让它像在其他教程中一样计算随机字符串的摘要,只使用 sha256 而不是 md5。

但是当我尝试这样做时,引擎不会加载并导致错误告诉我我的摘要的 NID 不存在,而是使用标准算法对字符串进行哈希处理:

为什么我不能在命令行上使用我的引擎,但我可以创建一个 C 程序来加载它?以及如何使用我的引擎从命令行计算摘要?

注意:我可以从命令行加载引擎,只是不使用它。

0 投票
0 回答
335 浏览

c - 如何在自定义 ENGINE 中正确定义 EVP_CIPHER 初始化/更新/最终函数?

我正在构建一个动态引擎来支持我在 FPGA 逻辑中实现的自定义 AES 硬件模块**,但是在阅读了所有可用的文档并翻阅了源代码之后,我仍然对以下两件事感到非常困惑......

  1. 我应该如何以及在哪里定义引擎代码中的EVP_[En/De]cryptInit_ex(..)EVP_[En/De]cryptUpdate(..)和函数?EVP_[En/De]cryptFinal_ex(..)

在此之前,我成功地为我的 sha256 加速器构建了一个引擎,现在我正在尝试为 AES 遵循相同的步骤。对于 sha256,该EVP_MD结构允许我声明指向我的 init、update 和 final 函数的指针。这一切都完美无缺。

现在,当我构建 AES 引擎时,我看到该EVP_CIPHER结构没有这些指针(init、update、final),而是有一个指向 init_key 和 do_cipher 函数的指针。但是,EVP 加密接口仍然定义了这些功能。

AFAIK(如果这是错误的,请纠正我)init_key当我调用函数时,EVP 接口调用了我的EVP_[En/De]cryptInit_ex函数,并且调用了该do_cipher函数EVP_[En/De]cryptUpdate。但是我应该如何处理这些EVP_[En/De]cryptFinal功能?我不应该在我的引擎中实现它们吗?或者我在这里遗漏了什么......

  1. 当涉及到动态引擎时,EVP 接口是否处理填充?还是由我在引擎本身内实现填充结构?如果是后者,那么我认为前面问题的答案将帮助我弄清楚在哪里实现它。

如果您想查看源代码,您可以参考这里的源代码,但我认为这个问题没有必要。

回顾一下,两个问题:

  1. 当从驱动程序调用、 和函数时EVP_[En/De]cryptInit_ex(..),如何明确定义引擎中发生的哪些操作?EVP_[En/De]cryptUpdate(..)EVP_[En/De]cryptFinal_ex(..)
  2. 我的引擎是否需要在加密时处理输入数据的填充,并在解密时剥离填充?或者 EVP API 是否为我处理填充,我只需要担心任意输入数据的核心 AES 算法?(作为参考,我只想使用标准的 PKCS 填充)

提前致谢!

** 我使用的是 Xilinx Zynq SoC,所以我可以在可编程逻辑中创建自定义硬件,然后通过内存映射从处理器上运行的软件与它进行交互,就像任何外围设备一样......细节无关紧要

0 投票
1 回答
787 浏览

openssl - Sign、DigestSign 和 Digest 有什么区别?

我正在实现散列(又名摘要)并登录使用 OpenSSL EVP API 的应用程序。然而,API 有三个非常相似的方法,令人困惑:

  • Sign这听起来应该用于签名,但EVP_SignInit只是#define一个EVP_DigestInit
  • Digest这似乎只能用于哈希生成,无法指定EVP_PKEY.
  • DigestSign看起来它同时进行散列和签名。

但是文档建议DigestSign用于签名(而不是实际的Sign)。

我不是密码学专家,所以这让我很困惑。它们之间有什么区别?哪一个是实施签名的好选择?

0 投票
1 回答
796 浏览

openssl - 如何修复 evp_cipher_ctx 和 std::pair::第二个不完整的类型错误?

在 picco、 MPC 编译器、目录和克隆 MPC-SoK/frameworks github repo后运行以下 docker 命令时,我收到以下编译错误:

  • 'struct evp_cipher_ctx' 的前向声明
  • 'std::pair<_T1, _T2>::second' 的类型不完整
  • 'EVP_CIPHER_CTX en' 具有初始化程序但类型不完整

我已经看到许多与这些特定错误中的一个或多个相关的 github 和堆栈交换票证和帖子,但没有一个实际上为它们提供了可行的解决方案,例如:

似乎第一个和第三个错误是由于 Openssl 中的更新造成的,但是我尝试在 Mac OSX High Sierra 上运行带有 1.0.1、1.0.2、1.1.0 和 1.1.1 的 openssl 的全新 Ubuntu 16.04 和 18.04 VM使用 openssl 1.0.2,都具有相同的故障点并且都具有相同的三类错误。

我也尝试了这里的解决方案,我手动进入并将 EVP_CIPHER_CTX 变量更改为指针并使用它们相关的释放函数。这也行不通。

我想知道是否有人以前见过并成功修复了这些错误,如果有,他们做了什么,在什么机器上,如果可能的话,使用哪些依赖项?