Я пытаюсь расшифровать сообщение с ключом 128 со следующим кодом. Это расширение для строки:
func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding),
data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters),
cryptData = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) {
let keyLength = size_t(kCCKeySizeAES128)
let operation: CCOperation = UInt32(kCCDecrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(options)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyData.bytes, keyLength,
nil,
data.bytes, data.length,
cryptData.mutableBytes, cryptData.length,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
let unencryptedMessage = String(data: cryptData, encoding:NSUTF8StringEncoding)
return unencryptedMessage
}
else {
return nil
}
}
return nil
}
Для входного вектора (iv) я использую нулевое значение. Существуют криптоданные, но я не могу их правильно прочитать, и unencryptedMessage также равен нулю. Онлайн-инструменты сообщают, что данные неверны, но на стороне сервера все работает нормально.
Ключ-значение и значение-сообщение — это base64Url.
Применение:
let decryptedMessage = message.aesDecrypt(keyTodecrypt, iv: nil)
Свифт 2.3
keyData = key.dataUsingEncoding(NSUTF8StringEncoding)
. Это декодирует ключ как UTF-8, а не как Base-64. - person Rob Napier   schedule 17.04.2017Data.init(base64Encoded:options:)
. Общепринятого способа преобразования произвольной строки в данные не существует. Вы должны декодировать, используя систему, в которой он закодирован. - person Rob Napier   schedule 18.04.2017