【发布时间】:2016-06-01 05:21:58
【问题描述】:
我有一个 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 个字节。
我错过了什么?
【问题讨论】:
-
这听起来像是一个长度前缀。
-
请添加用于解密的php示例代码,包括真实输入数据和解密数据的期望值。
-
有两种可能:一种是padding,将数据对齐到16字节(但通常是算法在末尾添加),或者是一个带有内容长度的指标,用来检查大小,尽量将其读取为二进制整数。
-
查看解密后的十六进制数据,看看到底发生了什么。将其添加到问题中。抱歉,很多事情仍然需要十六进制。
-
唯一专业的解决方案是拒绝编写和/或维护不安全的代码。只要坚持安全第一并加以解决。