解密 AES-256-CBC 字符串(需要 IV,string/data 格式?)

Decrypt AES-256-CBC String (need IV, string/data format?)

我一直在 Apple 的 CCCrypto 文档、框架和其他 SO 答案中兜圈子,但没有取得任何进展。

认为 我需要弄清楚如何从我收到的加密字符串中获取 IV。

我收到一个包含字符串的 JSON 负载。该字符串在 AES-256-CBC 中加密。 (来自我认为使用 OpenSSL 的 Laravel PHP 实例)。解密后的字符串本身是另一个 JSON 对象。

我有一个预定义的密钥。

我收到的字符串类似于:

eJahdkawWKajashwlkwAkajsne8ehAhdhsiwkdkdhwNIEhHEheLlwhwlLLLLhshnNWhwhabwiIWHWHwh=

(但要长很多)。

我在这里尝试使用这个答案:Issue using CCCrypt (CommonCrypt) in Swift

但是我 a) 不确定我是否正确地将字符串转换为数据,以及 b) 如何从我收到的字符串中获取 IV(初始化向量)。

使用那个答案我确实得到了 "success" 但是当我尝试将它传递给 NSJSONSerailizer 我从来没有得到好的结果(它总是失败)但是我确实得到了数据 -我认为这是垃圾。

编辑:

我真的误解了我原来的问题 - 我收到了一个 base64 编码的字符串,我需要将其解码为 JSON(一切顺利)。然后使用链接的答案并导入 CommonCrypto 我认为我能够获得可用数据,但我没有。 @Rob Napier 的回答非常有帮助。我认为我的问题是 laravel 的实例正在使用 OpenSSL。

AES 加密数据没有真正常用的标准格式(有几种 "standard formats" 但它们不常用....)了解您拥有的数据如何加密的唯一方法是查看数据格式的文档,否则,加密代码本身。

在良好的加密格式中,IV 与数据一起发送。但是在许多常见的(不安全的)格式中,有一个 hard-coded IV(有时是 16 个字节的 0x00)。如果有密码,您还需要了解他们是如何将密码转换为密钥的(有几种方法可以做到这一点,有些好,有些则很糟糕)。在一个好的格式中,密钥派生可能包括一些您需要从数据中提取的随机 "salt"。您还需要知道是否有 HMAC 或类似的身份验证(可能存储在数据的开头或结尾,并且可能包含它自己的盐)。

如果没有发件人的文件,就没有任何好的方法可以知道。任何适当加密的格式看起来都像是随机噪声,因此仅通过查看最终消息就很难弄清楚。

如果这来自 Laravel 的 encrypt 函数,那么最终似乎是 this code:

public function encrypt($value)
{
    $iv = mcrypt_create_iv($this->getIvSize(), $this->getRandomizer());
    $value = base64_encode($this->padAndMcrypt($value, $iv));
    // Once we have the encrypted value we will go ahead base64_encode the input
    // vector and create the MAC for the encrypted value so we can verify its
    // authenticity. Then, we'll JSON encode the data in a "payload" array.
    $mac = $this->hash($iv = base64_encode($iv), $value);
    return base64_encode(json_encode(compact('iv', 'value', 'mac')));
}

如果这是正确的,那么您应该已经通过 base64 编码 JSON 传递了三个字段:IV (iv)、密文 (value) 以及什么看起来像是使用与明文相同的密钥 (mac) 加密的 HMAC。您在上面提供的数据看起来根本不像 JSON(即使在 base-64 解码之后)。

虽然这假设调用者使用了这个 encrypt 函数。但是,有很多很多方法可以加密,所以您需要知道您正在与之通话的实际服务器是如何做到的。