Encryption OpenSSL EVP_CIPHER_CTX获得更新IV

Encryption OpenSSL EVP_CIPHER_CTX获得更新IV,encryption,openssl,cryptography,aes,Encryption,Openssl,Cryptography,Aes,我正在使用OpenSSL EVP_加密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, ...); */

我正在使用OpenSSL EVP_加密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缓冲区?

只有在向密码写入固定数量的块(AES的块大小为16)时,IV才足够。因此,无论如何,您都需要跟踪写入的数据量

因此,要检索计数器值,只需自己计算即可。然后,您可以重新启动特定IV的密码流。请注意,在继续操作之前,您可能仍然需要跳过一定量的纯文本或密文,例如通过加密零值字节

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


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

感谢您的回答,我想知道OpenSSL本身是否提供了从ctx获取IV的API/方法(由OpenSSL更新的IV)。只有当这不存在时,我才会自己实现增量操作