Pages

16/12/2025

Octopus check digit, Luhn algorithm

 



前言


上次說了 HKID Check Digit

今說 Octopus 八達通

它等於是 日本的西瓜卡、台灣的悠遊卡

原來八達通的check digit 也有 驗證公式 流出,海豚現在才知道


Octopus 八達通 Check Digit


使用類似 Luhn algorithm (盧恩算法)

  1. 將八達通 7~9 個號碼,不包括括號內數字。從右往左,單數位置乘1,雙數位置乘2,如果乘出來的結果是雙位數,則將個位數與十位數相加。
  2. 把全得數未全部加在一起
  3. 將結果 mod 10,即除10,取餘數,以10減去餘數,便是校驗位。如能整除沒有餘數,即校驗位為 0

海豚為驗證,買了兩張八達通



102012507 (0)

右至左數
單數位置:7, 5, 1, 2, 1
雙數位置:0, 2, 0, 0

單數位置:7, 5, 1, 2, 1
雙數位置x2 = :0, 4, 0, 0
如積(乘2後的結果)是雙位數,將個位與十位加總:在這例子沒有

全部相加:
7, 5, 1, 2, 1
0, 4, 0, 0
= 20
能被10 整除,所以 校驗位是0

102012508 (9)

右至左數
單數位置:8, 5, 1, 2, 1
雙數位置:0, 2, 0, 0

單數位置:8, 5, 1, 2, 1
雙數位置x2 = :0, 4, 0, 0
如積(乘2後的結果)是雙位數,將個位與十位加總:在這例子沒有

全部相加:
8, 5, 1, 2, 1
0, 4, 0, 0
= 21
mod 10 結果是 1 ,10-1 = 9,所以 校驗位是9

VISA、MasterCard Check Digit


VISA、MasterCard 信用卡最後個號碼都可以用類似方式計算,從右至左起算,不過單數位置乘2,雙數位置乘1

信用卡沒法去買,海豚拿一些已經取消了的信用卡號碼作試範

Citi VISA 4791-1050-0227-7921

單數位置︰2, 7, 2, 0, 5, 1, 9, 4
雙數位置︰9, 7, 2, 0, 0, 1, 7

單數位置x2 =︰4, 14, 4, 0, 10, 2, 18, 8
如積(乘2後的結果)是雙位數,將個位與十位加總:4, 5, 4, 0, 1, 2, 9, 8

全部相加:
將個位與十位加總:4, 5, 4, 0, 1, 2, 9, 8
雙數位置︰9, 7, 2, 0, 0, 1, 7
= 59

59 mod 10 = 9,10-9 = 1,所以 校驗位是1

DBS Compass VISA 4518-3545-2695-4001

單數位置︰0, 4, 9, 2, 4, 3, 1, 4
雙數位置︰0, 5, 6, 5, 5, 8, 5

單數位置x2 =︰0, 8, 18, 4, 8, 6, 2, 8
如積(乘2後的結果)是雙位數,將個位與十位加總:0, 8, 9, 4, 8, 6, 2, 8

全部相加:
將個位與十位加總:0, 8, 9, 4, 8, 6, 2, 8
雙數位置︰0, 5, 6, 5, 5, 8, 5

= 79

79 mod 10 = 9,10-9 = 1,所以 校驗位是1

後記


難怪有些系統很快便知道輸入錯 VISA / MASTER,雖然最終到了支付API 也會知道是錯。

但client side已經知道錯,可報錯給user,不給去下一步支付,變相令回饋更順更快

Reference

銀行閑閑談 #276 — 在天津遇上百年滙豐

八達通最後括號入面個數係咪有得計?

No comments:

Post a Comment