超空间优化代码

时间:2010-06-03 09:10:03

标签: optimization arm encryption

有一些关键的自包含算法 - 特别是与加密相关的算法,如AES,RSA,SHA1等 - 您可以在互联网上找到许多免费的实现。

有些写得很好,便携干净。

有些是快速编写的 - 通常使用宏,并显式展开。

据我所知,没有人试图特别超小 - 所以我不得不写自己的 - 明确的AES128解密和SHA THUMB2的SHA1。 (我已通过编译所有我可以找到的所有我可以找到的GCC与-Os和-mthumb等目标机器验证)

我可以使用哪些模式和技巧来做到这一点?

是否有可以汇总代码的编译器/工具?

2 个答案:

答案 0 :(得分:4)

在优化空间(或速度)之前:编译器现在非常聪明,如果你告诉编译器优化空间,你是否尝试过aes128的正常,可读的实现足够小以满足你的需求?

去编写你自己的版本的aes128可能是一个很好的教育事物,但你肯定会为bug而斗争,而密码学并不是那种愚蠢的东西。 <错误或弱(由于你的实施的一些错误)是你可以有的更糟糕的情况。

因为你的目标是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.

答案 1 :(得分:2)

这取决于您尝试优化的空间类型:代码或数据。通常使用的AES128基本上有三种变体,每种变体的预计算查找表空间的数量不同。

  • 最快版本使用4k排列为四个32位x 256条目查找表(通常称为T表)。如果你能负担得起这么多的数据空间,那么这个版本中唯一的指令是组合表结果的EOR,这些指令将汇总成一小段代码。
  • 中间版本使用8位x 256条目查找表对SBox进行编码。剩余指令需要实现移位行和混合列步骤,以便代码大小更大。
  • 最小(数据大小)版本根本不使用任何查找表,但需要计算所有单独的AES字段操作,包括反转。这将使用最多的指令,即使您将字段乘法和反演都折叠为子例程。