【问题标题】:How to do AES decryption using iv & key with cryptoswift?如何使用 iv & key 和 cryptoswift 进行 AES 解密?
【发布时间】:2019-06-20 12:44:17
【问题描述】:

使用 cryptojs 在 javascript 中实现,但无法使用 cryptoswift 在 swift 中执行相同的操作。查看下面的代码,我无法理解如何在 javascript 中生成密钥、iv 和密文。没有想法在 Swift 中使用 cryptoswift 做同样的事情。

decryptPayloadQR(ciphertextStr, SecretKey) {

try {
     let key = CryptoJS.enc.Utf8.parse(SecretKey);
     var ciphertext = CryptoJS.enc.Base64.parse(ciphertextStr);
     var iv = ciphertext.clone();
     iv.sigBytes = 16;
     iv.clamp();
     ciphertext.words.splice(0, 4);
     ciphertext.sigBytes -= 16;
     var decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, key, {
       iv: iv
     });
     console.log("===decrypted.toString(CryptoJS.enc.Utf8)=",decrypted.toString(CryptoJS.enc.Utf8));
     return decrypted.toString(CryptoJS.enc.Utf8);
   } catch (error) {
     console.log("===error in decrpt fun === : ",error);
     return false
   }
 }

结果是字符串,可以转成json。

Swift 代码如下。

    let encryptedString = "OdqBIN4twOxKwe1aIZhTatkzVdfvN/mfB2Arra38tF25+3efc+Kl+HABZtqiGrTIihSpfW/XHW8+31Rl+uHZB2immfB6/w8E2j5ylCV8RKrqHVMMB7BPBLyr8oTuxmYEla1J1NxywLFPyNZCI4zmkYczwVSyssd5VKWH8WaBHR5Yai6MaxugdohW40byPx6xqbhwjHN5w+dh3dJBSFbM5EhQTqPwfBA1v1UBrCXooay47keSFor/7ywjV3e2bU5JrL0o+S26UF6zoVkRP1tdGAY3TqYyrPLUHVq0nIzkmnZdQk5gFGjN0sF58WdhuqjgRAtSrbmL5biuOtmQHFmNx4sUjkF4pYvfYxrj3ze2H/6G03cxCzW/DUytV678IBrd"

//======== iv & cipher text should be same as generated in above javascript code ==========//
        //======== Should these keys be in hex =======//
        let iv = "" /* No idea how to get iv from encrypted string */
        let cipherText = "" /* No idea how to get cipherText from encrypted string */
        let key = "abababababababab"

        do {
            let decryptor = try AES(key: key, iv: iv)
            let decryptedBytes = try decryptor.decrypt(cipherText.bytes)
            print(String(bytes: decryptedBytes, encoding: .utf8)!)
        } catch {
            print(error)
        }

如何获得与 javascript 中类似的 swift iv、密钥和密文? 提前致谢。

【问题讨论】:

    标签: javascript swift encryption aes cryptoswift


    【解决方案1】:

    我可以使用下面的代码在 Swift 中使用 cryptoswift 做同样的事情。

    let encryptedString = "OdqBIN4twOxKwe1aIZhTatkzVdfvN/mfB2Arra38tF25+3efc+Kl+HABZtqiGrTIihSpfW/XHW8+31Rl+uHZB2immfB6/w8E2j5ylCV8RKrqHVMMB7BPBLyr8oTuxmYEla1J1NxywLFPyNZCI4zmkYczwVSyssd5VKWH8WaBHR5Yai6MaxugdohW40byPx6xqbhwjHN5w+dh3dJBSFbM5EhQTqPwfBA1v1UBrCXooay47keSFor/7ywjV3e2bU5JrL0o+S26UF6zoVkRP1tdGAY3TqYyrPLUHVq0nIzkmnZdQk5gFGjN0sF58WdhuqjgRAtSrbmL5biuOtmQHFmNx4sUjkF4pYvfYxrj3ze2H/6G03cxCzW/DUytV678IBrd"
    let aesIVBlockSize = 16
    
    let cipherData = Data(base64Encoded: encryptedString, options: .ignoreUnknownCharacters)
    let ivBytes = Array(Array(cipherData!).dropLast(cipherData!.count - aesIVBlockSize))
    let actualCipherBytes = Array(Array(cipherData!).dropFirst(aesIVBlockSize))
    
    do {
         let aes = try AES(key: Array("abababababababab".data(using: .utf8)!), blockMode: CBC(iv: ivBytes))
         let decrypted = try aes.decrypt(actualCipherBytes)
         let outData = Data(bytes: decrypted)
         print(outData)
         print(String(bytes: outData, encoding: .utf8) as Any)
       } catch {
         print("Decryption error: \(error)")
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多