如何使用 CommonCrypto 在 swift 中解密

How to decrypt in swift using CommonCrypto

我正在构建一个 IOS 应用程序,它与 JS 通信。所以两端之间的通信必须加密。所以我的主要意图是从Javascript端加密,然后发送到IOSapp移动端,移动端app应该解密数据。这就是我在 Javascript 方面所做的,并且按预期工作正常,

 const key = CryptoJS.enc.Utf8.parse("MY SECRET KEY 123");
 const iv = CryptoJS.enc.Utf8.parse("ui09ji884uh88984");
 var encrypted = CryptoJS.AES.encrypt("Hello world",key, {
                           mode: CryptoJS.mode.CBC,
                           padding: CryptoJS.pad.Pkcs7,
                           iv: iv
                    });
 console.log("Encrypted data ="+encrypted);

问题是我如何使用 CommonCrypto 解密 swift 中的加密数据。由于这是纯 base64 文本,我们如何将其提供给解密?我到目前为止在 swift 中完成的代码发布在下面,

func testCrypt(data data:[UInt8], keyData:[UInt8], ivData:[UInt8], operation:Int) -> [UInt8]? {
    let cryptLength  = size_t(data.count+kCCBlockSizeAES128)
    var cryptData    = [UInt8](repeating: 0, count:cryptLength)

    let keyLength             = size_t(kCCKeySizeAES128)
    let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
    let options:  CCOptions   = UInt32(kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(CCOperation(operation),
                              algoritm,
                              options,
                              keyData,
                              keyLength,
                              ivData,
                              data,
                              data.count,
                              &cryptData,
                              cryptLength,
                              &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
//      cryptData.remove
        cryptData.removeSubrange(numBytesEncrypted..<cryptData.count)

    } else {
        print("Error: \(cryptStatus)")
    }

    return cryptData;
}

上面的方法我是这样调用的,

let message       = "Hello world"
let messageData   = Array(message.utf8)
let keyData       = Array("MY SECRET KEY 123".utf8)
let ivData        = Array("ui09ji884uh88984".utf8)
                  
let str = ".."//THIS IS THE ENCRYPTED TEXT FROM JS
let buf = Array(str.utf8)
print("BUFF: ", buf)
                  
let encryptedData = testCrypt(data:messageData,   keyData:keyData, ivData:ivData, operation:kCCEncrypt)!
let decryptedData = testCrypt(data:encryptedData, keyData:keyData, ivData:ivData, operation:kCCDecrypt)!
var decrypted     = String(bytes:decryptedData, encoding:String.Encoding.utf8)!

如果我们同时进行加密和解密并将加密的字节数组传递给解密,这就可以正常工作。但是当我尝试将加密文本转换为字节数组并将其传递给它时,会发生异常。还有我转换的那个(例如:buf)和加密后的 testCrypt returns(例如:encryptedData)不相似。请任何人详细说明并提供解决方案将不胜感激。

好的,我发现了问题。在将其转换为 UInt8 数组之前,您需要将其转换为数据对象,然后将其转换为 UInt8 数组以进行馈送。所以 swift 中的代码应该是这样的,

let str = "SJeOvypKWad9GzUD2GHRig=="
let data = Data(base64Encoded: str);
let buf: [UInt8] = Array(data!)