【问题标题】:AES Encryption (AES/ECB/NoPadding)AES 加密(AES/ECB/NoPadding)
【发布时间】: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


【解决方案1】:

有时不同平台上的填充存在问题,因此结果会有所不同,我建议使用像这样的一些跨平台库。 https://github.com/Pakhee/Cross-platform-AES-encryption

【讨论】:

  • 我使用了这个库,甚至使用了 RNEncryptor,但结果仍然与我的 android 代码不同。这正常吗?
  • 您推荐的库支持多种语言/平台,但它缺少一件重要的事情:通过消息身份验证代码进行完整性检查。 RNCryptor 在这方面要好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2016-06-25
  • 1970-01-01
  • 2021-09-24
  • 2019-04-18
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多