Проверка CRC избыточна при использовании шифрования?

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

Шифрование:

  1. Возьмите данные полезной нагрузки и рассчитайте из них CRC
  2. Шифровать данные полезной нагрузки плюс CRC

Расшифровка:

  1. Расшифровать данные
  2. Рассчитайте новый CRC данных полезной нагрузки и сравните его со старым CRC

Я хотел спровоцировать сбой проверки CRC в своем модульном тесте, но когда я манипулирую данными полезной нагрузки, расшифровка всегда вызывает исключение BadPaddingException.

Мой вопрос: если расшифровка всегда выдает это исключение, когда данные повреждены или манипулируются (будет ли это?), не является ли проверка CRC избыточной, как я ее использую?


person mithrandir    schedule 11.01.2013    source источник
comment
Что вы шифруете на шаге 2 шифрования? Полезная нагрузка + CRC или просто полезная нагрузка?   -  person Timmos    schedule 11.01.2013
comment
Покажите нам свой код методов шифрования/дешифрования, которые вы используете.   -  person Andremoniy    schedule 11.01.2013
comment
@Timmos Я шифрую полезную нагрузку + CRC (см. выше)   -  person mithrandir    schedule 11.01.2013
comment
@Andremoniy мой вопрос теоретический - код не сильно поможет имхо   -  person mithrandir    schedule 11.01.2013


Ответы (1)


Предполагая, что неправильно расшифрованные данные распределены равномерно, они будут выглядеть правильно дополненными PKCS5/PKCS7 примерно 1 раз на каждые 255 неправильных паролей. Это означает, что все еще есть шанс 1/255, что произойдет правильное изменение, и элемент будет расшифрован как мусор. Поэтому ваш чек не является пустой тратой.

Если вы действительно хотите ожидаемого поведения, вы можете использовать «AES/CTR/NoPadding», который не требует точного размера блока и всегда будет возвращать расшифрованный байт [], независимо от того, совпадают ли ключи.

Однако, если злоумышленник может неоднократно изменять зашифрованный текст и заставить вас расшифровать его (примером могут быть зашифрованные данные, хранящиеся в файле cookie), и если они могут отличить ваше поведение, когда расшифрованные данные вызывают исключение из-за неправильного заполнения и когда это просто мусор, тогда они могут определить открытый текст с помощью «атаки оракула заполнения».

Вы также можете подумать, подходит ли более надежный отпечаток пальца, чем CRC, например SHA -256 для обеспечения целостности сообщения.

Многое из этого повторяется из: AES BadPaddingException

person Wolfwyrd    schedule 11.01.2013
comment
Спасибо - это именно то, что я хотел знать! - person mithrandir; 11.01.2013