Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AES-128-CBC加密与OpenSSL/C++;和PHP/Mcrypt:仅对第一个块进行解密_Php_C++_C_Encryption_Cryptography - Fatal编程技术网

AES-128-CBC加密与OpenSSL/C++;和PHP/Mcrypt:仅对第一个块进行解密

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

我编写的程序必须与基于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'不兼容。 我的解密代码如下:

$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