簡體   English   中英

如何在 swift 中使用帶有 PKCS5PADDING 的 AES-256 CFB 解密字符串?

[英]How to Decrypt a string using AES-256 CFB with PKCS5PADDING in swift?

我正在尋找使用 AES 解密字符串,我嘗試了 SO 的多個解決方案,但沒有一個有幫助,我無法獲得解決方案。 android 開發人員使用Cipher執行以下代碼:-

    private static final byte[] initVector = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    private static Cipher getAES_Cipher(int opmode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
        InvalidAlgorithmParameterException {
    IvParameterSpec iv = new IvParameterSpec(initVector);
    SecretKeySpec skeySpec = new SecretKeySpec(Arrays.copyOfRange(getSHA(key), 0, 32), "AES");

    Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5PADDING");
    cipher.init(opmode, skeySpec, iv);
    return cipher;
}

同樣,我嘗試使用CryptoSwift來執行此操作,下面是我用來執行此操作的代碼:-

extension String {


func aesEncrypt(key: String, iv: String) throws -> String {

    let data: Array<UInt8> = (self.data(using: .utf8)?.bytes)!
    var key: Array<UInt8> = (key.data(using: .utf8)?.bytes)!
    let iv: Array<UInt8> = (iv.data(using: .utf8)?.bytes)!

    do {
        let encrypted = try AES(key: key, blockMode: CFB(iv: iv), padding: .pkcs5).encrypt(data)
        let encryptedData = Data(encrypted)
        let decrypted = try AES(key: key, blockMode: CFB(iv: iv), padding: .pkcs5).decrypt(encrypted)
        let decryptedData = Data(decrypted)
        let str = String.init(data: decryptedData, encoding: .utf8)
        print(str ?? String())
        return encryptedData.base64EncodedString()

    } catch {
        print(error)
        return "error"
    }
}

func aesDecrypt(key: String, iv: String) throws -> String {

    let data: Array<UInt8> = (Data(base64Encoded: self)?.bytes)!
    let key: Array<UInt8> = (key.data(using: .utf8)?.bytes)!
    let iv: Array<UInt8> = (iv.data(using: .utf8)?.bytes)!



    do {
        let decrypted = try AES(key: key.sha256(), blockMode: CFB(iv: iv), padding: .pkcs5).decrypt(data)
        let decryptedData = Data(decrypted)
        guard let value = String.init(data: decryptedData, encoding: .utf8) else {
            return "error"
        }
        return value

    } catch {
        print(error)
        return "error"
    }
}

}

在 ViewDidLoad() 我這樣稱呼它:-

    let message = "My Encrypted String From The Server"
    let test = try! message.aesDecrypt(key: "dfksjghlskjdfhglksjdfhglkjsdhfglkjhsfopweiurtypoweirutopiewrutgopiruegoijnsdeghsedrghesrerthigoererhehewthgewrhywertyweyweyewrtewrtyewihgoie", iv: "0000000000000000")

    print(test)

當我傳遞與 android 相同的iv時,我還想強調一件事,即“{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }"我從CryptoSwift庫中收到錯誤為invalidInitializationVector但是當我通過 iv:"0000000000000000" 我收到一個錯誤 -->

  guard let value = String.init(data: decryptedData, encoding: .utf8) else {
        return "error"
    }

我相信這與我在那里經過的靜脈注射有關。

伙計們任何幫助將不勝感激

謝謝你

嘗試使用 CryptoSwift 解碼某些數據時發現了這個問題。 嘗試了代碼,它也對我不起作用(確實返回“錯誤”)。

問題在於解密方法並且與密鑰有關。

你有加密:

let encrypted = try AES(key: key, blockMode: CFB(iv: iv), padding: .pkcs5).encrypt(data)

但是要解密,代碼如下所示:

let decrypted = try AES(key: key.sha256(), blockMode: CFB(iv: iv), padding: .pkcs5).decrypt(data)

對我來說,removing.sha256() 解決了這個問題。

所以最終的解密方法應該是:

func aesDecrypt(key: String, iv: String) throws -> String {

    let data: Array<UInt8> = (Data(base64Encoded: self)?.bytes)!
    let key: Array<UInt8> = (key.data(using: .utf8)?.bytes)!
    let iv: Array<UInt8> = (iv.data(using: .utf8)?.bytes)!

    do {
        let decrypted = try AES(key: key, blockMode: CFB(iv: iv), padding: .pkcs5).decrypt(data)
        let decryptedData = Data(decrypted)
        guard let value = String.init(data: decryptedData, encoding: .utf8) else {
            return "error"
        }
        return value
    } catch {
        print(error)
        return "error"
    }
}

也許它會幫助某人並節省一些時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM