我需要解密用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应用上解密它们的东西。
谢谢
答案 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);
答案 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。这个方法并不是秘密,我不知道。
当然,这并没有特别的帮助,但确实显示了问题。