最近更新: 2023-10-23

電子發票列印功能尋寶大冒險

有個客戶最近向財政部申請電子發票服務,問我能不能幫他們的 POS 系統加上列印電子發票的功能。 技術上不難,但向公家機關打交道的事,規格才是最重要的。 總之看看「財政部電子發票證明聯一維及二維條碼規格說明」。 但我萬萬沒想到這種公開規格的事,竟然可以搞成尋寶大冒險遊戲。

電子發票上面有兩個 QRCode ,其中左邊那個組成的文字中,有一段經過加密的文字內容。 這東西在「財政部電子發票證明聯一維及二維條碼規格說明」有一章講怎麼加密。

8.加密驗證資訊 (24):將發票字軌號碼 10 碼及隨機碼 4 碼以字串方式合併後使用AES 加密並採用 Base64 編碼轉換,AES 所採用之金鑰產生方式請參考第叁、肆章及「加解密 API 使用說明書」。

第三章附上一張作業流程圖:

QRCode加密元件申請流程

根據我所知的 AES 加密方法概念,這段說明好像少了什麼東西。 大概是用語不一樣吧。 總之先找到那個「AES金鑰產生工具」拿金鑰吧。

靠北,電子發票整合平台的網頁點來點去,找不到啊。 Google 救我!!

原來不叫「AES金鑰產生工具」,叫「電子發票QRCode加解密工具」。 工具下載過程:

開啟「財政部電子發票整合平台」 -> (看中間那一排用戶種類) 點「營業人」 -> (找頁面右邊的快速上手區域) 點「營業人文件下載」 -> (搜尋) 電子發票QRCode加解密工具。

下載回來是一個 zip 檔。解開後,找到子目錄「加解密工具/tool/genKey.sh」(Windows找getKey.bat)。 執行它,輸入密碼種子,它就會回報 Key。

等等,就這樣? AES 加密不是要 Key 加 IV 配合嗎? 難怪我一直看不懂規格文件的說明,原來我知道的 AES 加密方法概念是錯的… 才怪啊。

我又回去看規格文件,從第一頁看到最後一頁,「正文」沒提到 AES 加密的 IV 。 心一狠,直接搜尋「IV」這個關鍵字。 喔,有耶,在「參考用原始碼」的範例程式裡面,還 TMD 沒縮排格式。

找找IV在哪裡

就算這樣,這只是「參考用」的範例吧。難道正式的 IV 也是這個?

問問 Bing AI。它也不知道。

Bing AI回答

又上網查了查。似乎每個人都碰到這問題,而每個人也都在半信半疑的情況下,用這個 IV 。 如果你是 C# 或 Java 開發者倒還好,直接用財政部提供的元件。 IV 就編譯在裡面了。

到底是哪個天才把這個應該正式說明的關鍵要素,藏在沒有縮排格式化的範例程式碼裡面。