![見出し画像](https://assets.st-note.com/production/uploads/images/86508752/rectangle_large_type_2_b737dfaaed1ef8991188d32bc41357e6.png?width=1200)
【違法?!】クレジットカードをハックする。
LuhnアルゴリズムをJavaScriptで作成する。 実際にクレジット番号を設定し、正しい番号であればtrueを返し、正しくなければfalseを返すシンプルな仕様としている。
コードは以下の通り。
<script>
const creditCheck = num => {
let ary = (num + '').split('').reverse().map(x => parseInt(x));
let lDigit = ary.splice(0, 1)[0];
let sum = ary.reduce((acc, val, i) => (i % 2 !== 0 ? acc + val : acc + ((val * 2) % 9) || 9), 0);
sum += lDigit;
return sum % 10 === 0;
}
console.log('check', creditCheck('1111222233334444'));
</script>
一般的な16ケタのクレジットカード番号では、最初の15ケタはそれを発行する銀行が決めている。が、最後の1ケタは「チェック・デジット」と呼ばれ、前の15ケタに基いて数学的に決まる。
このチェック・デジットをカードの持ち主が自分で選ぶことはできない。それを決定する式を作り出したのはハンス・ペーター・ルーン、1954年当時IBMの研究者であった。このアルゴリズムは当初は特許化されていたが、今では世界標準ISO/IEC 7812-1としてパブリックドメインとなっている。
チェック・デジットを単体で見ただけでは、クレジットカード番号が間違って入力された場合でも間違いを検知できない。仮にチェック・デジットを当てずっぽうで入力しても、10回に1回は当たりになるからだ。が、ルーンのアルゴリズムに基いて数字列全体を見れば、9と6を入れ替えてしまうといった間違いがひとつあるだけでもそれを検知できる。また、隣り合うふたつの数字の順序の間違いも、ほぼすべての数の組み合わせ(09と90の間違いなどいくつかは不可能)において検知できる。これらの間違いはカード番号を書き込むときによく見られるもので、チェック・デジットがその検知に役だっている。
この記事が気に入ったらサポートをしてみませんか?