【问题标题】:AES128 Encryption CBC/NoPadding Objective-CAES128 加密 CBC/NoPadding Objective-C
【发布时间】:2020-03-29 04:11:12
【问题描述】:

我们需要在 Android 和 IOS 中使用 AES128 对请求进行加密,然后在用 Java 编写的后端服务器中发送该加密消息。

我们的安卓加密代码如下:

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

其中 keyspec 和 ivspec 是随机生成的字节。

在 Objective-C 中,这就是我们进行加密的方式。

NSString* iv = @"a12bc1256b4de9a0";
NSData* ivData = [iv dataUsingEncoding:NSUTF8StringEncoding]; 


NSMutableData* cipherData = [NSMutableData dataWithLength:data.length+kCCBlockSizeAES128];

CCCryptorStatus result = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding, keyData.bytes, keyData.length, ivData.bytes, data.bytes, data.length, cipherData.mutableBytes, cipherData
                                     .length, &outLength);

问题在于,当我们比较 Java 程序和 Objective-C 的加密字节时,它们并不相同。我知道 Objective-C 中的 CCOption 参数应该是 CBC 但它不在 CommonCrypto 库的枚举列表中。当我们将其设置为 0 时,加密后的字节只返回一系列零。

请就如何使用 AES/CBC/NOPadding 算法在 Objective-C 中进行 AES 128 加密提出其他替代方案。

【问题讨论】:

    标签: ios objective-c encryption aes block-cipher


    【解决方案1】:

    您已请求填充:kCCOptionPKCS7Padding。这与 Java 的 NoPadding 不同。删除填充选项。 (您可以使用 0 表示“没有选项”。)

    还不清楚您的加密的所有其他部分是否相同。您没有在 Java 代码中包含密钥生成或 IV。

    (请注意,如果您从同一消息的加密算法中获得完全相同的字节,那么您以不安全的方式使用加密算法。安全加密结构将为每次加密生成不同的密文。我了解您的服务器可能正在使用这种不安全的方法;这是一个非常常见的错误。但它是不安全的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2015-08-11
      • 2021-03-05
      • 2011-12-10
      相关资源
      最近更新 更多