如果我们知道加密的数据和密钥,是否可以找出初始化向量

时间:2019-05-14 08:34:04

标签: c++ openssl

使用密钥和初始化向量,我已经加密了一些数据:

QString & msgToEncrypt = "some message";
QString & key = "01234567891234560123456789123456";

EVP_CIPHER_CTX * ctx;
unsigned char iv[16];
int len, ciphertext_len;
unsigned char ciphertext[msgToEncrypt.size() + EVP_MAX_BLOCK_LENGTH];
ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, (const unsigned char *) key.toStdString().c_str(), iv);
EVP_EncryptUpdate(ctx, ciphertext, &len, (const unsigned char *) msgToEncrypt.toStdString().c_str(), msgToEncrypt.toStdString().size());
ciphertext_len = len;
EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
ciphertext_len += len;
EVP_CIPHER_CTX_free(ctx);

然后我得到了加密的数据。

我想知道是否有可能使用加密的数据和密钥来找出iv

1 个答案:

答案 0 :(得分:0)

使用分组密码和Ciper分组链接(例如aes_128_cbc),无法确定所得明文是否正确,否。

如果您查看加密,则第一个块XOR是明文和IV,然后对其进行加密。要解密,只需执行相反的操作,即可解密块密文,然后将其与IV进行异或。后面的块使用先前的密文而不是IV(“链接”),因此对于解密,只有第一个块需要IV。

因此,如果您拥有密钥,则可以解密第一个块,但是对XOR使用什么呢?无法确定加密的明文是否正确,IV可能是任何东西。

但是,如果完全不了解纯文本,那么确定IV就会变得相当容易,因为IV的每个位都以可预测的方式直接映射到相应的输出位。例如,说128位AES对以GET /questions/5开头的消息进行加密,那么您只需将解密的块与该明文进行XOR运算即可得到IV。而且由于以下代码块使用的是以前的密文,而不是XOR的IV,因此无论如何都可以直接获取这些密码。

enter image description here