OpenSSL 中的 ENGINE 是什么,它的用途是什么?

Blu*_*erk 8 c openssl cryptography evp-cipher

我找不到关于ENGINEOpenSSL 是什么的很好的解释。它用于像EVP_PKEY_CTX_new.

我EVP_PKEY_CTX_new在加密/解密某些东西之前使用EVP_PKEY_encrypt,EVP_PKEY_decrypt但是我真的需要ENGINE在调用EVP_PKEY_CTX_new. 我在 OpenSSL 内部查看的每个地方都将参数指定为 null。

所以我的问题是:ENGINEOpenSSL 中的什么是它,它的用途是什么,如果没有指定它有什么区别?

Dan*_*iel 13

引擎是用于执行加密操作的硬件或软件实现。默认引擎 ID 是openssl并使用 OpenSSL 的内置函数。

假设我们有一个具有超快速 AES 实现的硬件设备。现在,当我们使用 AES 加密时,我们可以将引擎设置为该硬件设备(而不是NULL),这意味着操作现在由硬件设备而不是默认的 OpenSSL 软件层计算。


这在Network Security with OpenSSL一书的第 4.6 节中进行了解释。

OpenSSL 内置了对加密加速的支持。使用 ENGINE对象类型,应用程序可以获得对可变的底层表示的引用,通常是硬件设备。(……)

总体思路很简单:我们检索一个代表我们希望使用的硬件类型的对象,然后我们告诉 OpenSSL 使用我们选择的设备。

例 4-17显示了我们将如何执行此操作的一个小代码示例。

ENGINE *e;
if (!(e = ENGINE_by_id("cswift")))
    fprintf(stderr, "Error finding specified ENGINE\n");
else if (!ENGINE_set_default(e, ENGINE_METHOD_ALL))
    fprintf(stderr, "Error using ENGINE\n");
else
    fprintf(stderr, "Engine successfully enabled\n");
Run Code Online (Sandbox Code Playgroud)

函数调用ENGINE_by_id将从可用的内置方法中查找实现并返回一个ENGINE对象。此函数的单个参数应该是我们希望使用的底层实现的字符串标识符。(……)

在ENGINE我们从查找接收对象应在调用中使用,以ENGINE_set_default允许加密功能,利用特定的功能ENGINE。第二个参数允许我们指定允许引擎实现的约束。(……)

注意:cswift“用于 CryptoSwift”加速硬件。