AES-128-CBC加密与OpenSSL/C++;和PHP/Mcrypt:仅对第一个块进行解密
我编写的程序必须与基于PHP的web服务交换加密数据。我用C++与OpenSSL在Acc-128中用CBC模式加密数据。我将base64编码的数据(IV和密文)发送到HTTP服务器,PHP必须使用Mcrypt对数据进行解密。但是,只有第一个块成功解密,其他块变成垃圾。 我一点也不明白:我们如何才能在CBC模式下解密第一个块?如果IV、密钥或算法设置(如密钥大小/块大小/轮数)错误,则无法接收正确解密的第一个块;如果解密参数正常,那么其他块怎么可能不被解密? 当我解密PHP无法用OpenSSL/C++解密的密文时,解密成功。PHP也是如此:我可以在CBC模式下加密和解密数据。但由于任何原因,OpenSSL EVP_aes_128_cbc和mcrypt'rijndael-128'不兼容。 我的解密代码如下:AES-128-CBC加密与OpenSSL/C++;和PHP/Mcrypt:仅对第一个块进行解密,php,c++,c,encryption,cryptography,Php,C++,C,Encryption,Cryptography,我编写的程序必须与基于PHP的web服务交换加密数据。我用C++与OpenSSL在Acc-128中用CBC模式加密数据。我将base64编码的数据(IV和密文)发送到HTTP服务器,PHP必须使用Mcrypt对数据进行解密。但是,只有第一个块成功解密,其他块变成垃圾。 我一点也不明白:我们如何才能在CBC模式下解密第一个块?如果IV、密钥或算法设置(如密钥大小/块大小/轮数)错误,则无法接收正确解密的第一个块;如果解密参数正常,那么其他块怎么可能不被解密? 当我解密PHP无法用OpenSSL/C
$chipher = mcrypt_module_open('rijndael-128', '', 'cbc', '');
mcrypt_generic_init($chipher, $key, $iv);
$decrypted_data = mdecrypt_generic($chipher, $encrypted_data);
是McLIPT的bug,还是有任何方法用OpenSSL AES-128 CBC加密数据,用PHP McLIPT解密?< /P> < P>,错误在C++端。我加密的数据是分部分来的,所以我不得不多次调用EVP_CipherUpdate;因为在重复调用EVP_CipherUpdate副本以输出缓冲区时,数据太多,并且只输出最后一个块,所以我必须重复调用EVP_CipherInit_ex以清除OpenSSL上下文中的内部缓冲区。当我调用EVP_CipherInit_ex时,它重置了IV,所以在某个点之后解密就不可能了。 解决方案是在每次EVP_CipherUpdate调用后将IV的最后一个版本(context.IV指向最后一个IV,context.oiv指向原始版本)保存在缓冲区中,并将其传递给EVP_CipherInit_ex,以允许OpenSSL按部分加密数据。当我这么做时,mcrypt能够解密整个数据,甚至删除填充。
因此,mcrypt非常优秀,我看到的问题是我的程序错误,而不是mcrypt。有什么原因不能使用为这种用例设计的标准协议吗?我正在考虑一些裂纹保护;在Windows上,使用诸如Fiddler之类的工具添加受信任的根CA并拦截HTTPS流量通常很简单;这就是为什么我决定使用自定义加密而不是SSL,因此atacker将不得不反汇编和修改我的代码来破解系统,而不是像Fiddler这样的标准工具。但一旦主密钥被“破解”,那么整个系统的所有用户都将受到危害。你需要决定你是在寻找安全性还是模糊处理。当你把程序交给可能试图破解它的用户时,模糊处理是唯一的选择;然而,我认为非标准打包+自定义加密比标准HTTPS协议使用更复杂;在我看来,反汇编通常比额外安装CA来绕过HTTPS加密更复杂。当然,任何软件仍然可以破解,但我想让这项工作更复杂。嗯。。。在这个场景中,我能想到的唯一原因是:块0(iv)和块1传输正常,但随后在数据流中插入了一些其他内容,比如块之间的分隔字符。。。您能否确认加密输出的大小是否正确,如iv+x*blocksize的大小你能确认你没有混淆操作模式吗?比如一边是CBC,另一边是PCBC