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