encryption - OpenSSL EVP_CIPHER_CTX 获取更新 IV

标签 encryption openssl cryptography aes

我正在使用 OpenSSL EVP_Encrypt API,采用 AES_ctr_128 模式。我正在尝试检索更新的(增量计数器) 在 OpenSSL 1.1.0 中,我们不能简单地执行以下操作:

    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    /*
    EVP_EncryptInit(ctx, ...);
    EVP_EncryptUpdate(ctx, ...);
    EVP_EncryptFinal(ctx, ...);
    */
    memcpy(iv, ctx->iv, sizeof(ctx->iv);

因为 ctx 结构被隐藏(上面的代码出现不完整类型错误)。

此外,该字段没有任何 get API。

有什么方法可以获取存储在 EVP_CIPHER_ctx 结构中的更新后的 IV 缓冲区(增量 IV)吗?

最佳答案

仅当您将固定数量的 block (AES 的 block 大小为 16)写入密码时,单独的 IV 就足够了。因此,无论如何您都需要跟踪写入的数据量。

要检索计数器值,如果您自己计算的话会更容易。然后您可以重新启动特定 IV 的密码流。请注意,您可能仍然需要跳过一定量的明文或密文,例如通过加密零值字节,然后才能继续操作。

因此,要计算计数器值,只需将 IV 与已处理的完整 block 数相加即可:len(pt)/n 其中 len 是以字节为单位的长度和使用整数除法的n = 16。 IV 由随机数和作为固定大小的大端数的初始计数器值组成。因此,您只需将 IV 的每个字节与整数的每个字节相加,从右向左获取可能的进位(最低有效字节的高索引,最高有效字节的低索引)。

要计算需要跳过多少字节(即在 key 流再次同步之前加密/解密,您只需计算 len(pt) % n 其中 % 为余数或模运算符。

关于encryption - OpenSSL EVP_CIPHER_CTX 获取更新 IV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45548110/

相关文章:

c++ - 使用 OpenSSL 构建 QT 期间出错

c# - 我的三重 DES 包装程序有什么问题?

java - 非对称算法使用的问题

javascript - Node JS,如何从P12文件中提取X.509证书?

python - python中的pycrypto和crypto包有什么区别?

encryption - 使用 AES256 编译 System.Data.Sqlite

c - RSA_eay_private_decrypt什么时候调用rsa_mod_exp函数?

javascript - Express 和 SSL 使用

python - 模块未找到错误 : No module named 'cryptography'

php - 为什么我的 PHP Blowfish 加密会产生如此奇怪的结果?