我正在开发一个连接到我的服务器的Swift框架。数据在AES-256-CBC中在应用程序和PHP服务器之间加密。我成功地将数据从应用程序发送到服务器并获得响应。但现在我想解密回复而我不能。
要解密服务器响应,我使用向量(由Base64中的服务器发送),源数据和密钥(生成的应用程序端)。当我在向量上执行base64Decode时,base64返回nil。它返回nil,因为我的向量包含一些特殊字符,而字符串不处理特殊字符。问题是,我需要一个字符串和我的矢量来做一个AES Decrypt并取回我的数据。
这是我的Swift 3代码:
let data = Data(base64Encoded: data)!
let decrypted = try! AES(key: key, iv: iv.base64Decoded()!, blockMode: .CBC, padding: PKCS7()).decrypt([UInt8](data))
let decryptedData = Data(decrypted)
在第二行,我收到以下错误:
Fatal error: unexpectedly found nil while unwrapping an Optional value
编辑:
准确地说,这就是发生的事情:
首先,我在服务器端创建了一个PHP随机向量:
openssl_random_pseudo_bytes(openssl_cipher_iv_length("AES-256-CBC"));
...并在base64中对其进行编码,因为它由特殊字符组成。
现在,应用程序端我尝试解码它:
extension String {
func base64Decoded() -> String? {
if let data = Data(base64Encoded: self) {
return String(data: data, encoding: .utf8)
}
return nil
}
}
let myVector = iv.base64Decoded()!
但是失败了,因为解码后的字符串包含非处理字符。 我怎么处理它们?
感谢您的所有想法
答案 0 :(得分:1)
因此,无法将任意数据解释为UTF-8编码的字符串
在大多数情况下String(data: data, encoding: .utf8)
会失败。
但还有另一个AES
初始化程序,它将二进制数据(作为数组)而不是字符串,使得转换为字符串过时了:
let data = Data(base64Encoded: base64data)!
let iv = Data(base64Encoded: base64iv)!
let decrypted = try! AES(Array(data), Array(iv), ...)