我们需要在安卓和IOS中使用AES128加密请求,然后在用Java编写的后端服务器中发送加密的消息。
我们的Android加密代码如下:
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时,加密的字节只返回一系列的零。
请建议如何在Objective-C中使用AES/CBC/NOPadding算法进行AES 128加密。
发布于 2019-12-05 21:35:29
您已经请求了填充:kCCOptionPKCS7Padding。这和Java的NoPadding不是一回事。删除填充选项。(您可以使用0来表示“没有选项”。)
也不清楚你加密的其他部分是否都是一样的。您没有在Java代码中包含密钥生成或IV。
(请注意,如果您从相同消息的加密算法中获得完全相同的字节,那么您正在以一种不安全的方式使用加密算法。安全加密构造将为每次加密生成不同的密文。我知道您的服务器可能正在使用这种不安全的方法;这是一个非常常见的错误。但它是不安全的。)
https://stackoverflow.com/questions/59174640
复制相似问题