我一直在围绕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。
答案 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
函数。但是,有许多方法可以加密,所以你需要知道你正在谈论的实际服务器是如何做到的。