CryptoSwift с режимом CTR AES128 - Приращение счетчика ошибок? - PullRequest
0 голосов
/ 11 октября 2018

Я столкнулся с проблемой на CryptoSwift-API (krzyzanowskim) при использовании AES128 с CTR-Mode и моей тестовой функцией (nullArrayBugTest()), которая выдает на определенных значениях счетчика (между 0 и 25 = на 13 и 24) неправильные значения.количество массивов, которое обычно должно быть 16!Даже если я использую вручную увеличенный «iv_13» с ошибочным значением 13 вместо стандартного «iv_0» и счетчика 13 ... Протестируйте его, чтобы понять, что я имею в виду.

  func nullArrayBugTest() {
    var ctr:CTR
    let nilArrayToEncrypt = Data(hex: "00000000000000000000000000000000")
    let key_ = Data(hex: "000a0b0c0d0e0f010203040506070809")
    let iv_0:  Array<UInt8> = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f]
    //let iv_13:  Array<UInt8> = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x1c]
    var decryptedNilArray = [UInt8]()

    for i in 0...25 {
        ctr = CTR(iv: iv_0, counter: i)
        do {
            let aes = try AES(key: key_.bytes, blockMode: ctr)
            decryptedNilArray = try aes.decrypt([UInt8](nilArrayToEncrypt))
            print("AES_testcase_\(i) for ctr: \(ctr) withArrayCount: \(decryptedNilArray.count)")
        }catch {
            print("De-/En-CryptData failed with: \(error)")
        }
    }
}

Вывод с ошибочными значениями

Вопрос, почему мне всегда нужен зашифрованный массив с 16 значениями, не важен: D.

Кто-нибудь знает, почему обрабатывается функция aes.decrypt()что, как я получил?

Спасибо за ваше время.

Майкл С.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Полагаю, шифрование происходит без применения заполнения, но затем вы используете дополнение для расшифровки.Чтобы это исправить, используйте одну и ту же технику с обеих сторон.Тем не менее, это решение (ответ @ rob-napier более подробный):

try AES(key: key_.bytes, blockMode: ctr, padding: .noPadding)
0 голосов
/ 11 октября 2018

CryptoSwift по умолчанию использует заполнение PKCS # 7.У ваших полученных открытых текстов неправильное заполнение. CryptoSwift игнорирует ошибки заполнения, , что является ошибкой IMO, но так оно и реализовано.(Все счетчики, которые вы считаете «правильными», действительно не должны были расшифровываться вообще.) (Я говорил об этом с Марцином, и он напомнил мне, что даже на этом низком уровне нормально игнорировать ошибки заполнения, чтобыизбегайте атак оракулом. Я забыл, что я делаю это тоже так ... )

Тем не менее, иногда отступы будут "достаточно близки", чтобы CryptoSwift попыталсяудалить байты заполнения.Обычно это не будет действительный отступ, но он будет достаточно близок для теста CrypoSwift.

Например, ваш первый счетчик создает следующий открытый текст:

[233, 222, 112, 79, 186, 18, 139, 53, 208, 61, 91, 0, 120, 247, 187, 254]

254>16, поэтому CryptoSwift не пытается удалить заполнение.

Для счетчика 13 возвращается следующий открытый текст:

[160, 140, 187, 255, 90, 209, 124, 158, 19, 169, 164, 110, 157, 245, 108, 12]

12 <16, поэтому CryptoSwift удаляет 12 байтов,оставляя 4. (Это не то, как работает заполнение PKCS # 7, а то, как работает CryptoSwift.) </p>

Основная проблема заключается в том, что вы не расшифровываете то, что зашифровали.Вы просто запускаете статический блок по схеме дешифрования.

Если вы не хотите заполнять, вы можете запросить следующее:

let aes = try AES(key: key_.bytes, blockMode: ctr, padding: .noPadding)

Это вернет вам то, что вы ожидаете.

На всякий случай, если другие читатели запутались: такое использование CTR крайне небезопасно, и его часть не должна копироваться.Я предполагаю, что реальный код шифрования не работает, как этот.

...