我计划为具有以下特征的嵌入式设备创建一个加密程序:
- 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 实现,我很想知道它。最后,如果您认为这毫无希望,请随时告诉我。