gpt4 book ai didi

c++ - 使用 GCM(Galois 计数器模式)进行 AES 加密的 OpenSSL API

转载 作者:行者123 更新时间:2023-11-30 04:56:24 24 4
gpt4 key购买 nike

我在 C++ 中使用 OpenSSL API 来执行私钥的基本加密/解密。我正在尝试不同的加密模式,由于某种原因,在使用 GCM ( Galois Counter Mode) 加密和 AES 时出现错误。其他模式,例如 CBC,工作正常。

相关代码(为清楚起见进行了编辑)是:

void encrypt_private_key(
EVP_PKEY* key_handle,
const char* password,
std::size_t password_length
)
{
std::unique_ptr<BIO, decltype(&BIO_free)> bio_ptr(BIO_new(BIO_s_mem()), &BIO_free);
if (!bio_ptr) { /* handle error */ }

const EVP_CIPHER* enc = EVP_aes_256_gcm();
int result = PEM_write_bio_PKCS8PrivateKey(
bio_ptr.get(),
key_handle,
enc,
const_cast<char*>(password),
password_length,
nullptr,
nullptr
);

if (result != 1) { /* handle error code */ }

// ... do stuff with encrypted key
}

在这里,我得到一个错误代码。当我使用 ERR_reason_error_string() 打印错误代码时,我收到消息 "error setting cipher params"

请注意,如果我将密码从 EVP_aes_256_gcm() 更改为 EVP_aes_256_cbc(),它可以正常工作。

阅读relevant docs ,我看到 GCM 模式可以采用一些额外的参数并使用 EVP_CIPHER_CTX_ctrl 函数进行调整。但是,AFAIK 这似乎是可选的。除了传递给 PEM_write_bio_PKCS8PrivateKey 的内容外,我没有看到为什么 EVP_aes_256_gcm() 在没有设置其他参数的情况下不能正常工作的原因。

那么我在这里做错了什么?

为什么在尝试将 GCM 模式与 AES 加密结合使用时会出现错误?难道是 OpenSSL 根本没有实现这个? (我在这里使用的是旧版本的 OpenSSL - OpenSSL 1.0 - 所以这可能是问题所在。但是,如果它不支持 GCM 模式,我希望得到一个编译时错误,告诉我 EVP_aes_256_gcm() 甚至没有定义,而不是像这样的运行时错误。)

最佳答案

不支持此 GCM 操作模式作为加密私钥的密码。使用 openssl genpkey 工具,版本 1.0.2n,用于生成 PKCS#8 格式的私钥,以下命令显示您遇到的相同错误消息:

$ openssl genpkey -algorithm rsa -aes-128-gcm
..............++++++
.......++++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Error writing key
140736195879880:error:0D0A7072:asn1 encoding routines:PKCS5_pbe2_set_iv:error setting cipher params:p5_pbev2.c:131:
140736195879880:error:2307D00D:PKCS12 routines:PKCS8_encrypt:ASN1 lib:p12_p8e.c:86:

1.1.1 尝试同样的事情看起来更干净一些,但仍然没有成功:

$openssl genpkey -algorithm rsa -aes-128-gcm
genpkey: cipher mode not supported

对于该版本,genpkey 工具在主程序级别的代码明确测试提供的密码 here检查不支持的模式:

        if (EVP_CIPHER_mode(cipher) == EVP_CIPH_GCM_MODE ||
EVP_CIPHER_mode(cipher) == EVP_CIPH_CCM_MODE ||
EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE ||
EVP_CIPHER_mode(cipher) == EVP_CIPH_OCB_MODE) {
BIO_printf(bio_err, "%s: cipher mode not supported\n", prog);

实际上,出于验证目的,此命令适用于 CBC 操作模式:

$ openssl genpkey -algorithm rsa -aes-128-cbc
.................++++++
..........................................................++++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICzzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQI/XYjzz9DQGgCAggA
MB0GCWCGSAFlAwQBAgQQPCvupCCVI57DabGCXHCBbwSCAoCCHMMWy4IHvsdkABw2
<truncated>

你写道:

However, if it didn't support GCM mode I would expect to get a compile time error telling me that EVP_aes_256_gcm() is not even defined, rather than a run-time error like this.

不是一般不支持GCM模式,而是在做PKCS#8时不支持GCM模式对私钥进行加密。在编译时无法知道该限制。

关于c++ - 使用 GCM(Galois 计数器模式)进行 AES 加密的 OpenSSL API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52524418/

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