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