Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.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
Php 解密AES-128-ECB,第一个字符解密为4字节_Php_Ios_Aes_Mcrypt - Fatal编程技术网

Php 解密AES-128-ECB,第一个字符解密为4字节

Php 解密AES-128-ECB,第一个字符解密为4字节,php,ios,aes,mcrypt,Php,Ios,Aes,Mcrypt,我有一个iOS应用程序,它使用[NSData AES128EncryptWithKey:]加密字符串并通过HTTP发送。我们没有编写这个应用程序,为什么它不只是使用HTTPS,而是使用带有AES-128位加密的HTTP?我不知道。我知道这并不理想,但我正在处理客户给我的东西,目前我还没有能力/权威来解决这个问题 我负责编写一个服务器应用程序,以获取作为原始二进制HTTP POST发送的数据,并解密POST正文,然后处理发送的数据。我使用PHP,因为它是我可以用最快速度编写服务器端的语言。我正在修

我有一个iOS应用程序,它使用[NSData AES128EncryptWithKey:]加密字符串并通过HTTP发送。我们没有编写这个应用程序,为什么它不只是使用HTTPS,而是使用带有AES-128位加密的HTTP?我不知道。我知道这并不理想,但我正在处理客户给我的东西,目前我还没有能力/权威来解决这个问题

我负责编写一个服务器应用程序,以获取作为原始二进制HTTP POST发送的数据,并解密POST正文,然后处理发送的数据。我使用PHP,因为它是我可以用最快速度编写服务器端的语言。我正在修改一个类似的服务器应用程序,它已经完成了我们需要它完成的工作。上次使用的数据未加密,通过HTTPS发送

当我使用mcrypt_decrypt mcrypt_RIJNDAEL_128或openssl_decrypt AES-128-ECB对字符串进行解密时,使用开发人员提供的16字节密钥,字符串的第一个字符被扩展为4字节,全部错误,而字符串的其余部分解密得很好。字符串以username=WHATEVER开头,后面有大约700字节的其他数据。总长度是16的倍数,尽我所能,它在服务器端正确填充。整个字符串都是正确的,但解密后得到的结果是:

o@{asername=WHATEVER...
我所做的每一次搜索都告诉我,当使用错误IV的AES-CBC时,有一个坏的16字节,但它使用ECB正确解密-只有第一个字节是错误的,并扩展到4个字节


我遗漏了什么?

基于对长度前缀的评论,我检查了已知字符串长度与解密字符串长度的对比,结果相差20个左右的字符。似乎前面填充了一些二进制数据,当打印到终端屏幕上时,会产生空字符,并以某种方式删除了用户名中缺少的“u”字符?当我执行substr$data时,字符串打印正确。前20个字节,不确定到底是什么,但我找到了我需要的数据。谢谢。

听起来像是长度前缀。请添加用于解密的php示例代码,包括实际输入数据和解密数据的预期值。有两种可能:填充以将数据对齐到16字节,但通常由算法添加到末尾,或者是带有内容长度的指示器以检查大小,试着把它读成二进制整数。把解密后的数据看成十六进制,看看到底发生了什么。把这一点加到问题上。抱歉,hex在很多方面仍然是需要的。唯一的专业解决方案是拒绝编写和/或维护不安全的代码。只要坚持安全第一并解决它。如果你不理解数据,你就无法创建正确的解决方案。我打赌这20个字节是SHA-1身份验证检查。ECB模式不安全,不要使用它。