Swift 解密CommonCrypto始终使用URLSession.shared.dataTask数据返回nil

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

我正在制作一个带有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 = "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