Как преобразовать байты в 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 ответ
Не используйте CryptoSwift, он не является ни быстрым (в 500-1000 раз медленнее, чем Common Crypto), ни безопасным (в нем отсутствует существенная проверка).
Зашифрованные данные неотличимы от случайных байтов данных.
Не все массивы данных могут быть преобразованы в строки в любой кодировке. Существует много байтов данных, которые не имеют печатаемого представления или какого-либо представления в строковой кодировке. Вот почему необработанные байты данных обычно кодируются в Base64 или шестнадцатеричные строки.