AES128 Encryption CBC/NoPadding Objective-C



我们需要在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加密提出其他替代方案。

您已请求填充:kCCOptionPKCS7Padding.这与Java的NoPadding不是一回事。删除填充选项。(您可以使用 0 表示"没有选项"。

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

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

相关内容

  • 没有找到相关文章

最新更新