Алгоритм Луна или формула Луна , также известный как алгоритм « модуль 10» или «модуль 10» , названный в честь его создателя, ученого IBM Ханса Питера Луна , представляет собой простую формулу контрольных цифр , используемую для проверки различных идентификационных номеров.
Он описан в патенте США № 2950048, выданном 23 августа 1960 г. [1]
Алгоритм находится в открытом доступе и сегодня широко используется. Это указано в ISO/IEC 7812-1 . [2] Она не предназначена для использования в качестве криптографически безопасной хэш-функции ; он был разработан для защиты от случайных ошибок, а не от злонамеренных атак. Большинство кредитных карт и многие государственные идентификационные номера используют этот алгоритм как простой метод отличия действительных номеров от опечаток или других неправильных номеров.
Контрольная цифра вычисляется следующим образом:
Предположим, что это номер счета 1789372997 (только «полезная нагрузка», контрольная цифра еще не включена):
Сумма получившихся цифр равна 56.
Контрольная цифра равна .
В результате полный номер счета будет выглядеть как 17893729974.
Алгоритм Луна обнаружит все однозначные ошибки, а также почти все перестановки соседних цифр. Однако он не обнаружит транспозицию двухзначной последовательности от 09 до 90 (или наоборот). Он обнаружит большинство возможных двойных ошибок (он не обнаружит 22 ↔ 55 , 33 ↔ 66 или 44 ↔ 77 ).
Другие, более сложные алгоритмы контрольных цифр (такие как алгоритм Верхуффа и алгоритм Дамма ) могут обнаруживать больше ошибок транскрипции. Алгоритм Луна mod N — это расширение, поддерживающее нечисловые строки.
Поскольку алгоритм работает с цифрами справа налево, а нулевые цифры влияют на результат только в том случае, если они вызывают сдвиг позиции, заполнение нулями начала строки чисел не влияет на расчет. Следовательно, системы, которые дополняют определенное количество цифр (например, путем преобразования 1234 в 0001234), могут выполнять проверку Луна до или после заполнения и достигать того же результата.
Алгоритм появился в патенте США [1] на простое портативное механическое устройство для вычисления контрольной суммы. Устройство приняло мод 10 сумму механическим путем. Цифры замены , то есть результаты процедуры удвоения и сокращения, не производились механически. Скорее, цифры были отмечены на корпусе машины в переставленном порядке.
Следующая функция принимает номер карты, включая контрольную цифру, как массив целых чисел и выводит true, если контрольная цифра правильная, и false в противном случае.
функция isValid(cardNumber[1..length]) сумма := 0 четность:= модификация длины 2 для i от 1 до длины, если я mod 2 != четность, тогда сумма := сумма + номер карты[i] elseif cardNumber[i] > 4 , тогда сумма := сумма + 2 * номер карты[i] - 9 еще сумма := сумма + 2 * номер карты[i] end if end for return cardNumber[length] == (10 - (sum mod 10)) конечная функция
bool IsValidLuhn ( в int [ 1 ] цифр ) { интервал check_digit = 0 ; for ( int i = цифры . Длина - 2 ; я >= 0 ; -- i ) check_digit += (( i & 1 ) равно 0 ) переключатель { true => цифры [ i ] > 4 ? цифры [ i ] * 2–9 : цифры [ i ] * 2 , _ _ ложь => цифры [ я ] }; вернуть 10 - ( check_digit % 10 ) == цифры . Последний (); }
public static boolean isValidLuhn ( строковый номер ) { int контрольная сумма = Символ . getNumericValue ( number.charAt ( number.length ( ) - 1 ) ) ; _ целое число = 0 ; for ( int я знак равно число . длина () - 2 ; я >= 0 ; я -- ) { интервал сумма = 0 ; целая цифра = Символ . getNumericValue ( number . charAt ( i )); if ( i % 2 == число . length () % 2 ) { //справа налево каждая нечетная цифра цифра = цифра * 2 ; } сумма = цифра / 10 + цифра % 10 ; итог += сумма ; } общая сумма возврата % 10 != 0 ? 10 - всего % 10 == контрольная сумма : контрольная сумма == 0 ; }
Алгоритм Луна используется во множестве систем, в том числе: