Cryptoswift: нельзя сравнивать режимы - PullRequest
0 голосов
/ 28 января 2020

В моем проекте есть разные блочные режимы для шифрования / дешифрования aes, я получаю их из pickerview:

let blockCipherModeArray = ["ECB", "CBC", "PCBC", "CFB", "OFB", "CTR", "GCM"]
var mode : BlockMode = ECB()                        //just for init
var decryptionModeShouldBe: BlockMode = ECB()     //just for init

Мне нравится c для настройки режима блокировки:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
//        ["ECB", "CBC", "PCBC", "CFB", "OFB", "CTR", "GCM"]
        let iv = generateIV()

        switch blockCipherModeArray[row] {
        case "ECB":
            let ecb = ECB()
            self.mode = ecb
        case "CBC":
            let cbc = CBC(iv: iv)
            self.mode = cbc
        case "PCBC":
            let pcbc = PCBC(iv: iv)
            self.mode = pcbc
        case "CFB":
            let cfb = CFB(iv: iv)
            self.mode = cfb
        case "OFB":
            let ofb = OFB(iv: iv)
            self.mode = ofb
        case "CTR":
            let ctr = CTR(iv: iv)
            self.mode = ctr
        case "GCM":
            let gcm = GCM(iv: iv)
            self.mode = gcm
        default:
            break
        }
    }

затем я передаю режим этой функции:

func encryptionAES(blockMode: BlockMode) {

        if isNotEncrypted {
            // blockCipherMode.isUserInteractionEnabled = false    //disable pickerview


            guard let key = generateKey(pwd: passOutlet.text) else {
                resultLabel.text = "Password field is empty"
                DispatchQueue.main.asyncAfter(wallDeadline: .now() + 3) {
                    self.resultLabel.text = ""
                }
                return
            }



            guard let text = inputText.text else { return }
            let input = Array(text.utf8)

            do {
                let encrypt = try AES(key: key, blockMode: blockMode, padding: .pkcs7).encrypt(input)
                resultLabel.text = "Encrypted input: \(encrypt.toHexString())"

                decryptionModeShouldBe = blockMode
                inputCypherText = encrypt
                isNotEncrypted = false
                inputText.isEnabled = false
                inputText.text = "\(encrypt.toHexString())"
                passOutlet.text = ""

            } catch {
                print(error)
            }
        }

, поэтому, когда я шифрую, я пишу так:

@IBAction func encryptButtonAction(_ sender: UIButton) {
        encryptionAES(blockMode: mode)

    }

и когда я расшифровываю, я сначала хотел проверить режим из окна выбора, но я не могу написать так:

@IBAction func decryptButtonAction(_ sender: UIButton) {

        if dencryptionModeShouldBe == mode {    //Error: Binary operator '==' cannot be applied to two 'BlockMode' operands
            decryptionAES(blockMode: mode)
        } else {
            resultLabel.text = "You choose different blockMode for decryption!"
        }
    }

}

, поэтому мой вопрос: как я могу сравнивать блочные моды? Я знаю, что могу отключить просмотрщик, но не хочу этого делать. Большое спасибо!

...