我有一个单线程客户端/服务器应用程序,需要对其网络通信进行加密和解密。我计划使用 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);
问题出在所有这些例子中,我不确定需要做什么every加密/解密,以及我应该在启动时只执行一次的操作。
具体来说:
- 在第 1 行,我要创建这个吗
EVP_CIPHER_CTX
只使用一次并继续重复使用直到应用程序结束?
- 同样在第 1 行,我可以重复使用相同的吗
EVP_CIPHER_CTX
对于加密和解密,还是我应该创建其中两个?
- 在第 2 行,是否应该在我加密的每个数据包上重新设置 IV?或者我只设置 IV 一次,然后让它永远持续下去?
- 如果我正在加密 UDP 数据包,其中数据包很容易丢失或乱序接收,该怎么办:我认为 CBC 不起作用是否正确,或者这是我需要在每个数据包开始时重置 IV 的地方我发出去?
很抱歉恢复旧线程,但我注意到接受的答案中存在以下错误:
在第 1 行,我是否只创建一次 EVP_CIPHER_CTX 并继续重复使用它,直到应用程序结束?
您每次使用时创建一次。也就是说,当您需要加密时,您使用相同的上下文。如果您需要加密第二个流,您将使用第二个上下文。如果您需要解密第三个流,您将使用第三个上下文。
另外,在第 1 行,我可以重复使用相同的 EVP_CIPHER_CTX 进行加密和解密,还是应该创建其中 2 个?
不,请参阅上文。
这是没有必要的。来自 OpenSSL 的手册页:
新代码应使用 EVP_EncryptInit_ex()、EVP_EncryptFinal_ex()、EVP_DecryptInit_ex()、EVP_DecryptFinal_ex()、
EVP_CipherInit_ex() 和 EVP_CipherFinal_ex() 因为它们可以重用现有上下文,而无需在每次调用时分配和释放它。
换句话说,每次使用上下文之前都需要重新初始化它,但是您当然可以一遍又一遍地使用相同的上下文,而无需创建(分配)新的上下文。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)