В моем проекте есть разные блочные режимы для шифрования / дешифрования 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!"
}
}
}
, поэтому мой вопрос: как я могу сравнивать блочные моды? Я знаю, что могу отключить просмотрщик, но не хочу этого делать. Большое спасибо!