2016-11-21 54 views
4

(Xcode中8,夫特3)CryptoSwift - 转换UINT8数组字符串解析为零

使用CryptoSwift库,我想加密的字符串,并将其存储在coredata,出于某种原因,cipherstring结果零尽管具有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 

我也使用数据的尝试:串的过载,convering将字节数组的数据对象。这也结果为零。

EDIT /溶液(每罗布纳皮尔回答)

// 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) 
+0

您可以将二进制数据存储在核心数据中,您不必将密文转换为* that *目的的字符串。 –

+0

谢谢,我试图用这个新功能来避免数据库版本。我想我应该习惯于版本控制。 – breakbadjames

回答

5

AES加密数据是字节的随机串。如果你选择了一堆随机的字节,那么它就不太可能是有效的UTF-8。如果你有数据并且你想要一个字符串,你需要以某种方式编码数据。最流行的方式是Base-64。请参阅Data.base64EncodedString()以获取相关工具。您还需要Data(base64Encoded:)以后从String重建您的Data