我正在开发一个连接到我的服务器的 Swift 框架。数据在应用程序和 PHP 服务器之间以 AES-256-CBC 加密。我成功地将数据从应用程序发送到服务器并获得响应。但现在我想解密响应,但我做不到。
为了解密服务器响应,我使用了一个向量(由服务器以 Base64 格式发送)、源数据和一个 key (在应用程序端生成)。当我对向量执行 base64Decode 时,base64 返回 nil。它返回 nil,因为我的向量包含一些特殊字符,而字符串不处理特殊字符。问题是,我需要一个字符串和我的向量来执行 AES 解密并取回我的数据。
这是我的 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 :在展开可选值时意外发现 nil
编辑:
准确地说,是这样的:
首先,我在服务器端用 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()!
但是失败了,因为解码后的字符串包含未处理的字符。 我该如何处理它们?
谢谢你的想法
最佳答案
您不能将任意数据解释为 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), ...)
关于swift - Base64 解码 Swift 3 中的加密内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44781367/