【发布时间】:2016-01-07 06:59:52
【问题描述】:
我有一个使用 Java 加密的字符串
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(text.getBytes());
(注意在Java中,使用AES时PKCS5Padding实际上是PKCS7Paddinglink)
而我的解密内码是:
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
0,
key.bytes,
kCCBlockSizeAES128,
iv.bytes,
[encrypted bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
像这样称呼:
let decryptedData = decryptor.AES128DecryptWithKeyString(key, encryptedString: encodedString) //this does the CCCrypt stuff
let string:NSString = NSString(data: decryptedData, encoding: NSUTF8StringEncoding) ?? ""
let data = NSData(base64EncodedString: string as String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
因此,即使它是使用 PKCS5Padding 加密的,尽管没有提供填充选项,但我的解密工作正常。此外,如果我将0 选项更改为kCCOptionPKCS7Padding,它也可以解密。
这是预期的行为吗?填充选项是否仅与 kCCEncrypt 相关而不与 kCCDecrypt 相关?
另外,如果我们将Java加密改为
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
并用零字节手动填充有效负载,然后无论我使用0作为选项还是kCCOptionPKCS7Padding,它仍然可以正确解密
【问题讨论】:
标签: ios encryption commoncrypto