У меня есть строка, зашифрованная с помощью Java
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(text.getBytes());
(Обратите внимание, что в Java PKCS5Padding фактически является PKCS7Padding при использовании AES ссылка)
И мой внутренний код расшифровки:
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