2016-11-21 8 views
4

(엑스 코드 (8), 스위프트 3)CryptoSwift - 문자열에 UINT8 배열을 변환은 해결 전무

전무와 같은 결과를 cipherstring, 내가 어떤 이유로, 문자열을 암호화하고 coredata에 저장하고자하고있는 CryptoSwift 라이브러리를 사용하여 같은 , 암호문 (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/(롭 네이피어의 대답 당) 솔루션

// 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

코어 데이터에 바이너리 데이터를 저장할 수 있으므로 암호화 텍스트를 * 해당 용도의 문자열로 변환 할 필요가 없습니다. –

+0

감사합니다.이 새로운 기능으로 데이터베이스 버전을 피하려고했습니다. 나는 어쨌든 버전 관리에 익숙해 져야한다고 생각한다. – breakbadjames

답변

5

AES 암호화 된 데이터 바이트의 임의의 무리입니다. 임의의 바이트 묶음을 선택하면 UTF-8이 유효하지 않을 가능성이 높습니다. 데이터가 있고 문자열을 원하면 데이터를 어떻게 든 인코딩해야합니다. 가장 인기있는 방법은 Base-64입니다. 이를 수행하기위한 도구는 Data.base64EncodedString()을 참조하십시오. 또한 나중에 String에서 Data을 재구성하려면 Data(base64Encoded:)이 필요합니다.