FPGA开发技能(7)Vivado设置bit文件加密

文章目录
- 前言
- 1. AES加密原理
- 2.xilinx的AES方案
- 3.加密流程
- 3.1生成加密的bit流
- 3.2将密钥写入eFUSE寄存器
- 4.验证结论
- 5.传送门
前言
在FPGA的项目发布的时候需要考虑项目工程加密的问题,一方面防止自己的心血被盗,另一方面也保护公司资产,保护知识产权。Xilinx的器件大概有两种加密方案,一种是本文介绍的AES加密算法,另一种则是利用multiboot配置和Device DNA,其大概是流程是,xilinx提供了读取Device DNA的原语,用户逻辑通过原语读取Device DNA然后与用户逻辑的加密模块做运算得到一个数字串,将该数字串与存放在Flash特定区域的密文做对比,如果一致证明该FPGA通过授权可以启动用户逻辑,如果失败则可设置不启动。存放在Flash特定区域的密文也是通过Device DNA与用户逻辑中的加密算法提前计算得到的。因为Flash不仅要存储密文还要存储bit流,因此需要用到multiboot配置。Xilinx7系列支持AES256加密算法,可以防止程序回读和逆向,杜绝用抄板的方式窃取劳动成果。 本文介绍AES加密算法的原理,加密操作的流程以及加密的作用。
1. AES加密原理
AES加密算法是一种对称加密算法,用于保证私密信息不被泄露,对称是指加密法和解密方使用的密钥是一致的。AES的Key支持三种长度:AES128,AES192,AES256 。xilinx采用AES256,使用密码块链接模式(Cipher Block Chaining mode,CBC mode)(AES有五种模式CBC是其中的一种)。 AES256的加密原理是把明文按照256bit拆分成若干个明文块,如果最后有数据不足256bit按照一定的方式来填充最后一个明文块。每一个明文块利用AES加密器和密钥,加密成密文块。拼接所有的密文块,成为最终的密文结果。从图中可以看出,CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。由下图可以看到,实现AES256加密算法需要提供密钥、初始向量IV以及256bit-HMAC。HMAC是为了避免bit被篡改,HMAC(Hash-based Message Authentication Code,基于散列函数的消息认证码)是一种用于验证数据完整性和真实性的认证方法。它通过将数据与密钥进行散列处理,生成固定长度的认证码,然后将认证码与数据一起发送给接收方。接收方在接收到数据后使用相同的密钥和散列函数进行计算,然后比较生成的认证码是否一致,从而可以判断数据是否被篡改或伪造。HMAC认证可以有效防止数据在传输过程中被篡改或伪造,以确保数据的完整性和真实性。

2.xilinx的AES方案
以上介绍的是AES加密算法本身的原理,xilinx是如何利用这个加密算法的呢?
Xilinx可通过JTAG接口将用户指定的密钥(或者软件生成的,这里包括上一节提到的三个密钥)写入eFUSE寄存器(采用熔断丝技术一生只能写一次,且写且珍惜~),同时Vivado工具负责根据用户指定的密钥对bit流进行 AES加密。FPGA在加载加密后的bit流时,会根据用户设置的密钥通过片上的 AES解密逻辑电路进行 AES解密,从而还原得到器件可以识别的未加密bit流,从而被正确加载。具体的操作流程见下一节。
此外,Xilinx提供了几个寄存器配置选项,提供灵活的加密配置。如下图所示,7系列查看UG470,KU系列查看UG570,操作时按照下文推荐配置即可。需要注意eFUSE Control Register的CFG_AES_Only,如果该位被设置为1,则FPGA上电之后将强制进行解密操作,一旦bit流没有设置密钥或者密钥不正确,将不会被加载,因此一定慎用该寄存器,否则一旦密钥丢失,FPGA将变成废铁。

3.加密流程
3.1生成加密的bit流
①打开“Open Elaborated Design”,此时在“Generate Bitstream”右键才会出现下图中蓝色字体“Configure additional bitstream settings”,单击它

②设置使能bit流加密,设置选择密钥存储位置为EFUSE。这里可以手动指定三个密钥的值,这个选择不指定即不填写任何东西,软件工具将会自动生成。

③设置回读配置为LEVEL1即禁止回读。此处要注意,并不是禁止从Flash里面回读,也就是说通过JTAG接口在hardware manager中选择flash器件点击右键选择readback configuration memory device依然可以回读,这里是告诉配置工具在 FPGA 配置完成后不要自动读取配置数据进行校验。

④上述配置完成之后一定在Elaborated Design界面点击保存或者ctrl+s配置才能生效,保存后会发现xdc文件中多了两句话,然后重新生成bit流,在与bit文件同级的文件夹中将会出现与bit流同名但后缀是nky的文件,这就是软件自动生成的密钥文件。现在生成mcs文件并烧写进FPGA发现FPGA不会启动,这是因为FPGA内部还没有密钥,需要进行下一节的操作。

3.2将密钥写入eFUSE寄存器
①打开vivado软件,连接JTAG并上电,打开Open Hardware Manager,进入Hardware界面,点击Auto Connect。在芯片名字上右键,选择Program eFUSE Registers。

②勾选Enable AES key programming,选择上一节生成的后缀为nky的文件,然后选择next。

③勾选Enable control register programming,接着按照如图所示勾选,此处千万不能勾选出错,否则造成严重后果!然后点击next。

④最后一页无需勾选,按照默认next即可,最后单击finish。导出的后缀nkz的文件将记录eFUSE的密钥信息和相关寄存器的配置信息。

4.验证结论
准备两块一摸一样的板卡A和B,制作一个简单的测试程序。
①在A板卡上配置了eFUSE寄存器,并将密钥写入eFUSE寄存器,此时烧写不加密的bit文件或者mcs文件,都是可以正常工作,并且回读A中的MCS文件烧写到B,B可以正常工作。
②在A板卡按照上述第三节配置,配置了eFUSE寄存器,写入密钥,并设置禁止回读,发现仍然可以回读,证明xdc中设置的禁止回读并不是禁止从flash读回mcs文件。
③给A板卡写入密钥1,并将工程用密钥1生成bit流,此时回读工程写入B板卡,B板卡无法完成FPGA代码加载。这里可以看出加密的最重要的作用就是禁止回读后逆向。同样如果给B写入的密钥不是密钥1,那么显然B还是无法加载。
④给A板卡在不写入密钥的情况下烧写加密的bit文件,FPGA无法完成加载。
5.传送门
- 我的主页
- FPGA开发必备技能专栏汇总导航
- 上一篇:FPGA开发技能(6)Qt生成ROM IP核使用的COE文件
| END |
💎文章原创,首发于CSDN论坛。
💎欢迎点赞💖收藏✨打赏💷!
💎欢迎评论区🎤或私信指出错误🎤,🗣️提出宝贵意见或疑问。
相关文章:
FPGA开发技能(7)Vivado设置bit文件加密
文章目录 前言1. AES加密原理2.xilinx的AES方案3.加密流程3.1生成加密的bit流3.2将密钥写入eFUSE寄存器 4.验证结论5.传送门 前言 在FPGA的项目发布的时候需要考虑项目工程加密的问题,一方面防止自己的心血被盗,另一方面也保护公司资产,保护知…...
【算法专题--链表】旋转链表 -- 高频面试题(图文详解,小白一看就懂!!)
目录 一、前言 二、题目描述 三、解题方法 ⭐解题思路---闭合为环 🍍 案例图解 四、总结与提炼 五、共勉 一、前言 旋转链表 这道题,可以说是--链表专题--,最经典的一道题,也是在面试中频率最高的一道题目&#x…...
ElasticSearch 和 MySQL的区别
MySQLElasticSearch 数据库(database)索引(index)数据表(table) 类型(type) 记录文档(document,json格式) 一、ES基础命令 1. ES cat查询命令 2.…...
Linux部署wordpress站点
先安装宝塔面板 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec 因为wordpress需要php,mysql,apache ,httpd环境 参考:Linux 安装宝塔…...
实体零售连锁企业如何通过物流接口实现数智化转型升级?
在电子商务浪潮的持续冲击下,传统的实体零售行业面临着巨大的挑战。为了在线上线下融合的新零售时代保持竞争力,众多实体零售企业积极寻求数字化转型的突破。 某中国零售连锁百强企业近年来致力于打造自有品牌的线上销售体系,自2021年8月起接…...
AWS EKS上GPU工作负载自动扩缩容的异常排查指南
在AWS EKS上使用Karpenter和KEDA实现GPU工作负载的自动扩缩容是一个复杂的过程,涉及多个组件的协同工作。当遇到问题时,系统性的排查方法可以帮助我们快速定位和解决问题。本文将详细介绍如何对这个系统进行全面的异常排查。 1. Karpenter相关组件检查 1.1 NodePool检查 N…...
Pytest+Allure+Yaml+Jenkins+Gitlab接口自动化中Jenkins配置
一、背景 Jenkins(本地宿主机搭建) 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码(可不改,如果运行报allure找不到就直接注释掉) …...
应用及安全
目录 一、PAM 安全认证及配置 1.1配置 su 命令的认证 1.2PAM 配置文件结构二、账号和密码安全管理 2.1账号管理 2.2系统账号清理 2.3密码安全控制 2.4密码重设示例 2.5参考命令三、命令历史限制 3.1设置命令历史记录…...
字节流和字符流的相关知识
目录 1. Writer1.1 写两行数据1.2 换一种方式1.3 追加数据1.4 写很多数据,记得要清一下缓存1.5 用数组、字符串写入 2. Reader2.1 读个文件2.2 读取字符2.3 读取数据到数组2.4 复制文件 3. InputStream4. OutputStream5. 参考链接 1. Writer Writer类是Java.io包中…...
LLM意图识别器实践
利用 Ollama 和 LangChain 强化条件判断语句的智能提示分类 ❝ 本文译自Supercharging If-Statements With Prompt Classification Using Ollama and LangChain一文,以Lumos工具为例,讲解了博主在工程实践中,如何基于LangChain框架和本地LLM优…...
常见的反爬手段和解决思路(爬虫与反爬虫)
常见的反爬手段和解决思路(爬虫与反爬虫) 学习目标1 服务器反爬的原因2 服务器长反什么样的爬虫(1)十分低级的应届毕业生(2)十分低级的创业小公司(3)不小心写错了没人去停止的失控小…...
Stable Diffusion【真人模型】:人像光影摄影极限写实真实感大模型
大家好,我是极客菌 今天和大家分享一个基于SD1.5的真人大模型:人像光影摄影极限写实真实感大模型。 该模型具有以下特点: 真实肤感(在面部肌理和皮肤肌理上均有加强学习,拒绝ai出图假的问题) 永不脱妆&a…...
java实现图片添加水印
文章目录 前言一、工具类WatermarkUtil二、工具类介绍2.1 图片来源类型2.2 水印类型2.3 读取本地图片2.4 读取网络图片2.5 水印处理2.6 添加水印 三、测试添加水印总结 前言 给图片添加水印是一个很常见的需求,一般是用来防盗用。比如我们csdn上面写的文章中&#…...
CSS规则——font-face
font-face 什么是font-face? 想要让网页文字千变万化,仅靠font-family还不够,还要借助font-face(是一个 CSS 规则,它允许你在网页上使用自定义字体,而不仅仅是用户系统中预装的字体。这意味着你可以通过提…...
【单片机毕业设计选题24034】-基于STM32的手机智能充电系统
系统功能: 系统可以设置充电时长,启动充电后按设置的充电时长充电,充电时间到后自动 停止充电,中途检测到温度过高也会结束充电并开启风扇和蜂鸣器报警。 系统上电后,OLED显示“欢迎使用智能充电系统请稍后”,两秒钟…...
[C++][数据结构][图][中][图的遍历][最小生成树]详细讲解
目录 1.图的遍历1.广度优先遍历2.深度优先遍历 2.最小生成树1.Kruskal算法2.Prim算法 1.图的遍历 给定一个图G和其中任意一个顶点 v 0 v_0 v0,从 v 0 v_0 v0出发,沿着图中各边访问图中的所有顶点,且每个顶 点仅被遍历一次 “遍历”&…...
退市新规解读—财务类强制退市
一、退市风险警示:第一年触及相关指标 上市公司最近一个会计年度触及下列退市风险指标之一,公司股票或存托凭证被实施退市风险警示(*ST): 第1项 组合类财务指标 仅发行A股或B股,最近一个会计年度或追溯重述后最近一个会计年度 …...
小程序的生命周期使用方法和应用场景
小程序生命周期 初始化(App Launch) • 触发时机:小程序首次启动时。 • 主要事件:onLaunch。 • 功能与适用场景: • 全局数据初始化:设置应用的全局状态和变量。 • 登录状态检查:判断用户是…...
什么是C++模块化系统?C++20的模块化系统。
C20引入的模块化系统是一种新的代码组织和编译机制,它旨在替代传统的头文件机制,提供更好的代码组织、更快的编译速度和更强的封装性。模块化系统的主要目标包括: 减少编译时间:通过减少冗余的头文件解析和宏定义传播,…...
智慧校园-档案管理系统总体概述
智慧校园档案管理系统,作为教育信息化进程中的重要一环,它运用现代信息技术的力量,彻底改变了传统档案管理的面貌,为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…...
esp-hosted 方案深度解析:从架构选型到性能调优实战
1. 为什么选择esp-hosted方案? 如果你正在为嵌入式系统寻找稳定可靠的无线连接方案,esp-hosted绝对值得考虑。这个由乐鑫推出的开源方案,本质上是通过ESP32系列芯片为Linux主机或MCU设备提供Wi-Fi和蓝牙连接能力。我曾在多个工业物联网项目中…...
优化实践:结合ResNet与CBAM注意力机制提升垃圾分类模型性能
1. ResNet与CBAM模块技术解析 1.1 ResNet的核心设计思想 ResNet(残差网络)之所以能成为深度学习领域的里程碑,关键在于它解决了传统深度神经网络的两大痛点:梯度消失问题和网络退化现象。想象一下教小朋友搭积木,当积木…...
OpenClaw备份策略:GLM-4.7-Flash智能管理本地与云端存储
OpenClaw备份策略:GLM-4.7-Flash智能管理本地与云端存储 1. 为什么需要智能备份方案 上周我的移动硬盘突然罢工,导致三个月的项目文档全部丢失。这次惨痛经历让我意识到:传统备份方式已经无法满足现代工作需求。手动备份不仅耗时耗力&#…...
告别向日葵和TeamViewer!用你家路由器自带的DDNS功能,免费搭建Windows远程桌面(保姆级教程)
告别第三方远程工具:用路由器DDNS解锁Windows远程桌面全速体验 每次打开向日葵或TeamViewer时,那个转圈加载的进度条是否让你眉头紧锁?当免费版突然弹出"会话时长已达上限"的提示时,是否恨不得砸键盘?作为常…...
实战指南:基于快马生成电商订单自动化n8n工作流,无缝衔接shopify与crm
实战指南:基于快马生成电商订单自动化n8n工作流,无缝衔接shopify与crm 最近在帮朋友优化他们电商业务的后台流程,发现手动处理订单实在太费时间了。特别是遇到大促期间,订单量暴增,人工操作不仅效率低还容易出错。于是…...
USB设备安全弹出工具终极指南:告别Windows繁琐移除,一键搞定所有存储设备
USB设备安全弹出工具终极指南:告别Windows繁琐移除,一键搞定所有存储设备 【免费下载链接】USB-Disk-Ejector A program that allows you to quickly remove drives in Windows. It can eject USB disks, Firewire disks and memory cards. It is a quic…...
Angular Flex-Layout终极指南:掌握fxLayout、fxFlex、fxLayoutAlign核心指令
Angular Flex-Layout终极指南:掌握fxLayout、fxFlex、fxLayoutAlign核心指令 【免费下载链接】flex-layout Provides HTML UI layout for Angular applications; using Flexbox and a Responsive API 项目地址: https://gitcode.com/gh_mirrors/fl/flex-layout …...
【实战解析】从期末试题到工程实践:摄影测量核心概念与计算全攻略
1. 从试卷到工地:摄影测量核心概念实战指南 第一次接触航测项目时,我盯着任务书上的"相机选型""航线规划"等要求完全懵了。这和期末考试那些名词解释、计算题有什么关系?直到在工地摔打半年后才明白,那些看似…...
Vue中实现动态标签页的切换优化与状态管理
1. 动态标签页的核心需求与实现思路 在后台管理系统这类多页面应用中,动态标签页几乎是标配功能。想象一下你正在使用某电商后台,同时开着商品管理、订单处理和用户分析三个页面,这时候标签页的流畅切换和状态保持就显得尤为重要。 我经历过一…...
nli-distilroberta-base环境配置:Ubuntu/CentOS下Python依赖与端口映射设置
nli-distilroberta-base环境配置:Ubuntu/CentOS下Python依赖与端口映射设置 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的逻辑关系。这个轻量级模型保留了RoBERTa-base模型9…...
