ISO/IEC 7064

ISO/IEC 7064 (англ. Information technology – Security techniques – Check character systems) — международный стандарт, совместно разработанный Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC), который определяет системы контрольных знаков (проверочных символов, контрольных символов) для обнаружения ошибок.

Целью данного стандарта является предоставление набора стандартизованных систем контрольных знаков, обладающих математически гарантированными свойствами. Основное назначение этих систем — выявление типичных ошибок ввода, возникающих при работе с символьными строками, особенно тех, которые допускаются человеком при ручном вводе данных. Использование индивидуально разработанных алгоритмов контрольных знаков, основанных на аналогичных принципах, но не дающих значимых преимуществ и зачастую ошибочных, стандарт стремится минимизировать. Стандартизированные методы по ISO/IEC 7064 призваны повысить уровень информационной безопасности, облегчить внедрение в программные библиотеки и упростить обмен данными между участниками коммуникаций.

Разработка

Стандарт был разработан в составе объединённого технического комитета ISO/IEC JTC 1 (Information technology) подкомитетом SC 27 (IT Security techniques). Действующая версия — ISO/IEC 7064:2003[1][2] — была опубликована 15 февраля 2003 года и заменила версию ISO 7064:1983. Новая редакция содержит технические изменения, однако программы, совместимые с предыдущей редакцией, совместимы и с новой.

До публикации первой версии ISO 7064 системы контрольных знаков уже были определены в ряде других стандартов ISO: ISO 2108 описывает систему проверки для международных стандартных книжных номеров (ISBN), ISO 2894 (утративший силу) использовался для номеров кредитных карт с тиснением, а ISO 6166 — для международных идентификаторов ценных бумаг (ISIN). Версия ISO 7064:1983 была выпущена для упорядочивания множества существующих систем контрольных знаков[1].

Стандартизованные системы

Методы предназначены для исходных строк, символы которых относятся к латинскому алфавиту (алфавитно-цифровые, только буквы или только цифры). Остальные символы игнорируются. Хотя стандарт не включает прямую поддержку Unicode и игнорирует нелатинские символы, Приложение B предоставляет пример расширения для алфавитов, содержащих более 26 символов[1].

Контрольный знак (англ. check character) — это символ, формируемый на основе исходной строки и добавляемый к ней. Специальный контрольный знак (англ. supplementary check character) — контрольный знак, не входящий в исходный набор символов. Системы контрольных знаков определяют правила формирования контрольных символов и проверки.

Вычисление контрольных знаков во всех системах предполагает выполнение по крайней мере одной операции взятия по модулю (Modulo, MOD). Чистые системы используют лишь один делитель, гибридные системы — два различных. Гибридным системам достаточно одного контрольного знака из исходного набора, чистые системы требуют либо двух символов, либо использования специального контрольного знака. Математическое различие заключается в том, что чистые системы основаны на взвешенной сумме по одному модулю, тогда как гибридные системы используют итеративный процесс с двумя различными модулями без применения весовых коэффициентов[1].

Для чистых систем кроме рекурсивных правил вычисления стандарт также приводит таблицы весов для расчёта через взвешенные контрольные суммы.

Системы контрольных знаков по ISO/IEC 7064
Обозначение Набор символов исходной строки Чистая/гибридная система Контрольный знак
ISO/IEC 7064, MOD 11-2 числовой чистая одна цифра или 'X'
ISO/IEC 7064, MOD 37-2 алфавитно-цифровой чистая один алфавитно-цифровой символ или '*'
ISO/IEC 7064, MOD 97-10 числовой чистая две цифры
ISO/IEC 7064, MOD 661-26 буквенный чистая две буквы
ISO/IEC 7064, MOD 1271-36 алфавитно-цифровой чистая два алфавитно-цифровых символа
ISO/IEC 7064, MOD 11,10 числовой гибридная одна цифра
ISO/IEC 7064, MOD 27,26 буквенный гибридная одна буква
ISO/IEC 7064, MOD 37,36 алфавитно-цифровой гибридная один алфавитно-цифровой символ

В приложениях стандарта приведены рекомендации по разработке аналогичных систем для других алфавитов, кроме латинского.

Присвоение числовых значений символам

Каждому символу исходной строки должен быть присвоен уникальный числовой эквивалент для дальнейших вычислений. Во всех алгоритмах перебираются символы строки последовательно, каждому из которых присваивается свой уникальный числовой код. Для цифр это их значение, для букв — порядковый номер: A получает 0, B — 1 и так далее до Z — 25 (для буквенного набора); в алфавитно-цифровом зависит от системы: A присваивается 10, B — 11, ..., Z — 35, при этом специальный символ «*» (звёздочка) в системе MOD 37-2 имеет числовое значение 36[3].

После вычисления в зависимости от системы получается одно или два контрольных значения, которые вновь преобразуются в символы. Если результату не соответствует ни один символ набора, используется специальный контрольный символ. Обычно контрольные знаки добавляются к исходной строке.

Алгоритм для чистых систем с одним контрольным знаком

Система ISO/IEC 7064, MOD 11-2 вычисляет контрольное значение для строки из n цифр по следующему алгоритму:[4]

M : 11
R : 2
Строка : array[1..n] of 0..9 (* цифры исходной строки *)

Продукт := 0;
for i := 1 to n do
begin
  Сумма := Строка[i] + Продукт;
  Продукт := (Сумма * R) MOD M;
end;
(* вычисление контрольного значения *)
Контрольное_значение := (M + 1  Продукт) MOD M;
  (* Приведенная формула (M + 1 - Продукт) MOD M используется для генерации контрольного знака. *)
(* При процедуре верификации (проверки) итоговый остаток от деления всей строки с контрольным знаком должен быть равен 1<ref name="ISO7064_1983">{{cite web |url=https://cdn.standards.iteh.ai/samples/13631/840b1ce0c80643d2b6e83b4c96274e66/ISO-7064-1983.pdf |title=ISO 7064:1983 |website=standards.iteh.ai |date=1983 |access-date=2026-05-28}}</ref>.<ref name="ISO7064_GitHub">{{cite web |url=https://github.com/danieltwagner/iso7064 |title=danieltwagner/iso7064 |website=GitHub |access-date=2026-05-28}}</ref> *)

Вычисление по модулю внутри цикла предотвращает переполнение при обработке длинных строк.

Пример: Строка "0794" получает контрольный знак '0':

  1. i = 1:
    1. Сумма := 0 + 0 = 0
    2. Продукт := (0 * 2) MOD 11 = 0
  2. i = 2:
    1. Сумма := 7 + 0 = 7
    2. Продукт := (7 * 2) MOD 11 = 3
  3. i = 3:
    1. Сумма := 9 + 3 = 12
    2. Продукт := (12 * 2) MOD 11 = 2
  4. i = 4:
    1. Сумма := 4 + 2 = 6
    2. Продукт := (6 * 2) MOD 11 = 1
  5. Контрольное_значение := (11 + 1 - 1) MOD 11 = 0

Контрольное значение принимает значения от 0 до 10. Для 0–9 контрольный знак совпадает с цифрой, для 10 — знак 'X'. Строке "079" будет сопоставлен знак 'X' (так как (11 + 1 - 2) MOD 11 = 10).

Вычисление ISO/IEC 7064, MOD 37-2 проводится аналогично, только задаются M = 37 и иной алфавитно-цифровой набор; при значении 36 используется специальный знак '*'.

Алгоритм для чистых систем с двумя контрольными знаками

Для систем с двумя контрольными знаками алгоритм аналогичен предыдущему, но параметры M и R (например, для MOD 97-10: M=97, R=10; MOD 661-26: M=661, R=26; MOD 1271-36: M=1271, R=36). Последний шаг заменяется на:[5]

(* вычисление контрольного значения *)
Продукт := (Продукт * R) MOD M
P := (M + 1 - Продукт) MOD M
Контроль_1 := P MOD R;
Контроль_2 := P DIV R

При верификации строки с двумя контрольными знаками итоговый остаток от деления на модуль M также должен быть равен 1[6].

Пример вычисления (MOD 97-10)

Расчёт контрольных цифр по алгоритму ISO/IEC 7064 MOD 97-10 (используемому, в частности, для Международного номера банковского счёта — IBAN) производится следующим образом. В качестве примера используется бельгийский номер счёта (BBAN) 510-0075470-61 с кодом страны BE[7]. Шаг 1: Составление временной строки

  • Из номера счёта удаляются все символы, не являющиеся буквами или цифрами: 510-0075470-61510007547061.
  • Формируется строка, состоящая из кода страны, двух нулей (00) и очищенного номера счёта: BE + 00 + 510007547061BE00510007547061.

Шаг 2: Перестановка символов

  • Первые четыре символа (код страны и два нуля) переносятся в конец строки: BE00510007547061510007547061BE00.

Шаг 3: Замена букв на числа

  • Буквы заменяются на числа согласно стандартной таблице конвертации (A = 10, B = 11, C = 12 и так далее). В данном случае B = 11, E = 14.
  • Полученная строка состоит только из цифр: 510007547061BE00510007547061111400.

Шаг 4: Вычисление по модулю 97

  • Полученное число делится на 97 для нахождения остатка от деления (операция mod 97): 510007547061111400 mod 97 = 36.

Шаг 5: Вычисление контрольных цифр

  • Полученный остаток вычитается из 98: 98 - 36 = 62.
  • Если результат является однозначным числом (от 1 до 9), он дополняется ведущим нулём. В данном случае результат 62 — двузначный, он и является искомыми контрольными цифрами.

Шаг 6: Формирование итогового номера

  • Вычисленные контрольные цифры вставляются на место двух нулей, добавленных на первом шаге: BE62510007547061.

Для проверки правильности сформированного номера выполняется обратная процедура: первые четыре символа переносятся в конец, буквы заменяются на числа, после чего остаток от деления итогового числа на 97 должен быть равен 1[7].

Алгоритм для гибридных систем

ISO/IEC 7064, MOD 11,10 вычисляет одну контрольную цифру для строки из n цифр:[8]

Строка : array[1..n] of 0..9 (* цифры исходной строки *)

Продукт := 10;
for i := 1 to n do
begin
  Сумма := (Строка[i] + Продукт) MOD 10;
  if Сумма = 0 then Сумма := 10;
  Продукт := (Сумма * 2) MOD 11;
end;
(* вычисление контрольного значения *)
Контрольное_значение := 11 - Продукт;
if Контрольное_значение = 10 then Контрольное_значение := 0;

В словах: Промежуточный результат («продукт») принимает значения от 1 до 10, стартует с 10. Для каждого символа:

  • Значение добавляется к продукту, берётся по модулю 10.
  • Если результат 0 — присваивается 10.
  • Полученное число домножается на 2, результат вычисляется по модулю 11 — новый продукт.

Когда все символы обработаны, контрольная цифра — это 11 минус итоговый продукт, при 10 — берётся 0.

Пример: Строка "0794" получает контрольную цифру '5':

  1. i = 1:
    1. Сумма := (0 + 10) MOD 10 = 0
    2. Сумма = 0, поэтому Сумма := 10
    3. Продукт := (10 * 2) MOD 11 = 9
  2. i = 2:
    1. Сумма := (7 + 9) MOD 10 = 6
    2. Продукт := (6 * 2) MOD 11 = 1
  3. i = 3:
    1. Сумма := (9 + 1) MOD 10 = 0
    2. Сумма = 0, поэтому Сумма := 10
    3. Продукт := (10 * 2) MOD 11 = 9
  4. i = 4:
    1. Сумма := (4 + 9) MOD 10 = 3
    2. Продукт := (3 * 2) MOD 11 = 6
  5. Контрольное_значение := 11 - 6 = 5

Системы ISO/IEC 7064, MOD 27,26 и ISO/IEC 7064, MOD 37,36 аналогичны MOD 11,10, но используют другие алфавиты и основания: MOD 27,26 использует модули 27 и 26 для букв A-Z (значения 0—25), а MOD 37,36 использует модули 37 и 36 для цифр 0—9 и букв A-Z (значения 10—35)[1]. Возможны аналогичные варианты для других наборов[9].

Свойства

Официальные источники предоставляют качественные, а не количественные оценки эффективности обнаружения ошибок[10].

Все системы стандарта распознают:

  • все ошибки, возникающие при замене одного символа (простой субституционный), пример: "SZANDARD";
  • все ошибки от циклических сдвигов внутри строки (пример: "ANDARDST"), если сдвиг меньше десяти символов.

Согласно качественным оценкам, алгоритмы стандарта также способны обнаруживать:[10]

  • все или почти все ошибки перестановки двух соседних символов (T0) или символов через один (T1, примеры: "STANDADR", "STANDDRA")[10];
  • высокую долю двойных ошибок замены (две независимые одиночные ошибки в строке, S2, пример: "SZANFARD")[10];
  • высокую долю всех прочих типов ошибок[10].

Основное отличие алгоритмов ISO/IEC 7064 от контрольной суммы CRC заключается в их специализации. Системы ISO/IEC 7064 оптимизированы для выявления ошибок, типичных для ручного ввода данных человеком (одиночные замены, перестановки), в алфавитно-цифровых строках[10]. В свою очередь, алгоритмы CRC предназначены для обнаружения пакетных ошибок в бинарных данных при их передаче или хранении[11].

Выбор системы

В приложениях стандарта даны критерии выбора методов контрольных знаков. Помимо символного состава и числа дополнительных символов, важны проценты обнаруживаемых ошибок. При выборе необходимо учитывать, какие виды ошибок наиболее вероятны в конкретном приложении: удельный вес простых замен — обычно 60–85% всех ошибок, хотя возможны иные сценарии; двойные замены — около 5–15%[12].

Применение

Перед проверкой контрольных знаков обычно выполняются дополнительные проверки (на допустимость символов и длину строки).

Международный идентификатор имени (ISNI) и ORCID используют метод MOD 11-2.

International Society of Blood Transfusion — для номеров ISBT 128, допускающих буквы, применяет MOD 37-2[13].

Двухзначные контрольные суммы по MOD 97-10 используются в международных банковских номерах (IBAN), Leitweg-ID и глобальных идентификаторах юридических лиц (LEI)[1].

Система MOD 1271-36 используется в номере бизнес-партнёра (Business Partner Number, BPN) в экосистеме Catena-X[14].

Система MOD 16-3 использовалась в Международном стандартном коде текста (ISTC, ISO 21047)[15], который был отозван в 2021 году[16].

Медицинская система маркировки по Eurocode IBLS рекомендует MOD 11,10 (ISO/IEC 7064) для обнаружения ошибок. В Германии номера препаратов службы крови снабжаются такой же контрольной цифрой[17]. MOD 11,10 также лежит в основе вычисления контрольной цифры в германском идентификаторе НДС и в личном налоговом номере[18]. В настоящее время их технической и правовой основой являются § 27a Закона о налоге на добавленную стоимость (UStG) и стандарт ISO/IEC 7064, а не документ ZMDV 1993 года.

Данные методы не применяются для автоматической коррекции ошибок или защиты от целенаправленных подделок (см. криптографическая хеш-функция).

Литература

  • International Organization for Standardization. Information technology – Security techniques – Check character systems. — ISO, 2003.

Примечания