2012年3月31日 星期六

教你創作信用卡號碼

此信用卡號碼純屬虛構,如有雷同,請自行善後。

4921 1101 1234 5678

是不是一個正確的信用卡號碼?不需問銀行,可自行驗證。

每張信用卡最尾一位數字,其實是個「保險碼」(check digit),與前面十五位數字有些特定關係,不能亂作。這是一種防錯措施,萬一用戶打錯或說錯某些數字,破壞了保險碼跟前面十五位數字的應有關係,電腦能夠立即察覺。保險碼怎樣計算?上述信用卡的保險碼(8)正確嗎?

第一步:由左起,第一位數字乘二,第三位數字乘二,第五位數字乘二……總之單位數字便乘二;
第二步:逐個 digit 加起來(十或以上之數應拆開為兩個單位數,然後相加),以上述號碼為例:(8)+9+(4)+1+(2)+1+(0)+1+(2)+2+(6)+4+(1+0)+6+(1+4) = 52;
第三步:52 + ? = 10 的倍數,答案是 8 -- 這就是保險碼。

所以,上述信用卡號碼是「成立」的,有可能出現的;有沒有銀行發這個號碼,有沒有人願意用這個號碼,則另作別論。

我願意用這個號碼。假設我問你借錢,把信用卡號碼電郵給你;為了防止中途被人偷看,我用預先跟你約定的密碼加密,使郵件內容變成一堆外人不知所云的「垃圾」:&%AG%$@#^?*><!~#*F&W%

你收到電郵,用我們預先約定的密碼解密,得回號碼:4921 0111 1234 5678。核實保險碼無誤,你存錢入戶口,暗嘆倒霉,決定這是最後一次借錢給我。

幾天後,我致電給你,說我收不到錢。你火冒三丈,罵我騙子,我罵你無口齒無義氣,你我從此絕交。

我在說謊嗎?錢去了哪裏?

細心的讀者會發覺,解密後的信用卡號碼其實是錯的,「0」和「1」換了位置,不是雙方誤會了密碼,而是電郵傳送途中,有人惡作劇竄改了郵件;他們雖然不知道密碼,未能偷看內容,但可以對訊息「加鹽加醋」,不知改了什麼,總之是改了。給竄改過的地方,恰好解密後調換了「0」和「1」,更湊巧的是,這樣調換並不影響保險碼,保險碼仍然是「8」,整個號碼還是「成立」的,收件人不虞有詐。

由此可見,保險碼雖有某程度的防錯功能,但絕非滴水不漏;它實在太容易「撞」,任何十五位數字不難得出同一保險碼;知道保險碼,亦不難推敲多個「成立」的信用卡號碼;因此,網上購物的時候,除了提供信用卡號碼,還需填寫卡主姓名、到期日等額外資料,因為保險碼實在不夠「保險」,防錯防冒的功能實在太弱。

上面的故事還有另一個教訓,網絡上傳送敏感資料,加密是不足夠的,還需一些方法確保訊息不曾被竄改。我們不妨把保險碼的概念擴闊,看看互聯網怎樣做。

信用卡前十五位數字可視為企圖傳達的內容,實際上可以是一句說話、一個檔案、一幀照片、一齣電影、一首歌,任何你想傳達的資訊。緊隨其後的保險碼可視為一段「撮要」,根據前面的資訊「消化」而來的;為了保障溝通的安全性,「消化」過程必須符合幾個條件:(一)無法從「撮要」推敲原來訊息;(二)很難創作另一條「消化」出同一「撮要」的訊息;(三)不同訊息「消化」出同一「撮要」的機會微乎其微。(信用卡保險碼其實是「撮要」的一種,其計算過程就是一種「消化」,只不過三個條件都不符合,是一種非常不安全的「消化」程序,不能用於傳遞敏感訊息。)

互聯網興起十多年,網上交易早已十分蓬勃,一個安全的「消化」程序是不可或缺的。現時的「消化」程序仍然穩固,但網絡安全就像說話人和竊聽者的軍備競賽,必須時刻未雨綢繆,否則一被破解便手足無措。美國 NIST(National Institute of Standards and Technology)為此舉辦了一個比賽,徵集下一代的「消化」程式;參賽程式經過世界各地專家「評頭品足」和幾輪淘汰,現在餘下五個方案。就在香港特首選舉投票之前的週四和週五,美國首都華盛頓舉行了一次會議,商討它們的優劣,得勝者將在今年稍後公布,並會成為下一代「消化」程式的標準。

(2012 年 3 月 31 日 信報副刋)

1 則留言: