2010-06-03 50 views
3

有關鍵自足的算法 - 尤其是密碼學相關的,如AES,RSA,SHA1等等 - 你可以找到的許多實現免費上網。超空間優化的代碼

一些寫是好的和便攜乾淨C.

一些被寫入要快 - 往往與宏和明確的展開。

據我所知,沒有試圖要特別超小 - 所以我辭職,寫我自己 - 明確AES128解密和SHA1爲ARM的Thumb2。 (我已經編譯所有我能找到我的目標機器與-Os GCC和-mthumb和這樣的驗證)

我可以用什麼方式和技巧來做到這一點?

是否有編譯器/工具,可以捲起的代碼?

回答

2

這取決於你正在設法優化什麼樣的空間:代碼或數據。通常使用的AES128基本上有三種不同的版本,每種版本的預計算查找表空間的數量都不相同。

  • 最快版本使用4k排列爲四個32位x 256條目查找表(通常稱爲T表)。如果你能承受這麼多的數據空間,那麼這個版本中唯一的指令就是結合表結果的EOR,這些將會彙集成一小段代碼。
  • 中間版本使用8位x 256條目查找表來編碼SBox。剩餘指令需要實現移位行和混合列步驟,因此代碼大小更大。
  • 最小的(數據大小)版本根本不使用任何查找表,但需要計算包括反轉在內的所有單個AES字段操作。這將使用大多數指令,即使您將字段乘法和反轉都摺疊爲子例程。
4

在優化空間(或速度)之前:編譯器最近很聰明,如果正常,可讀的aes128實現足夠小以滿足您的需求,如果您告訴編譯器優化空間,您是否嘗試過?

要去寫自己的aes128版本也許是一件好的教育工作,但是你肯定會爲錯誤而戰,而密碼學並不是那種無足輕重的東西。和錯誤或弱(由於您的實施的一些錯誤)幾乎是最糟糕的情況下,你可以有。

,因爲你是靶向ARM和gcc是作爲該平臺的編譯器很常見:

-Os Optimize for size. 

    -Os enables all -O2 optimizations that do not typically 
     increase code size. It also performs further optimizations 
     designed to reduce code size. 
+0

好一點,是的,我已經編譯幾乎每一個AES實現我能找到我的目標架構和測量功能尺寸的照顧。我得到的最緊密的是2.4KB,許多實現超過5KB。最緊張的仍然是宏觀展開... SHA1是同樣的故事 - 最緊張的是1.7KB,「快速」的是7或8KB。我想要更小一些,但需要耗費運行時間。 – Will 2010-06-03 09:25:58

+0

你有沒有嘗試過另一個編譯器(想到clang.llvm.org)? – akira 2010-06-03 10:12:28