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引入的模块化系统是一种新的代码组织和编译机制,它旨在替代传统的头文件机制,提供更好的代码组织、更快的编译速度和更强的封装性。模块化系统的主要目标包括: 减少编译时间:通过减少冗余的头文件解析和宏定义传播,…...

智慧校园-档案管理系统总体概述
智慧校园档案管理系统,作为教育信息化进程中的重要一环,它运用现代信息技术的力量,彻底改变了传统档案管理的面貌,为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...