2014-06-11 96 views
-1

我需要解密用AES256加密的字符串。iOS 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应用上解密它们的东西。

谢谢

+1

首先请注意,加密后的加密字符串是Base64编码的。必须匹配的参数是键,iv(如果是CBC模式)填充。加密是一种二进制字节操作,任何Base64或其他编码都不是加密的一部分。没有指定是模式和可能的iv和填充,如果有的话。解密的字符串是“老师”吗? – zaph

+0

如果模式是ECB并且有PKCS7填充,我如何解密iOS中的字符串? – George

回答

2

我给你一个简单的流程,以显示AES是如何工作的:

为了清楚起见,我将使用伪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/

+0

我没有秘密密钥和私钥。你用什么“decryptWithPrivateKey”和“encryptWithPublicKey”? – George

+0

@Zaph误认为是RSA,修正了。乔治你应该有密钥来加密和解密你的消息。 – squixy

+0

下面是我使用JSEncrypt的明确密钥:https://gist.github.com/KamilLelonek/9108495。也许这个图书馆会更好考虑? – squixy

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填充,这是很常见的,但问题来源应该告诉你。您需要设置解密方法以期望正确的填充。

0

从谷歌文档:

为重点,当你传递一个字符串,它会被视为用于导出实际密钥和IV口令和 。或者您可以传递一个表示实际密钥的字数组。如果你通过了实际的钥匙,你还必须通过实际的IV通过 。

对于CryptoJS.AES.encrypt()

是传入作为密钥另一密钥将被导出,并且还静脉的字符串。这将是一个兼容性问题,因为实际密钥派生的方法必须知道,以及iv派生,并在iOS中复制。

以上都不是标准。

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

或每个文档:。

“你可以定义你自己的格式,以便与其他 加密实现兼容的格式是一个物体的两个 方法,字符串化和分析,这之间的转换CipherParams对象 和密文串。

然后与这些相同的加密/解密可以在IOS匹配。

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

前8个字节是“Salted__”可能由Javascript解密用于了解使用方法。
接下来的8个字节是随机的。对于具有相同密钥的相同数据的每次加密,它们是不同的。它们可以从具有随机组件的密钥派生。
下一个字节是16个字节(块大小)的组,只是足以包含数据+填充。填充总是添加至少一个额外的字节。

由于IV是随机的加密的字节将是用于与相同的数据和密钥但可以通过某种方式使用所述密钥和前导字节被恢复每个加密不同重新生成密钥和iv 。该方法不是秘密,只是我不知道。

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