2014-06-11 174 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 。該方法不是祕密,只是我不知道。

當然這並沒有特別的幫助,但確實顯示了問題。