2014-03-05 30 views
4

我有一個AES加密/解密的Android示例。在iOS上解密android AES示例

https://github.com/itog/CryptoSample/blob/master/src/com/pigmal/android/ex/crypto/Crypto.java#L35

我想解密此iOS上。它看起來幾乎不可能。我發現這使其更容易,但失敗:

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

我甚至沒有得到良好的反應,從以base64解碼回來。這是我的代碼:

NSData *encryptedData = [NSData base64DataFromString:encrypted]; 
// returns null 
NSData *decryptedData = [encryptedData decryptedAES128DataUsingKey:[[CRYPT_SEED dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] error:&error]; 
NSString* result = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; 
+1

必須使用兩個iOS版相同的加密模式和填充和Android的Android version才能正常工作了。 – faiziii

+0

您將需要了解一些有關加密的知識,確定Android代碼使用的選項和輸入,並將它們複製到iOS代碼中。 CommonCrypto是你的朋友,認識他。使用加密而不理解它可能會產生一個保險結果。 – zaph

+0

的確如此。但目標不是要完全保護數據,而是要推遲潛在的黑客。我只想爲臨時項目提供加密的訂閱源。 –

回答

2

首先,AES是對稱密碼算法,它需要使用完全相同的密鑰進行消息加密和消息解密。

我已對你的例子代碼,這些都是真正困擾我的事情:

  • 不同的密鑰:安卓例如不提供應當用於AES密鑰的任何getter或setter。沒有這些,你無法在Android和iOS上使用相同的AES密鑰。
  • 不同的密鑰大小:Android的例子似乎使用AES-128,但iOS的例子似乎使用AES-256
  • 不同的密碼模式:iOS的示例使用CBC cipher mode所以你需要之間還交換IV (initialization vector)您的設備。但是,我沒有看到任何接口提供/獲取IV在Android的例子。

我相信這些是你無法正常工作的主要原因。如果你想使用AES,那麼你將需要修改代碼以兩臺設備上使用相同的密鑰使用相同cipher mode在兩個設備上,並在兩臺設備上使用相同padding

0

那麼這可能是因爲公鑰是不同的。

有兩件事存儲加密。第一個是用戶名/密碼,第二個是消息本身。當您正確輸入密碼時,將使用您的密碼和公鑰解密該消息。

我們稱之爲公鑰的原因是,對於相同的加密方法,密鑰是相同的。

因此,我認爲,也許你應該尋找一個程序,將公鑰設置爲你選擇的字符串。

或者您可以使用更簡單的方法,例如fairplay。

2

提示:

  • 你可以使用一個第三方庫來做到這一點。根據庫,它可能是跨平臺的,因此在不同平臺上的相同調用將返回相同的結果。

安全黑盒子: https://www.eldos.com/sbb/platforms.php#product

加密+ http://www.cryptopp.com

  • 你可以編譯測試AES程序,以確保這兩個AES加密和Android上的解密程序和iOS給出了相同的結果。

  • 您可以檢查Base64是否正確編碼和解碼。有時可能是Unicode(UTF16)iOS和非Unicode(UTF8)Android問題。我在做這件事時發生在我身上。

+0

得到它與您的Base64評論一起工作。謝謝! –

+0

請upvote&打勾我的答案作爲正確答案:) – buttercup

0

其他答案已經注意到的是真的,它可以縮小到不同的是鍵大小/模式/填充。 BASE64編碼類型也可能存在問題。在Android上,有幾個不同的標誌可以產生細微差別的輸出。我發現Base64.NO_WRAP工作。

我也有類似的問題AESCrypt-ObjC默認情況下它使用空白IV和Android /爪哇似乎如果你沒有指定一個隨機生成一個。

以下是我指定了一個空IV使iOS版可以解密:

private static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 

final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 

cipherText = cipher.doFinal(stuffIWantSafe.getBytes("UTF-8")); 

String encodedCipherText = Base64.encodeToString(cipherText, Base64.NO_WRAP); 

免責聲明:我不建議從安全的角度來看空白IV最好是有與每個變化的IV消息

*更新:剛剛發佈的AESCrypt