我在一个小型设备(Cortex-M0/M3)上有一个引导加载程序。我想发布加密的固件更新,可以安装在设备上,使用引导加载程序。加密的全部目的是检验是否复制固件或安装未经授权的软件。该装置提供了一些反读保护的方法。
我在引导加载程序中存储了一组256位的密钥(k1,k2,k3.)。这组密钥可能因设备而异(许可证),每个密钥都与某种特性相关联。现在我要定义,引导加载程序需要哪些密钥来解密固件。例如: k1和k2或k2和k3。
我使用随机密钥(kr)和随机IV来使用AES/GCM加密和验证固件。对于每一个可以用来解密固件的密钥组合,我都要存储加密的随机密钥kr,该密钥是由xor‘’ing所需密钥构建的。
举上面的例子:如果我想在所有知道k1和k2或k2和k3的设备上安装固件,我会将E(k1 xor k2,kr)和E(k2 xor k3,kr)作为纯文本存储在加密的固件中。
现在,我有三个问题:上述方法听起来合理吗?我可以使用AES/ECB作为E加密组合密钥吗?我可以使用AES/CTR与相同的IV从AES/GCM加密固件?
发布于 2017-08-28 22:57:29
您的方法似乎有许多不必要的复杂性和局限性。例如,您必须预先决定功能和键之间的映射。以下是一些更简单、更具普遍性的方法:
每个引导加载程序都有一个密钥:让我们将此称为客户端密钥。然后,要将固件发送到特定的引导加载程序,可以使用该引导加载程序的客户端密钥对其进行加密/验证。
每个引导加载程序一个密钥,每个版本一个密钥:通过避免浪费地用不同的客户端密钥重新加密相同的固件,可以节省计算/带宽/存储。使用这种方法,您将为每个固件更新生成一个发布密钥,并使用发布密钥加密/验证固件,然后使用每个引导加载程序的客户端密钥加密/验证发布密钥(当然,只对希望安装此更新的引导加载程序进行加密/验证)。
一个主键:您也可以使用一个主键,并给每个引导加载程序一个唯一的ID。然后,当发布固件更新时,您可以包括列出允许安装它的引导加载程序ID的元数据。此元数据将与主密钥以及固件本身一起加密/验证。然后,引导加载程序的受信任部分在允许写入之前检查其ID是否在列表中。请注意,使用这种方法,如果有人设法通过反向工程读取主密钥,他们可以轻松地为所有引导程序大量生成更新,这是一种不存在于每个引导加载器只有一个键的方法中的特性。
要映射您的“特性”-based方法,可以考虑将引导加载器中的不同功能集映射到不同的in。因此,if不需要唯一标识每个设备,而只需要每个功能集(如果您需要的话)。
一个主公钥:就像上面的方法,但是使用公钥加密技术对固件更新进行签名。单个设备的中断将允许攻击者读取未来所有固件更新,但至少无法生成自制的更新。
https://crypto.stackexchange.com/questions/51164
复制相似问题