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 крайне небезопасно, и его часть не должна копироваться.Я предполагаю, что реальный код шифрования не работает, как этот.