Protocol-Design
如何加密票證上的數字數據
我有一個客戶,其現有票務系統可為劇院、電影、足球等活動生成門票。
每張票中的資訊以 16 位十進制數字字元串編碼。該資訊包含事件日期、事件標識符、座位排、座位號等的固定位置。該系統在每張票上都有一個數字條碼,可容納 20 位十進制數字。(https://en.wikipedia.org/wiki/Interleaved_2_of_5)
主要問題是攻擊者很容易生成帶有有效條碼的假票。
我的客戶現在想要對條碼中的資訊進行加密,以便更難生成假票。
要求如下:
- 明文是一個 16 位十進制數字 (0-9) 的字元串。
- 密文是一個 20 位十進制數字 (0-9) 的字元串。
- 連續票號可能僅在明文中的一位數字位置不同,連續票的密文仍然必須完全不同。
- 即使您可以訪問許多有效票證,也應該無法計算加密密鑰。
- 某個事件的所有門票的加密密鑰都是相同的。
- 對手很難生成有效的票號,尤其是對於特定事件。
- 用於驗證票的條碼閱讀器應該完全離線工作 - 條碼閱讀器不可能有一個完整的有效票號數據庫。
- 注意,解密後的 20 位加密條碼必須包含完整的 16 位明文。這意味著我們只有 4 位雜湊的空間。
在這種情況下我們應該使用什麼樣的加密和身份驗證?在我看來,主要問題是條碼中的空間非常有限,所以我們不能使用真正的 HMAC。
有什麼建議麼?
鑑於我們只能添加 4 位(13.3 位)冗餘,因此無法使用非對稱加密。我們必須在驗證終端中使用密鑰。
這是Format Preserving Encryption的應用程序。它可以像塊密碼一樣工作,除了我們可以決定塊的寬度,並處理十進製而不是二進製或十六進制數字。FPE 的方法在NIST SP 800-38G中給出。上一個連結指向其他方法的引用。
取 16 位明文,附加四個零,產生 20 位數字。使用 FPE 加密,產生 20 位數字,將其放在票證上。
在讀取票證時,檢查它是否為 20 位數字,按 FPE 解密(產生 20 位數字),並在以四個零結尾時認為結果有效;刪除這些。