Base64解码Swift 3中的加密内容

时间:2017-06-27 13:19:33

标签: swift base64 aes

我正在开发一个连接到我的服务器的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()!

但是失败了,因为解码后的字符串包含非处理字符。 我怎么处理它们?

感谢您的所有想法

1 个答案:

答案 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), ...)