您尚未登录。

楼主 # 2022-02-12 20:55:31

metro
会员
注册时间: 2019-03-09
已发帖子: 442
积分: 486

IEEE Std 1735与IP核的加解密流程

免责声明:本文所记载的内容仅涉及技术科普和探讨,与具体代码和实现方式无关,作者不会对破解等敏感问题进行回应,请悉知。

简介

IP核是在电路设计中不可或缺的组成部分。通常,IP核可以从FPGA厂商或专门的提供商获得。为了保护知识产权,这部分代码需要进行保护。
正如所猜测的那样,IP核的加解密工作是有专门的标准进行规范的,目的应该是保证各个EDA工具可以正确处理相关代码。这个标准也就是IEEE Std 1735,可以从这里获得标准的PDF文档。

总的来说,IP核的加解密算法和大家常用的算法其实区别不大,都是综合利用了非对称加密的安全性与对称加密的效率,是比较成熟的方案,可以很方面地使用市面上已有的加密库(比如OpenSSL cyrpto library,即libcrpyto)进行加解密。具体来说:

  • 非对称加密可以通过对公钥和私钥的区分来实现很高的安全性。EDA工具厂商可以将公钥分发给需要加密的第三方厂商,而将私钥通过各种手段隐藏在自身代码中(或者通过远程服务器进行解密),从而降低了密钥流出的风险。

  • 对称加密则用于对代码主体的加密。考虑到EDA工具对IP核的处理速度,这里可以使用更加高效的对称加密,典型的算法是AES。考虑到对称加密的加解密密钥是一致的,可以事先使用非对称加密对密钥进行处理,进一步提升安全性。

当然,以上提到的算法只是IP核加解密的一个重要环节,标准只能解决文本级别的加解密,目的主要是避免相关代码被直接暴露。这里还可以使用其它技术手段(如代码混淆)进行更深层次的加密,这对于隐藏具体实现方式和避免逆向设计来说更为有效。

以下文章主要探讨V1(也就是等级1)的加解密,V2可以参考上面给出的标准文档。

加密流程

在加密IP核的时候,我们需要准备好以下内容(session key的定义可以见后文):

  • 首先最重要的当然是RTL代码,目前在标准层面支持Verilog HDL和VHDL。

  • 非对称加密(用于加密session key)和对称加密(用于加密代码块)的算法需要给出,目前常用的分别是RSA(推荐大于等于2048位)和AES(128位或256位,CBC)。

  • 非对称加密使用的公钥,这部分通常由EDA工具或者代码加密工具提供。在加密时,可以同时使用多个公钥,工具将会为每个公钥生成对应的session key,这些公钥可以使用keyowner等字段区分。

  • 其实还有个不大明显的部分,就是如何从session key中得到对称加密使用的密钥。为了增强安全性,我们可以通过加盐等方式让session key和AES的密钥有一个特定的生成关系。我们定义相关的处理函数为f: x ↦ y,其中函数f并不要求可逆。

其中,session key是一个重要的部分,它可以保证对每个IP核都生成一个专门的密钥,这可以获得以下好处:

  • 每个IP核使用的session key都可以不同,从而提升了加密的有效性。

  • 不同的RSA公钥可以用来加密同一个session key并获得不同的结果,可以避免对同一个代码块进行重复多次加密,节省了文件的体积。

加密流程如下:

  1. 确定需要加密的文本部分,并将其填充到AES要求的整数倍字节(例如128位)。这里使用的填充算法应该是PKCS#7 padding,也是OpenSSL等工具默认的填充算法。

  2. 生成session key,并使用函数f将其处理为AES使用的密钥。为了保证AES密钥的强度,session key最好使用较长的位数,并且可以使用加盐等方式进一步提升强度。

  3. 代码加密工具读取RSA公钥,对session key进行加密,使用Base64编码以将二进制映射到ASCII字符,并将其写入到key_block中。

  4. 代码加密工具读取AES密钥,对代码主体进行加密,使用Base64编码以将二进制映射到ASCII字符,并将其写入到data_block中。

可以发现,上述流程中生成的key_blockdata_block是最重要的部分,分别记录了加密后的session key和代码块,而这些部分将会成为解密的关键。

解密流程

在解密IP核的时候,我们需要准备好以下内容:

  • key_block,记录了加密后的session key

  • data_block,记录了加密后的代码主体

  • RSA的私钥,这个是整个环节中隐蔽性最高的部分,一般EDA工具都会将其写入到代码的特定位置,使用时经过特殊处理获取,防止被直接泄露。

  • 在加密流程中定义的处理函数f

解密流程如下:

  1. 分别读取key_blockdata_block,并且使用Base64解码获取实际的二进制字符。

  2. 使用RSA私钥解密key_block,获得session key。

  3. 使用函数f将session key处理为AES使用的密钥。

  4. 使用AES解密data_block,并根据padding的数值去除padding部分,得到实际的代码块内容。

通过以上流程,我们就能从加密的IP核获得解密后的代码。在这其中,最重要的就是RSA和私钥和处理函数f,这两个部分需要在EDA工具中被重点保护。

总结

可以看到,IP核的加解密过程其实并不神秘,其安全性主要依赖于对RSA私钥和处理函数f的保护程度。当然,V2规范还提到了多种加密方式,这些方式也离不开非对称加密和对称加密的组合,有兴趣的读者可以自行研究。

最近编辑记录 metro (2022-02-13 00:27:12)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn