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

时间:2016-01-15 20:10:46

标签: ios swift laravel encryption aes

我一直在围绕Apple的CCCrypto文档,框架和其他SO答案进行讨论,并且没有取得任何进展。

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

我收到一个包含String的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。

1 个答案:

答案 0 :(得分:2)

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

在良好的加密格式中,IV与数据一起发送。但是在许多常见(不安全)格式中,存在硬编码的IV(有时是16字节的0x00)。如果有密码,你还需要了解他们如何将密码转换为密钥(有几种方法可以做到这一点,有些好,有些可怕)。在良好的格式中,密钥派生可能包括您需要从数据中提取的一些随机“盐”。您还需要知道是否存在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),以及看起来像是使用加密的HMAC与明文相同的密钥(mac)。您上面给出的数据根本不像JSON(即使在base-64解码之后)。

这假设调用者使用了此encrypt函数。但是,有许多方法可以加密,所以你需要知道你正在谈论的实际服务器是如何做到的。