2010-06-03 28 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