Контрольная сумма CRC (EMVCo QR)
Контрольная сумма CRC — последнее поле (ID 63) платёжного QR стандарта EMVCo: CRC-16/CCITT-FALSE по всей строке кода, позволяющая приложению проверить целостность перед оплатой.
Что за поле CRC в платёжном QR
Платёжный QR стандарта EMVCo — это строка из полей формата TLV (тег, длина, значение). Последнее поле в ней всегда имеет идентификатор 63 и содержит контрольную сумму CRC всей строки. По ней банковское приложение проверяет, что код считался без искажений, прежде чем показывать сумму и реквизиты к оплате. То же поле используется и в российской системе, построенной на EMVCo, — в QR СБП.
Как вычисляется
Используется алгоритм CRC-16/CCITT-FALSE: полином 0x1021, начальное значение 0xFFFF, без инверсии входа и выхода. Тонкость в охвате: сумма считается по всей строке кода, включая сам идентификатор поля и его длину — «6304», — но до четырёх символов самого значения CRC. То есть в расчёт входят символы вплоть до «6304» включительно, а результат — четыре шестнадцатеричных знака в верхнем регистре — дописывается следом. Приложение при чтении повторяет вычисление и сравнивает с тем, что записано в поле 63.
Зачем нужна
Платёжный код нельзя читать «примерно»: ошибка в счёте или сумме — это деньги не туда. Сам QR уже защищён коррекцией Рид-Соломона на уровне модулей, но CRC добавляет проверку на уровне уже разобранной платёжной строки — от опечатки при ручной генерации до сбоя при передаче. Не сошлась контрольная сумма — приложение отклоняет код и не даёт оплатить по битым реквизитам. Собрать корректную платёжную строку помогает генератор QR.