2011年10月17日 星期一

簡單的加密編碼

上回有新聞提到關於悠遊卡被破解的新聞,說真的...該工程師也蠻瞎的。

以悠遊卡這一種儲值加密絕對不可能只有加密在卡本身上面而已。

這一種東西一定是加密在整個系統端,包括在發卡公司的主機系統內,

當您拿著一張有固定的ID 的悠遊卡時,相對應的主機系統端也一定有同樣同步的

該ID 悠遊卡的相關一切資料...每一次的交易或儲值動作也都會回到系統主機端作

同步確認的動作...所以,簡單來說:如果真的要突破悠遊卡的加密,您就得直接侵入

系統主機端才有機會,否則,您光改悠遊卡的資料內容,系統主機端是寧願把您

不同步的資料內容視為有"危害性"或是"惡意"的資料毀損...先把您當壞人,再來作對策的。

---

當然啊,我相信以該工程師來說:或許只是想挑戰一下本身的技術成熟度而已。

但是我還是要講一句話...畢竟能像賈伯斯那麼優秀天才型的不多,而其實他的成功

是因為他背後還是有一群優秀的工程師與工程團隊的。所以,賈伯斯可以不用念大學。

他可以說服那些優秀的工程師們幫他實現他心目中的產品雛形...這是他厲害的地方。

但對於我們這些平庸的工程師來說:平時還是得多用功念一點書比較實際一點。

就像有多人或許在許多實務操作上有很好的實務經驗,譬如我說的:

寫寫程式,控制一些簡單的 I/O ...當然沒啥多大問題。但是當您碰到真的難解的問題時,

您就會發現:還是要多讀一點理論、或是多念一點書比較重要的。

就像我之前提到的那個A/D 轉換公式...或是您想作一個類似那個音量表(等化器)的東西。

不好意思,這個東西就是有其一定的理論基礎,您從來不知道什麼是:FFT ,

那您怎麼會知道如何處理那些數位信號呢?!

----

好了...我記得以前林老師有寫過一篇關於單晶片微控器的諜對諜保密觀念

(在網路上,我已經找不到相關文章內容了!)。

說真的,這一種加密或編碼技術一大堆。讀也讀不完...我們自己在用的系統

也沒有像悠遊卡或是銀行金融卡這麼偉大或價值,所以也不要花太多功夫去搞這些。

當然啊,系統加入加密功能之後,也一定會佔去一定的系統資源。

我們在單晶片MCU 也不適合搞一個龐大的加密運算演算法。

適度的加密也只是防君子,也防不了小人。就看您自己的需求...

---

好了,因為現在有許多系統的分析儀器,譬如USB 分析儀都可以很容易可以

看到我們在系統應用上的資料傳輸內容,用邏輯分析儀也可以讀到I2C 或是

SPI 介面的內容...那我們該如何簡單的作一個加密傳輸機制呢?!

其實最簡單的方法就有點類似CRC 的運算方法。

譬如:我們原本要傳輸一組數據為 0x1234 ...

很簡單,我們只要對於此 0x1234 對於一組種子數字作XOR 的運算就可以了。

而這一組數字就像一般CRC 方程式,譬如:x^6+x^3+x^2+1 = B01001101 = 0x4D。

您高興也可以用16 位元...譬如: 0x5A69...

在您傳輸之前,先利用此數字作加密運算: 0x1234 XOR 0x5A69 = 0x485D。

所以,您明明要傳0x1234 ...卻是傳出0x485D。

然後在接收端,因為您知道您的加密種子數字為 0x5A69 。

所以再作一次XOR 就可以還原原來真實數字: 0x485D XOR 0x5A69  = 0x1234 。

因為一般單晶片MCU ,譬如8051 也都支援XOR 運算指令或是一般C 語言

也都有XOR 運算子。所以也都不會浪費太多的運算資源,就可以達到加密效果。

----

以前我們在作系統的保護機制時,譬如系統開機(BOOT)時,會先對一組硬體ID送出

加密密碼數字(譬如用I2C 或是SPI介面)...然後,要求加密硬體IC 要回傳一組正確的

加密數字...就可以達到一定的加密效果,當然啊,當您這一組數據是64 Bytes ...

甚至是 128 或是 512 Bytes 這麼一大串位元數字時。破解的機率就相對會變低了。

或許,您可以試試這一種方法,只是我說了:加密技術本身就是一門學問,

沒有人敢說哪一種方法最安全?!我們只是提供一個既簡單又容易上手的方法而已。

也希望您也可以用得到。謝謝!

沒有留言:

張貼留言