Swift 解密CommonCrypto始终使用URLSession.shared.dataTask数据返回nil
我正在制作一个带有java后端和Swift前端的应用程序。使用RESTAPI移动数据。我想用AES 128 CBC加密数据。加密方法有效,但解密方法无效 首先,这是用于反AES加密和解密的Swift代码:Swift 解密CommonCrypto始终使用URLSession.shared.dataTask数据返回nil,swift,rest,encryption,aes,urlsession,Swift,Rest,Encryption,Aes,Urlsession,我正在制作一个带有java后端和Swift前端的应用程序。使用RESTAPI移动数据。我想用AES 128 CBC加密数据。加密方法有效,但解密方法无效 首先,这是用于反AES加密和解密的Swift代码: import Foundation import CommonCrypto struct AES { private let key: Data private let iv: Data init?() { let ivProduct: String = "dkghe
import Foundation
import CommonCrypto
struct AES {
private let key: Data
private let iv: Data
init?() {
let ivProduct: String = "dkghepfowntislqn"
let keyProduct: String = "2949382094230487"
guard keyProduct.count == kCCKeySizeAES128 || keyProduct.count == kCCKeySizeAES256, let keyData = keyProduct.data(using: .utf8) else {
debugPrint("Error: Failed to set a key.")
return nil
}
guard ivProduct.count == kCCBlockSizeAES128, let ivData = ivProduct.data(using: .utf8) else {
debugPrint("Error: Failed to set an initial vector.")
return nil
}
self.key = keyData
self.iv = ivData
}
func encrypt(string: String) -> Data? {
return crypt(data: string.data(using: .utf8), option: CCOperation(kCCEncrypt))
}
func decrypt(data: Data?) -> String? {
guard let decryptedData = crypt(data: data, option: CCOperation(kCCDecrypt)) else { return nil }
return String(bytes: decryptedData, encoding: .utf8)
}
func crypt(data: Data?, option: CCOperation) -> Data? {
guard let data = data else { return nil }
let cryptLength = data.count + kCCBlockSizeAES128
var cryptData = Data(count: cryptLength)
let keyLength = key.count
let options = CCOptions(kCCOptionPKCS7Padding)
var bytesLength = Int(0)
let status = cryptData.withUnsafeMutableBytes { cryptBytes in
data.withUnsafeBytes { dataBytes in
iv.withUnsafeBytes { ivBytes in
key.withUnsafeBytes { keyBytes in
CCCrypt(option, CCAlgorithm(kCCAlgorithmAES), options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, cryptBytes.baseAddress, cryptLength, &bytesLength)
}
}
}
}
guard UInt32(status) == UInt32(kCCSuccess) else {
debugPrint("Error: Failed to crypt data. Status \(status)")
return nil
}
cryptData.removeSubrange(bytesLength..<cryptData.count)
return cryptData
}
}
现在来看问题。我已经做了几个测试:
首先检查加密和解密方法是否一起工作:
let aes128 = AES()
let dataEncrypt = aes128?.encrypt(string:"Hello") //Will be :lG7Bqk0nwx732eOQLAzhqQ==
let dataDecrypt = aes128?.decrypt(data:dataEncrypt) //Will be: "Hello"
print(dataDecrypt) --> //output = "Hello"
第一次测试很有效。对于第二个测试:
let aes128 = AES()
if let url = URL(string: "\(localhostUrl)/payment") {
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
print(String(data: data, encoding: .utf8)) //Output = lG7Bqk0nwx732eOQLAzhqQ==
let dataDecrypt = aes128?.decrypt(data: data)
print(dataDecrypt) --> //output = nil
这就是问题所在。当使用完全相同的编码字符串获取数据时,它将始终返回nil。这与URLSession返回的数据格式有关吗?您能用HEXTSTRING打印
数据吗?可能有“空间”或其他奇怪的字符吗?然后,如果需要,与数据进行比较(“IG7Bqk0nwx732eOQLAzhqQ==”.utf8)
“十六进制字符串”感谢您的回复!所以我比较了data.hexEncodedString()和数据(“IG7Bqk0nwx732eOQLAzhqQ==”.utf8)。这两种方法的十六进制字符串相同。
let aes128 = AES()
if let url = URL(string: "\(localhostUrl)/payment") {
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
print(String(data: data, encoding: .utf8)) //Output = lG7Bqk0nwx732eOQLAzhqQ==
let dataDecrypt = aes128?.decrypt(data: data)
print(dataDecrypt) --> //output = nil