【问题标题】:Decrypting AES-128-ECB, first character decrypts to 4 bytes解密 AES-128-ECB,第一个字符解密为 4 个字节
【发布时间】: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字节(但通常是算法在末尾添加),或者是一个带有内容长度的指标,用来检查大小,尽量将其读取为二进制整数。
  • 查看解密后的十六进制数据,看看到底发生了什么。将其添加到问题中。抱歉,很多事情仍然需要十六进制。
  • 唯一专业的解决方案是拒绝编写和/或维护不安全的代码。只要坚持安全第一并加以解决。

标签: php ios aes mcrypt


【解决方案1】:

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

【讨论】:

  • 如果您不了解数据,则无法创建正确的解决方案。我敢打赌,这 20 个字节是 SHA-1 身份验证检查。 ECB模式不安全,请勿使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
相关资源
最近更新 更多