Как преобразовать байты в NSString после шифрования AES CryptoSwift

Я использую CryptoSwift для шифрования данных, которые я передам в URL. Для этого мне нужно, чтобы тип данных части данных был строкой для конкатенации в запрос NSURL. После шифрования данные выводятся в байтах. Как я могу привести байты к бессмысленной строке, чтобы передать URL, который может расшифровать PHP-скрипт?

Я могу зашифровать в UInt8, однако я не думаю, что его можно передать по URL-адресу PHP-скрипта, поэтому мне нужно сделать его строкой.

Код:

let string = "hello"
let input: [UInt8] = Array(string.utf8)
let key: [UInt8] = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
let iv: [UInt8] = AES.randomIV(AES.blockSize)
do {
    let encrypted: [UInt8] = try AES(key: key, iv: iv, blockMode: .CBC).encrypt(input, padding: PKCS7())
    print("Encrypted bytes: \(encrypted)")
    let str = String(bytes: encrypted, encoding: NSUTF8StringEncoding)
    print("String of encrypted data: \(str)") // prints a nil value
} catch AES.Error.BlockSizeExceeded {
    print("Block size exceeded")
} catch {
    print("Error encrypting or decrypting data")
}

Огромное спасибо за помощь,

1 ответ

Решение
  1. Не используйте CryptoSwift, он не является ни быстрым (в 500-1000 раз медленнее, чем Common Crypto), ни безопасным (в нем отсутствует существенная проверка).

  2. Зашифрованные данные неотличимы от случайных байтов данных.

  3. Не все массивы данных могут быть преобразованы в строки в любой кодировке. Существует много байтов данных, которые не имеют печатаемого представления или какого-либо представления в строковой кодировке. Вот почему необработанные байты данных обычно кодируются в Base64 или шестнадцатеричные строки.

Другие вопросы по тегам