【问题标题】:How to decrypt in swift using CommonCrypto如何使用 CommonCrypto 快速解密
【发布时间】:2021-10-19 06:07:33
【问题描述】:

我正在构建一个 IOS 应用程序,它与 JS 通信。所以两端的通信必须加密。所以我的主要意图是从Javascript端加密并将其发送到IOS 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 快速解密这些加密数据。由于这是纯 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在加密后返回的那个(例如:encryptedData)也不相似。请任何人详细说明这一点并提供解决方案将不胜感激。

【问题讨论】:

    标签: javascript swift react-native aes commoncrypto


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多