Base64 解码 Swift 3 中的加密内容

Base64 decode encrypted content in Swift 3

我正在开发一个连接到我的服务器的 Swift 框架。应用程序和 PHP 服务器之间的数据以 AES-256-CBC 加密。我成功地将数据从应用程序发送到服务器并获得响应。但是现在我想解密响应但我不能。

为了解密服务器响应,我使用了一个向量(由服务器以 Base64 格式发送)、源数据和一个密钥(在应用程序端生成)。当我对向量执行 base64Decode 时,base64 returns nil。它 returns 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: 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()!

但是失败了,因为解码的字符串包含未处理的字符。 我该如何处理它们?

感谢您的所有想法

不能将任意数据解释为 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), ...)