快速入门数字芯片设计,UCSD ECE111(六)SHA256哈希算法的状态机实现(一)

简介: 快速入门数字芯片设计,UCSD ECE111(六)SHA256哈希算法的状态机实现

这篇文章带来ECE111第六节课的Slides以及自己的一些补充。

该课程的网站如下:

在开始本节课之前”鉴赏“一下Project2的示例代码:

分析此类代码首先仍然按我之前说的方法,先看状态机:

  • 一共5个状态,IDLE状态以及步骤1~4状态。
  • 当start信号拉高的时候,会跳到STEP1状态。该状态初始化读请求,需要把we信号拉低,同时将读地址赋值为:输入的原始读地址+count。然后跳到状态2
  • 状态2等待内存模型输出的结果,接着跳到状态3。
  • 状态3初始写命令,需要将we信号拉高,同时将写地址赋值为:输入的原始写地址+count。同时将之前读回来的数据进行字节旋转,再将count加1。代表一次完整的读写操作。然后跳到状态4
  • 状态4首先判断count是否与定义的size大小一致,如果是的话。则代表已经完成了所有的运算,将done信号拉高,然后跳到IDLE状态。否则跳到步骤1(状态2),重复上述的操作。

上面的代码逻辑非常清晰,事实上它将读写操作划分为一个一个的状态,非常易于实现。这种代码对于初学者而言其实是很容易接收的,因为大家实际上可以用软件亦或者说人的思维方式思考这一问题,不需要考虑实际的硬件架构。这种编码方式希望大家好好掌握,对于一步一步实现的,大部分都可以通过状态机实现。这种方式不一定好,但是它简单可控,易于维护。

大家再思考一下,上面的状态有没有冗余状态?实际上是有的,对于状态4的判断操作,实际上可以放在状态3去做。我们先写数据,然后就可以判断count是否等于size,从而跳转到STEP1或IDLE态。代码在这个链接,图片我就不贴了,http://cwcserv.ucsd.edu/~billlin/classes/ECE111/examples/br1.sv。此外还可以流水线的方式读写,从而掩盖SRAM的输出延迟。也就是开始的状态2,等待SRAM输出结果,这一个周期我们实际上什么都没有干,那我们是不是可以再读一次?下一个时钟周期SRAM输出了结果,同时输入的地址也发生了变化。那我们就可以连着写两次了,似乎节省了一个时钟周期。代码大家自行研究一下,分析思路和上面的分析思路是类似的。http://cwcserv.ucsd.edu/~billlin/classes/ECE111/examples/br2.sv

接下来进入本节课的正题,Project3:SHA256算法。

相信大家或多或少,都听到过加密、哈希、数字签名之类的名词。今天就带大家自己动手实现一个哈希算法-SHA256。SHA的意思为Secure Hash Algorithm,安全哈希算法,或者叫安全散列算法。哈希这个词语很有迷惑性,我更加愿意称之为散列算法。即从一组数据散列到另外一组数据。SHA系列算法由美国国家安全局制定,从最初的SHA0到SHA1到SHA224再到SHA256,此外还有SHA384和SHA512。其中SHA0已经没有人使用了,SHA1算法目前仍然有一些地方在使用,尽管SHA1已经没那么安全了(更多的资料大家可以自己搜索)。另外值得注意的是,很多地方把SHA系列算法称为加密算法,严格地说它只是单向散列算法,不能称之为加密算法。

我们的目标是对于任意输入的信息(message),计算它的哈希值(对于给定的输入,它的哈希值是一定的)。message可以是任意的东西。

SHA-256会返回256比特的哈希值,或者称之为数据摘要或强校验和。然后是一些数据经过SHA256的计算结果(再次提醒,这个数据是广义的数字序列,一串文字,一个图片,一部电影,mp3格式的音乐等都是一串数据)。

这张图告诉我们,对于输入而言,发生很小的改变,对于计算得到的哈希值会发生巨大的变化。这一特性称为无序性。

然后介绍了一下哈希算法的应用之一:检验文件的完整性。软件制造商想要确保可执行文件被用户接收而没有修改,把文件发给用户,同时将哈希值公布到NY times(纽约时代?不知道是啥,应该是个公共区域)。目标是完整性,而不是保密!用户接收文件的时候对比哈希值就知道文件有没有被篡改。这是因为很难找到一个别的文件,两个哈希值是一模一样的,这称为哈希碰撞(比特币获取的原理就是哈希碰撞)。

同时还可以用来鉴权,比如Alice给Bob(熟悉的名字他来了)发消息,希望确保没有人在传输过程中修改消息。那就把哈希值一起发送。接收方一对比就知道消息有没有被修改了。

然后介绍了SHA256的要求:

  • 输入的消息必须小于2的64次方比特(这实际上不是什么问题,因为...大家可以算一下这个数有多大)
  • 输入的消息是以512bit为一个block来循序的处理的
  • 数据摘要是256比特

然后介绍了SHA-256算法,其步骤如下

  • 步骤一,填充比特。首先在数据的末尾填充一个“1”。然后填充“0”直到数据长度对512取模为448,即数据长度为512N+448(N=0,1,2...)。
  • 步骤2,填充64bit的数据,该数据为message的长度(注意是原始的长度,如上图的900),到此为止,整个的长度为512的正整数倍。

目录
相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
46 3
|
2月前
|
存储 算法 C#
C#哈希查找算法
C#哈希查找算法
|
3月前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
105 1
|
2月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
41 0
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
4月前
|
算法 安全 JavaScript
安全哈希算法:SHA算法
安全哈希算法:SHA算法
65 1
安全哈希算法:SHA算法
|
4月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
529 1
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
13天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
21天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。