CryptoSwift - преобразование массива UInt8 в строку разрешается как ноль

(Xcode 8, Swift 3)

Используя библиотеку CryptoSwift, я хочу зашифровать строку и сохранить ее в coredata, по какой-то причине результаты зашифрованной строки равны нулю, несмотря на то, что зашифрованный текст имеет 128 значений:

let aes = try AES(key: pw, iv: nil, blockMode: .CBC, padding: PKCS7())
let ciphertext = try aes.encrypt(token.utf8.map({$0}))
let cipherstring = String(bytes:ciphertext, encoding: String.Encoding.utf8) // always nil

Я также попытался использовать данные: перегрузка строки, преобразование байтового массива в объект данных. Это также приводит к нулю.

РЕДАКТИРОВАТЬ / РЕШЕНИЕ (согласно ответу Роба Нейпира)

// encode/convert to string
let aes = try AES(key: pw, iv: nil, blockMode: .CBC, padding: PKCS7())
let ciphertext = try aes.encrypt(token.utf8.map({$0}))
let cipherstring = Data(bytes: ciphertext).base64EncodedString()
// decode
let aes = try AES(key: pw, iv: nil, blockMode: .CBC, padding: PKCS7())
let cipherdata = Data(base64Encoded: cipherstring)
let ciphertext = try aes.decrypt(cipherdata!.bytes)
let token = String(bytes:ciphertext, encoding:String.Encoding.utf8)

1 ответ

Решение

Зашифрованные данные AES - это случайная группа байтов. Если вы выберете случайную группу байтов, вряд ли будет действительным UTF-8. Если у вас есть данные и вы хотите строку, вам нужно как-то кодировать данные. Самый популярный способ сделать это - Base-64. Увидеть Data.base64EncodedString() для инструмента, чтобы сделать это. Вам также понадобится Data(base64Encoded:) реконструировать свой Data от String потом.

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