首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS AES256解密

iOS AES256解密
EN

Stack Overflow用户
提问于 2014-06-11 16:59:19
回答 3查看 3.3K关注 0票数 0

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

例如:这是一个加密的字符串:"U2FsdGVkX18egiyzJUY5gHS++2trNSYNSEXpJicKPBE=“,使用这个密钥:”70ca7c5b0b0f58ca290d39613fa3644251“与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应用程序中解密它们的东西。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2014-06-11 19:13:52

为了让你开始:

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或mode可能表明了欧洲央行的模式。欧洲央行模式是不安全的,做,而不是使用它为任何生产代码。

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

票数 4
EN

Stack Overflow用户

发布于 2014-06-11 17:13:24

我将给出一个简单的流程来展示AES是如何工作的:

为了清晰起见,我将使用伪objective来使它既为您所理解,又为我所快。

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2014-06-11 19:15:43

来自google文档:

对于密钥,当您传递一个字符串时,它被视为一个密码,并用于派生一个实际的密钥和IV,或者您可以传递一个表示实际密钥的WordArray。如果您传递实际密钥,则还必须传递实际的IV。

对于CryptoJS.AES.encrypt()

是一个字符串作为键传入,另一个键将被派生,同时也是一个iv。这将是一个兼容性问题,因为必须知道实际密钥派生的方法以及在iOS中复制的iv派生。

上述任何一项都不是标准。

解决方案是在JavaScript中作为正确大小(256位)的WordArray和WordArray iv传入密钥。

或者根据医生:

“为了与其他密码实现兼容,您可以定义自己的格式。格式是一种对象,它有两种方法--字符串和解析--在CipherParams对象和密文字符串之间进行转换。

然后,在iOS中可以匹配相同的加密/解密。

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

前8个字节可能是Javascript解密时使用的"Salted__“来知道要使用的方法。

接下来的8个字节是随机的。它们对于具有相同密钥的相同数据的每次加密都是不同的,它们可以从具有随机组件的密钥中派生出来。

下一个字节由16个字节组成(块大小),足以包含数据+填充。填充总是添加至少一个额外的字节。

因为iv是随机的,所以加密的字节对于每一种加密都是不同的,使用、相同的数据和密钥,但是可以通过使用密钥和引导字节来恢复来重新生成密钥和iv。这个方法不是秘密,只是我不知道。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24168512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档