【发布时间】:2016-09-07 09:47:44
【问题描述】:
我想通过 AES 算法加密一些数据。 对于 iOS,我使用的是 AESCrypt 库,对于 Android,我使用的是 Cipher Library,但结果不同,尽管它与我们在这里讨论的算法相同。任何帮助将不胜感激
iOS 代码:
NSString *encryptedData = [AESCrypt encrypt:message password:password];
Java 代码
public static String encryptMethod(String seedBase64, byte[] key) {
try {
byte[] seed = Base64.decode(seedBase64, 0);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(1, keySpec);
return Base64.encodeToString(cipher.doFinal(seed), 0);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
【问题讨论】:
-
cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
-
我很确定 java 代码,因为它给了我我需要的结果,我的问题在于 iOS ...
-
你绝对应该使用填充,而不是没有填充
-
切勿使用ECB mode。它是确定性的,因此在语义上不安全。您至少应该使用像CBC 或CTR 这样的随机模式。最好对您的密文进行身份验证,以免像padding oracle attack 这样的攻击是不可能的。这可以通过 GCM 或 EAX 等经过身份验证的模式或encrypt-then-MAC 方案来完成。
-
CommonCrypto 通过各种标志支持 ECB 和 NoPadding。您不需要一些第三方库,但当然您根本不应该使用该代码。相反,您应该使用为您执行此操作的库。请注意,好的库使用随机加密。所以,如果你想检查兼容性,你需要一边加密一边解密。
标签: android ios encryption aes