маска
«Маска» объясняется в комментариях и в одной строке кода. Он изменяет 32-битный CR C, вращая его вправо на 15 бит и добавляя константу.
Зачем нам нужна маска?
Маска не " необходимо », но рекомендуется сделать CR C немного сложнее, чем стандартный CR C, при хранении CRC. Я не знаю, почему рекомендуется «защищать» сохраненные CRC таким образом. Если процесс «маскирования» фиксирован и известен, то я не понимаю, как он помогает «защищать» сохраненные CRC. Я предполагаю, что маска является настраиваемой и неизвестна другим пользователям для фактического использования.
проблематично c вычислить CR C строки, содержащей встроенные CRC
Мне непонятно, о чем идет речь. Нетрудно сгенерировать данные, которые могут go в любом месте строки, чтобы вычисленный CR C был действительным. Обычно к сообщению добавляется CR C, но его можно перебрать назад на n бит, умножив CR C на (1 / (2 ^ (n))) (в собственном поле Галуа), без переноса умножение, которое может быть ускорено с помощью такой инструкции, как x86 pclmulqdq (он использует регистры xmm). Например, скажем, 32-битный CR C должен храниться в битовом индексе j строки с m битами, включая как данные, так и CR C. 32 бита с индексом j обнуляются, затем стандартный CR C используется для вычисления CR C, как если бы он был добавлен в битовый индекс m . Затем CR C циклически повторяется в обратном порядке m - j бит и сохраняется в битовом индексе j .
Имея несколько CRC, встроенных в string затруднит обратный инжиниринг, но я видел случаи, когда в файлах сохранения, используемых для игр, было два встроенных CRC, и хакеры могли реконструировать метод двойного CR C.