📒博客首页:何与非的博客 🎉欢迎关注🔎点赞👍收藏??留言📝 ?? 期待一起交流! 🙏作者水平很有限,如果发现错误,求告知,多谢! 🌺有问题可私信交流!!!
🥦OpenSSL提供程序
OpenSSL附带了一组提供程序。
这些提供程序中每个提供程序中可用的算法可能因生成时配置选项而异。openssl-list命令可用于列出当前可用的算法。
openssl-list中显示的算法名称可以用作相应获取函数的算法标识符。另请参阅下面链接的特定于提供程序的手册页,了解有关使用每个提供程序中可用算法的更多详细信息。
除了OpenSSL提供程序之外,第三方也可以实现提供程序。
🥬默认提供程序
默认提供程序作为libcrypto库的一部分内置,包含所有最常用的算法实现。如果需要(如果加载了其他提供程序并提供相同算法的实现),则可以将属性查询字符串"provider=default"用作这些实现的搜索条件。默认提供程序包括以下基本提供程序中的所有功能。
如果您根本没有加载任何提供程序,则将自动加载"默认"提供程序。如果显式加载任何提供程序,则"默认"提供程序也需要显式加载(如果需要)。
🥒基本提供程序
基本提供程序作为libcrypto库的一部分内置,包含用于对 OpenSSL 密钥进行编码和解码的算法实现。如果需要(如果加载了其他提供程序并提供相同算法的实现),则可以将属性查询字符串"provider=base"用作这些实现的搜索条件。某些编码和解码算法实现本身不是 FIPS 算法实现,而是支持来自 FIPS 提供程序的算法,并允许在"FIPS 模式"下使用。属性查询字符串"fips=yes"可用于选择此类算法。
🌶?FIPS 提供程序
FIPS 提供程序是一个可动态加载的模块,因此必须在代码中或通过 OpenSSL 配置显式加载。它包含已根据 FIPS 140-2标准验证的算法实现。如果需要(如果加载了其他提供程序并提供相同算法的实现),则可以将属性查询字符串"provider=fips"用作这些实现的搜索条件。也可以使用属性"fips=yes"选择 FIPS 提供程序中所有已批准的算法实现。FIPS 提供程序还可能包含未经批准的算法实现,可以使用属性"fips=no"选择这些实现。
🌽旧版提供程序
旧版提供程序是一个可动态加载的模块,因此必须在代码中或通过 OpenSSL 配置显式加载。它包含被认为不安全或不再常用的算法实现,例如MD2或RC4。如果需要(如果加载了其他提供程序并提供相同算法的实现),则可以将属性"provider=legacy"用作这些实现的搜索条件。
🥕空提供程序
空提供程序是作为libcrypto库的一部分内置的。它根本不包含任何算法。提取算法时,如果没有显式加载其他提供程序,则将自动加载默认提供程序。若要防止这种情况发生,可以显式加载 null 提供程序。
🧄在应用程序中使用算法
通过使用"EVP"API,加密算法可供应用程序使用。每个不同的操作(如加密、摘要、消息身份验证代码等)都有一组 EVP 函数调用,可以调用这些调用来使用它们。
其中大多数遵循一个共同的模式。首先创建一个"上下文"对象。例如,对于摘要操作,您将使用EVP_MD_CTX,对于加密/解密操作,您将使用EVP_CIPHER_CTX。然后初始化操作,以便通过"init"函数使用 - 可以选择传入一组参数(使用OSSL_PARAM类型)以配置操作的行为方式。接下来的数据通过一系列"update"调用馈送到操作中。该操作使用"final"调用完成,该调用通常会提供某种输出。最后,清理并释放上下文。
下面显示了使用 SHA256 执行此过程以消化数据的完整示例。该过程与其他操作类似,例如加密/解密,签名,消息身份验证代码等。
#include <stdio.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
int main(void)
{
EVP_MD_CTX *ctx = NULL;
EVP_MD *sha256 = NULL;
const unsigned char msg[] = {
0x00, 0x01, 0x02, 0x03
};
unsigned int len = 0;
unsigned char *outdigest = NULL;
ctx = EVP_MD_CTX_new();
if (ctx == NULL)
goto err;
sha256 = EVP_MD_fetch(NULL, "SHA256", NULL);
if (sha256 == NULL)
goto err;
if (!EVP_DigestInit_ex(ctx, sha256, NULL))
goto err;
if (!EVP_DigestUpdate(ctx, msg, sizeof(msg)))
goto err;
outdigest = OPENSSL_malloc(EVP_MD_get_size(sha256));
if (outdigest == NULL)
goto err;
if (!EVP_DigestFinal_ex(ctx, outdigest, &len))
goto err;
BIO_dump_fp(stdout, outdigest, len);
err:
OPENSSL_free(outdigest);
EVP_MD_free(sha256);
EVP_MD_CTX_free(ctx);
}
|