iOS AES256解密

时间:2014-06-11 16:59:19

标签: ios encryption cryptography

我需要解密用AES256加密的字符串。

例如: 这是一个加密的字符串: “U2FsdGVkX18egiyzJUY5gHS ++ 2trNSYNSEXpJicKPBE =” 使用此键: “70ca7c5b0f58ca290d39613fa3644251” 使用AES256算法

示例字符串已使用以下方式加密:

https://code.google.com/p/crypto-js/

有多种工具可用于解密AES256加密字符串: https://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto

https://github.com/RNCryptor/RNCryptor

https://github.com/Gurpartap/AESCrypt-ObjC

我已经尝试了所有这些但是没有一个能够解密我的字符串。 我确定它已正确加密,因为我可以使用这个在线工具解密它:

http://www.appcove.com/tool/aes

请帮帮我。

谢谢你, 乔治

-------------- 编辑 --------------

您能为API(js)/ iOS推荐对称加密/解密算法吗? 您用来加密API上的字符串并在iOS应用上解密它们的东西。

谢谢

3 个答案:

答案 0 :(得分:4)

为了帮助您入门:

This is an encrypted string: "U2FsdGVkX18egiyzJUY5gHS++2trNSYNSEXpJicKPBE="

这不是加密字符串。它是加密字节数组的Base64渲染。为了解密它,首先需要将它从Base64转换回字节数组。

using this key: "70ca7c5b0f58ca290d39613fa3644251"

这不是关键。它是字节数组的十六进制字符串表示形式,它可以是实际键,也可以用于派生实际键。您需要将它从十六进制字符串转换回字节数组。

with the AES256 algorithm

您需要更多信息:模式和填充至少。

正在使用什么模式? AES-ECB,AES-CBC,AES-CTR或其他一些模式?仔细阅读说明,试着找出答案。正如Zaph的评论所说,缺乏IV或Nonce可能表明ECB模式。 ECB模式不安全,将其用于任何生产代码。

您还需要知道使用了什么填充。 Zaph说PKCS7填充,这很常见,但问题来源应该告诉你。您需要设置解密方法以期望正确的填充。

答案 1 :(得分:2)

我将为您提供一个简单的流程来展示AES的工作原理:

为了清楚起见,我将使用 pseudo-objective-c 让它对你来说既可以理解又对我来说很快。

// Here comes encryption process:
NSString *key           = @"fsd7f897sfd8sfds…";
NSString *secretMessage = @"Confidential text";

AES *aes = [AES sharedAES];
NSString *encryptedMessage = [aes encryptWithKey:key message:secretMessage];

// Now is time for decryption:
Base64   *base64           = [Base64 sharedBase64];
NSString *messageToDecrypt = [base64 decode:encryptedMessage];
NSString *decryptedMesage  = [aes decryptWithKey:key message:messageToDecrypt];

// Now you should have the result:
NSLog(decryptedMesage);

查看http://travistidwell.com/jsencrypt/

答案 2 :(得分:0)

来自google docs:

  

对于密钥,当您传递字符串时,它被视为密码短语和   用于导出实际密钥和IV。或者你可以通过WordArray   代表实际的关键。如果您传递实际密钥,则还必须   通过实际的IV。

CryptoJS.AES.encrypt()

字符串是否传入,因为键将导出另一个键,也是iv。这将是兼容性问题,因为必须知道实际密钥派生的方法以及iv推导和iOS中的重复。

以上都不是标准。

解决方案是使用JavaScript将密钥作为正确大小的WordArray(256位)和WordArray iv传递。

或按照文档:

  

“您可以定义自己的格式,以便与其他格式兼容   加密实现。格式是具有两个的对象   methods-stringify和parse-在CipherParams对象之间进行转换   和密文字符串。

然后使用这些加密/解密可以在iOS中匹配。

以下是我发现的一些信息,这是在base64编码之前WRT加密数据:

前8个字节是“Salted__”可能被Javascript解密用来知道要使用的方法。
接下来的8个字节是随机的。对于具有相同密钥的相同数据的每次加密,它们是不同的。它们可以从具有随机分量的密钥导出 下一个字节是16个字节的组(blocksize),足以包含数据+填充。填充总是至少增加一个额外字节。

因为iv是随机的,加密字节将不同用于相同数据和密钥的每次加密,但可以通过以某种方式恢复使用密钥和前导字节重新生成密钥和iv。这个方法并不是秘密,我不知道。

当然,这并没有特别的帮助,但确实显示了问题。