解密 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
函数。但是,有很多很多方法可以加密,所以您需要知道您正在与之通话的实际服务器是如何做到的。
我一直在 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
函数。但是,有很多很多方法可以加密,所以您需要知道您正在与之通话的实际服务器是如何做到的。