SHA-256算法在FPGA上的实现

96
壹诺思维 22d8d123 271c 4d80 9c59 6990844a9e37
0.5 2018.11.27 21:07* 字数 1640

SHA-256是区块链和比特币方案中用到的一种哈希算法。区块链和比特币大家都应该有所了解。比特币的设计原则是用加密带来的可靠性去替代交易第三方的信用。这里的加密指的就是SHA-256运算,而比特币的挖矿就是比赛看谁的矿机可以首先计算出满足难度要求的SHA-256运算结果。
SHA-256的规范参见 "Federal Information Processing Standards Publication 180-2 (FIPS 180-2)"。
本文是课堂讲解的文字总结,主要介绍如何在Altera的DE1-SoC FPGA开发板上实现SHA-256哈希算法。需要注意的是,由于FPGA开发板速度以及资源限制,本文提供的实现方案仅供学习之用。

写在前面

本课程的目标是给那些懂一点SHA-256规范,懂一点VHDL的同学介绍系统工程的概念,利用系统工程来指导IP开发过程,包括如何提取需求,根据系统需求来选择开发平台,根据模块需求来选择现有IP来搭建系统。开发过程中学习实践项目执行和团队合作。这个课程使得大家有机会从头到尾全程参与一个IP开发全过程,在实际动手的过程中学习,在实际遇到问题并解决问题的过程中成长。

Altera DE1-SoC 开发板

de1-soc原理图

上图是DE1-SoC开发板的原理图。板子上的主芯片是Intel的Cyclone-V FPGA芯片。如图所示,Cyclone-V分为HPS和FPGA两个部分。HPS部分包含了双核ARM处理器,memory接口和AHB总线接口。通过AHB总线ARM可以访问DE1-SoC上所有硬件资源,包括FPGA部分。FPGA部分包括了FPGA,memory以及AHB总线接口。AHB总线的slave接口使得FPGA可以方便地同HPS部分进行交互。

软硬件划分

SHA-256的实现包括软件和硬件加速器两部分。软件工作在HPS部分的ARM上,硬件加速器部分用FPGA实现。
软件部分的功能包括读取信息,对信息进行拖尾操作使得信息总长是512bit的整数倍,配置寄存器,启动SHA-256运算,收集结果等。软件实现在Altera的集成开发环境SoCEDS中进行。
硬件加速器部分完成绝大多数的计算任务,信息块压缩和哈希值更新。也就是说SHA-256中最耗费运算资源的部分都由硬件来实现。由于硬件加速器可以并行实现算法要求的各种复杂数值运算,其运算效率和运算速度要远远高于处理器和显卡。


软件硬件配合

软硬件之间的交互可以采用上图的建议。软件将原始数据写入硬件加速器后配置寄存器,并启动硬件加速器,然后进入等待中断状态。当硬件加速器完成了所有运算,计算出哈希值后会触发中断。ARM上的中断处理机制响应中断,开始运行软件,读取哈希值并进行后续处理。

硬件实现概要

SHA256硬件框图

上图给出了SHA-256硬件加速器的功能示意图。图中给出了加速器的主要功能模块。图中挂接在总线上的模块均可以直接采用Altera提供的IP,用Qsys软件进行图形化配置。图中六个算数运算单元需要自己用VHDL语言实现的部分,这是核心算法模抉,具体的功能请参考SHA-256规范。
由于原始信息可能超过512bit,因此SHA-256硬件模块需要处理超过一个512bit的信息块, 上图右侧的buffer register a....h用来暂存上一个512bit信息块的哈希值。我们的设计要求可以支持最大512Bit*255这么大的报文。每一个512bit信息块经过64次迭代运算后会生成该块的256bit压继值,该值需与上一个块的结果相加成为当前块的哈希值。最后一个块的哈希值就是整个报文的哈希值。第零个512Bit信息块的哈希值由SHA-256规范给出,是运算的初始值。
SHA-256运算需要两个计数器,如图中所示。counter1(1...N)来表示当前处理的是总共N个512bit信息块中的第几个。N表示最后一个,N最大为255,所以需要8bit的计数器。最后一个处理完的结果就是最终的结果。由于每个512bit信息块要经过的64次迭代,counter2 (0...63)用来记录中当前迭代是其中的第几次,所以这是一个6bit计数器。当达到最后一次迭代运算时,register a....h中就是当前块的压缩值。该值与buffer register a...h中暂存的上一个块的哈希结果相加就得到当前块后的哈希值。
这两个计数器还可以用来生成内存读取地址。counter2 可以直接用作RAM for Kj的读地址。counter 1乘以16再加上counter2(当counter2 小于16的时候)就得到了RAM for M的地址。当counter2 大于16时,参与运算的Wj不能从内存读取,而要用前面的值通过运算得到。因此FPGA 实现中需要添加寄存器来暂存前16个Wj。细节请参考SHA-256规范。
为了提高HPS和FPGA之间的数据传输速度,我们可以将RAM挂接在独立的HPS2FPGA bridge上,这样数据的传输可以并行实现,可以通过DMA实现来加快软件配置速度。由于我们这一阶段更关注功能,所有IP都挂接在同一个轻量bridge上也是可以的。所有的优化可以放到后面实现。

验证

FIPS 180-2中给出了详细的测试向量,可以用来进行功能验证。

日记本
Web note ad 1