расшифровка сообщений aes 128 Swift, iOS

Я пытаюсь расшифровать сообщение с ключом 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


person Anton Kashpor    schedule 17.04.2017    source источник
comment
Стандартных настроек или формата для шифрования AES не существует. Если вы не можете точно описать, как шифратор создает сообщение, вы не сможете его расшифровать. У вас есть код шифрования?   -  person Rob Napier    schedule 17.04.2017
comment
Вы заметили, что ключ закодирован в Base64 (по крайней мере, я предполагаю, что это означает base64Url). Но вы расшифровываете его как utf-8. Это, вероятно, ваша основная проблема, хотя, безусловно, может быть больше.   -  person Rob Napier    schedule 17.04.2017
comment
@zaph Я имею в виду, что входное значение правильное, и Backend может расшифровать его с помощью java-библиотек. И это режим ECB, а не CBC.   -  person Anton Kashpor    schedule 17.04.2017
comment
@RobNapier Да, вы правы, я хочу получить utf-8. Зашифрованное сообщение имеет формат json.   -  person Anton Kashpor    schedule 17.04.2017
comment
@AntonKashpor Я говорю о ключе. Вы расшифровываете это так: keyData = key.dataUsingEncoding(NSUTF8StringEncoding). Это декодирует ключ как UTF-8, а не как Base-64.   -  person Rob Napier    schedule 17.04.2017
comment
@RobNapier, конечно, мне нужно преобразовать в NSData. Это самый распространенный способ добиться этого. Разве это не так?   -  person Anton Kashpor    schedule 18.04.2017
comment
Только если данные закодированы в utf-8. Если вы декодируете Base64, вам нужен Data.init(base64Encoded:options:). Общепринятого способа преобразования произвольной строки в данные не существует. Вы должны декодировать, используя систему, в которой он закодирован.   -  person Rob Napier    schedule 18.04.2017


Ответы (1)


Как сказал Роб, основной проблемой были входные данные. Итак, я преобразовал сообщение и ключ в шестнадцатеричное значение. Если у вас такая же проблема, убедитесь, что ваше значение на стороне клиента и на стороне сервера имеет один и тот же параметр кодирования. Для меня это было UTF-8. Кроме того, вы должны проверить длину ключа.

person Anton Kashpor    schedule 19.04.2017