2017-08-07 179 views
2

我正在使用OpenSSL EVP_Encrypt API和AES_ctr_128模式。我试图检索更新(增加计数器) 在OpenSSL的1.1.0我们CAN NOT简单地做:OpenSSL EVP_CIPHER_CTX获得更新IV

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结构是隐藏的(不完全得到类型的错误与上面的代码)。

此外,没有任何获取此字段的API。

是否有任何方法可以获得存储在EVP_CIPHER_ctx结构(增量IV)中的更新的IV缓冲区?

回答

0

仅当您为密码编写固定数量的块(对于AES的块大小为16)时,仅IV就足够了。所以你需要跟踪写入的数据量。

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

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

要计算你需要多少字节跳过(即加密/解密前的密钥流再次同步你简单地计算len(pt) % n其中%是余数或模运算符。

+0

谢谢您的回答, 我想知道OpenSSL本身是否提供了任何从ctx获得IV的API /方法(由OpenSSL更新的IV),只有在不存在的情况下,我才会自己实现增量操作 –