swift - Base64 解码 Swift 3 中的加密内容

标签 swift base64 aes

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

相关文章:

PHP 函数在页脚底部创建链接

c# - 使用 .NET 类的 OpenSSL 加密

ios - 无效的浮点值 - swift 3 ios

ios - 准备segue时的Segue特定值

javascript - python django - 使用解码的 base64 写入时图像为空白

grails - 如何保存上传的图片

java - 为什么我的 AES 加密会引发 InvalidKeyException?

c++ - Openssl aes.h [链接器错误] undefined reference

swift - 点击 UITextView 时允许操作

ios - 在 Swift 中单击 UITabBarItem 时我将如何执行操作?