gpt4 book ai didi

aes - 我需要多个 EVP_CIPHER_CTX 结构吗?

转载 作者:行者123 更新时间:2023-12-04 05:06:52 31 4
gpt4 key购买 nike

我有一个单线程客户端/服务器应用程序,需要对其网络通信进行加密和解密。我计划使用 OpenSSL 的 EVP API 和 AES-256-CBC。

我从几个示例中找到了一些示例伪代码:

// key is 256 bits (32 bytes) when using EVP_aes_256_*()
// I think iv is the same size as the block size, 128 bits (16 bytes)...is it?
1: EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
2: EVP_CipherInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv, 1); //0=decrypt, 1=encrypt
3: EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen);
4: EVP_CipherFinal_ex(ctx, outbuf + outlen, &tmplen));
5: outlen += tmplen;
6: EVP_CIPHER_CTX_cleanup(ctx);
7: EVP_CIPHER_CTX_free(ctx);

问题出在所有这些示例中,我不确定在 需要做什么每加密/解密,以及我应该在启动时只做一次。

具体来说:
  • 在第 1 行,我创建这个 EVP_CIPHER_CTX只需一次并继续重复使用它直到应用程序结束?
  • 同样在第 1 行,我可以重复使用相同的 EVP_CIPHER_CTX用于加密和解密,还是我应该创建其中 2 个?
  • 在第 2 行,是否应该在我加密的每个数据包处重新设置 IV?还是我只设置一次 IV,然后让它永远持续下去?
  • 如果我正在加密 UDP 数据包,其中一个数据包很容易丢失或被乱序接收怎么办:我认为 CBC 不会工作是正确的,还是我需要在每个数据包开始时重置 IV我发出去?
  • 最佳答案

    很抱歉恢复旧线程,但我在接受的答案中注意到以下错误:

    At line 1, do I create this EVP_CIPHER_CTX just once and keep re-using it until the application ends?



    您每次使用创建一次。也就是说,当您需要加密时,您使用相同的上下文。如果您需要加密第二个流,您将使用第二个上下文。如果您需要解密第三个流,您将使用第三个上下文。

    Also at line 1, can I re-use the same EVP_CIPHER_CTX for both encryption and decryption, or am I supposed to create 2 of them?



    不,见上文。

    这不是必需的。从 OpenSSL 的手册页:

    New code should use EVP_EncryptInit_ex(), EVP_EncryptFinal_ex(), EVP_DecryptInit_ex(), EVP_DecryptFinal_ex(), EVP_CipherInit_ex() and EVP_CipherFinal_ex() because they can reuse an existing context without allocating and freeing it up on each call.



    换句话说,您需要在每次使用之前重新初始化上下文,但您当然可以一遍又一遍地使用相同的上下文,而无需创建(分配)新的上下文。

    关于aes - 我需要多个 EVP_CIPHER_CTX 结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24365646/

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