【问题标题】:Decrypt AES-256-CBC String (need IV, string/data format?)解密 AES-256-CBC 字符串(需要 IV,字符串/数据格式?)
【发布时间】:2016-01-15 20:10:45
【问题描述】:

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

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

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

我有一个预定义的密钥。

我收到的字符串类似于:

eJahdkawWKajashwlkwAkajsne8ehAhdhsiwkdkdhwNIEhHEheLlwhwlLLLLhshnNWhwhabwiIWHWHwh=

(但要长得多)。

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

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

使用该答案我确实得到了“成功”,但是当我尝试将其传递给 NSJSONSerailizer 时,我从来没有得到好的结果(它总是失败),但我确实得到了数据 - 我认为这是垃圾。

编辑:

我真的误解了我最初的问题 - 我收到了一个 base64 编码的字符串,我需要将它解码为 JSON(这很好)。然后使用链接的答案并导入 CommonCrypto 我以为我可以获得可用的数据,但我不是。 @Rob Napier 的回答非常有帮助。我认为我的问题是有问题的 laravel 实例正在使用 OpenSSL。

【问题讨论】:

    标签: ios swift laravel encryption aes


    【解决方案1】:

    对于 AES 加密数据,没有真正常用的标准格式(有几种“标准格式”,但它们并不常用....)了解您拥有的数据是如何加密的唯一方法是查看在数据格式的文档中,或者在加密代码本身中失败。

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

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

    如果这是来自 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)、密文 (@​​987654325@),以及看起来像使用相同密钥加密的 HMAC明文 (mac)。您在上面给出的数据看起来根本不像 JSON(即使在 base-64 解码之后)。

    这假设调用者使用了这个encrypt 函数。不过,加密方法有很多种,因此您需要知道与您交谈的实际服务器是如何进行加密的。

    【讨论】:

    • 感谢您的周到回复。我明白你在说什么,但你能举个例子说明如何从字符串的 16 个字节中获取 IV 吗?
    • IV 是哪 16 个字节?这没有标准。它可能在几个地方,也可能根本不在字符串中。问题是“加密器将 IV 放在哪里,或者它是硬编码的?”只有你有文档和代码来回答这个问题。
    • 我严重误解了我的问题并遇到了您的框架。我试图让每个人都转向它。正在使用的 Laravel 有时会调用 openSSL,通过阅读您的文章和其他帖子,我发现这些天可能无法在 iOS 上运行。
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多