Перевірка цілісності коду CRC

Матеріал із Довідник дослідника програм
CRC (англ.) відноситься до криптографічних алгоритмів хешування. На вході функції обчислення контрольної суми (CRC) може бути представлена будь-яка кількість байт, завдання алгоритму полягає в тому, щоб отримати на основі всього обсягу вхідних дані 32 бітне число (8 байт), це число повинно залежати від кожного байта вхідної послідовності, таким чином одержуване 32 бітове число є цифровим підписом вихідного масиву даних. 32 біта дає два в ступені 32 (4294967296 = 4,29 мільярда) варіантів різних значень цифрового підпису. Тобто, цифровий підпис CRC32 масиву даних із ймовірністю 99,9999999767 відсотка дає можливість припустити, що є цифровим підписом саме цих даних. Однак існує один шанс і 4,29 мільярдів, що у двох різних масивів даних може бути однаковий CRC32 підпис, такий випадок називається в криптографії колізією.
Перевірка цілісності коду з урахуванням CRC
Shareware програмісти, а особливо програмісти протекторів стали використовувати перевірку цілісності EXE файлу, а також перевірку цілісності коду програми в пам'яті для захисту свого дітища від пропатчування і впливу вірусів. При пропатчуванні така програма буде показувати вікно з повідомленням про помилку, або тишком-нишком змінювати свій алгоритм роботи або реєстрації.
Складністю при написанні захисту з перевіркою цілісності коду є те, що на момент написання вихідних програміст, природно не має скомпільованої фінальної версії програми, тобто для CRC32 немає відомих вхідних даних, крім того, якщо сам підпис зберігати всередині виконуваного файлу, то мати валідний підпис у ньому, якщо файл підписується цілком, неможливо. Причина в тому щосам електронний підпис входить до масиву вхідних байт, таким чином, програмісту завжди необхідно відвести окрему область усередині файлу де зберігатиметься сама CRC32 запис, а інші байти файлу будуть вхідними даними. Після компіляції релізу програми необхідно обробити її зовнішнім інструментом, який створить валідну контрольну суму для першої області файлу і помістить сам підпис у другу заздалегідь відому область файлу.
Злом CRC32
Сам алгоритм CRC32 має слабкість: існує можливість отримати колізію, змінивши всього 4 байти у вхідній послідовності підписаних байт, тобто підігнати вихідні дані так, щоб отримати потрібне значення CRC32.