Luhnアルゴリズムでクレジットカードの番号をチェック
クレジットカードの番号はLuhnアルゴリズムというチェックサム方式が使われていることを知りました。
Luhnアルゴリズムは、様々な識別番号の認証に使われている単純なチェックサム方式。MOD-10アルゴリズムとも。クレジットカード番号、IMEI番号、National Provider Identification(アメリカでの医療機関の識別番号)、Social Insurance Number(カナダの社会保険番号)などで使われている。IBMの科学者 Hans Peter Luhn が1954年1月6日に特許を申請し、1960年8月23日に発効した]\。
このアルゴリズムはパブリックドメインとされており、今日では広く利用されている。ISO/IEC 7812-1 に詳細に記されている。暗号学的ハッシュ関数としては使えない。記入ミスなどを検出するためのもので、悪意ある攻撃を防ぐものではない。多くのクレジットカードや各国政府が発行する識別番号で、ランダムな数値群から正しい番号を区別する単純な手法としてこのアルゴリズムを使っている。
Luhnアルゴリズム - Wikipedia
wikipediaにはpythonのサンプルコードまで載ってます。
def check_number(digits): _sum = 0 alt = False for d in reversed(digits): assert 0 <= d <= 9 if alt: d *= 2 if d > 9: d -= 9 _sum += d alt = not alt return (_sum % 10) == 0
こちらで紹介されている番号を調べてみるとちゃんと全部Trueになりました。
ECサイトの動作テストに使える、クレジットカードのテスト番号一覧 | Webクリエイターボックス
print all([check_number([int(c) for c in number]) for number in ['5555555555554444', '5105105105105100', '4111111111111111', '4012888888881881', '3530111333300000', '3566002020360505', '30569309025904', '38520000023237', '378282246310005', '371449635398431', '378734493671000', '6011111111111117', '6011000990139424']]) => True