嵌入式设备上的 AES 加密:这可以安全吗?

信息安全 AES 随机的 嵌入式系统
2021-09-08 05:57:23

我计划为具有以下特征的嵌入式设备创建一个加密程序:

  • CPU 与 Intel 80186 兼容 @ ~20 MHz
  • 128 KB RAM,其中约 20 KB 可用于加密
  • 应用程序二进制大小限制为 128 KB,但我想保持加密部分 < 16 KB
  • 闪存中的持久存储

这些是要求:

  • 加密小于 32 KB 的小文本文件和位图
  • 我总是可以将整个文件解密到 RAM,即我不需要随机访问
  • 加密文件不会被硬件“锁定”,即它们可以随时传输到 PC,所以我想防止有人窃取设备并试图解密数据
  • 我不担心软件漏洞、键盘记录器等(假设我从不将设备借给任何人并在晚上将其放在枕头下,并且还假设 NSA 不会闯入我的房子给我氯仿并安装有针对性的漏洞)

我远非加密专家,但我花了一些时间阅读有关 AES、分组密码模式和密钥派生算法的 Wikipedia,并且我还阅读了“如果您将字母 AES 输入到您的代码中,您正在这样做错”这一切都让我怀疑我是否能成功,考虑到硬件的限制和我对该主题的肤浅知识,但我会尝试。

以下步骤列出了我计划做的事情:

  • 我计划遵循此响应中列出的基本程序,即:在 CBC 模式下使用 AES 加密、使用 PBKDF2 导出密钥、随机盐、随机 IV。
  • 因为我更喜欢 AES-256 而不是 AES-128,所以我会将 PBKDF2 与 SHA-512 一起使用,这样我就可以导出一个双倍长度的密钥。
  • 嵌入式设备上没有可靠的随机数源,所以我的计划是让用户在 PC 上生成随机密钥 (k1) 并将其传输(可能通过手动输入)。这应该不是问题,因为它只发生一次,即我使用相同的密钥 (k1) 来加密任意数量的文件。
  • 剧本/文章“如果你在代码中输入字母 AES,你做错了”指出了控制加密过程的攻击者的危险,即谁可以提供任意明文并将其加密,因为这会启用各种侧信道攻击,例如“错误预言机”。我是否可以假设这对我来说不是问题,因为攻击者只能看到我的加密文件?
  • 我的理解是,我应该为每个单独的加密生成一个随机 IV 和盐,以避免相同明文的相同结果。但是 IV 和 salt 是否必须是加密的强随机数?我能做的最好的事情是使用 hash(concat(time, battery voltage)); 播种的 Mersenne Twister(或者最好是更高效的);但这有必要吗?无论如何,我都以明文形式存储 IV 和 salt,所以我只需要确保它们每次都不同,而不用担心它们的可预测性。
  • 我计划使用此实现此处链接的实现之一,当然是在使用 NIST 测试向量验证它们之后。选择实现时,我还必须检查其他什么吗?

如果有评论告诉我哪些部分是错误的、不安全的或应该改进的,我将不胜感激。此外,如果英特尔 80186 有一个受信任的 AES-256 实现,我很想知道它。最后,如果您认为这毫无希望,请随时告诉我。

2个回答

您没有为此指定用例,因此很难理解这些限制,以及这是否“安全”。

您没有提到使用 HMAC,但我假设您知道在某些应用程序下需要使用 HMAC。

您想使用 AES-256 而不是 AES-128,但不要指定原因。AES-256 需要 14 轮,而 AES-128 只需要 10 轮,因此 AES-128 速度要快得多,这在您处理的非常有限的环境(例如 16 位字)中可能很重要。AES-128 已经非常安全了,更大的密钥空间几乎不会提供任何额外的安全性,特别是如果您使用的用户键入的密码几乎没有完整的 128 位熵。

IV 不需要是不可预测的(无论如何,任何攻击者都必须知道 IV)。关于 IV 唯一重要的是它不会被重复使用。就个人而言,我会使用一个随机种子,每次加密新文件时都会对其进行哈希处理,并将结果保存回随机哈希值。下一个 IV 将始终是可预测的,但如果有足够的初始熵将永远不会被重复使用,即使是在所有设备上全局使用也是如此。

该方案的安全性完全取决于攻击者能够读取的内容。请记住,嵌入式设备正在执行解密,因此它显然具有执行此操作所需的所有部分(加密数据、密钥和算法)

  • 如果攻击者与系统有任何类型的调试连接(例如 JTAG)——Game Over(立即且毫不费力地)。攻击者只能从 RAM 中读取解密的内容。

  • 如果他只能读取您的数据文件,而您的 AES 密钥就是其中之一——Game Over。

  • 如果他只能读取您的数据文件,并且您的 AES 密钥嵌入在单独内存中的代码中 - 好的(也许)。

  • 如果他可以同时读取数据文件和代码内存,并且 AES 密钥存储在代码中——Game Over。攻击者甚至不需要对密钥进行逆向工程,他只需执行代码并将解密的内容转储到内存中即可。找到能够执行 x86 代码的虚拟环境是微不足道的。

  • 如果他可以同时读取数据文件和代码存储器,但代码从专为防篡改密钥保护而设计的片上安全存储器中提取 AES 密钥——应该没问题。除非攻击者可以使微控制器执行修改后的代码并从微控制器内存中复制解密数据。

  • 如果他可以读取数据文件,并且 AES 密钥存储在安全内存中,但该内存不是片上的——不好。攻击者可以窃取在安全存储和处理器内核之间传输的密钥。比纯软件攻击更困难,但仍然不安全。

基本上,代码和片外数据的保护需要设计有熔断器的芯片来烧毁调试接口,存储在芯片上的代码,所有外部访问都被相同的熔断器拒绝,加密数据,以及板载防篡改密钥存储。80186 时代的芯片不太可能具有这些功能(尤其是后者),尽管基于内存大小和时钟速度,这是一个现代的 80186 克隆可能。