2016-11-21 11 views
4

(Xcodeの8、スウィフト3)CryptoSwiftは - 文字列に変換するUINT8配列はCryptoSwiftライブラリを使用してnilを

として解決し、私がnilとして結果をcipherstring、何らかの理由で、文字列を暗号化し、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 

:文字列のオーバーロード、データオブジェクトへのバイト配列をconvering。これもnilとして返されます。

EDIT(ロブ・ネーピアの答えあたり)/ SOLUTION

// 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()を参照してください。後でStringからDataを再構築するにはData(base64Encoded:)が必要です。

関連する問題