硬件安全(1)—— SHA-1算法在FPGA上的实现-2

SHA-1算法在FPGA上的实现-2

在上一篇文章中,我详细介绍了SHA-1算法的计算过程。SHA-1算法主要由消息填充(Message Padding)和哈希计算(Hash Function Engine)两部分组成。消息块标准长度规定为512bits一组。消息填充在实现过程中需要区分长度不足一个消息块( < 512 bits)、长度超过一个消息块( > 512 bits)与长度刚好为一个消息块( = 512 bits)的时候。在这一篇文章中,我将介绍消息填充以及哈希计算的FPGA实现思路。

消息填充(Message Padding)

在SHA-1算法当中,输入消息的处理是需要重点考虑的几个部分之一。SHA-1算法要求输入的消息块将被分割成512bits为一组,即16个字(每个字长度为32bits)。在整个算法当中,每个字参与一轮计算,一共80轮,前16轮使用原本的“字”,后64轮使用扩展后的“字”,具体的扩展方法在上一篇文章中有提到,这里不再赘叙。
SHA-1 Message Padding
上图是我节选自网络的一张PPT,它形象的介绍了在SHA-1算法中消息填充的方法。值得注意的是,Message Padding中特意在原始消息后,填充“0”之前,使用了一个“1” bit。这里使用“1”,而不是全部使用“0”来填充的原因是考虑到了二义性
对应在SHA-1算法的消息填充步骤中,在填充的原始消息后加“1”的原因就是,如果我们的填充函数只是简单地添加零位,直到填充的消息具有正确的长度,那么这将导致以下形式的冲突,Hash(M) = Hash(M||0)。也就是出现了两个数,经过了Hash计算后得出了同一个哈希值。Hash Function的缺陷之一就是可能会出现两个数,比如上述的消息(M)和消息(M||0),注意,(M||0)指的是消息(M)后拼接了一个0,在哈希运算中映射到同一个哈希值。这就意味着了Hash函数被Attacked,密码被攻破,敌手不需要知道SHA-1的初始值(IV)以及原始消息,只需要用类似的方式碰撞出相同的Hash值,就可以通过验证,获取信息。“1”bit的存在意义就是在加密后,不会如同长度为1-512bits的“0”一般,被敌手轻易查获。

// Message Padding fsm 
always @(posedge clk or negedge rst_n)
beginif(!rst_n) begincurrent_state <= s_IDLE;endelse begincurrent_state <= next_state;end
end
always @ (*) 
begincase(current_state)s_IDLE: i_start && i_last 		? 		next_state = s_PAD 	:i_start                	? 		next_state = s_OP		:next_state = s_IDLE	;s_OP:	w_alg_done				?			next_state = s_PAD	:next_state = s_OP		;s_PAD:	w_blen_512 && (w_len < 'h38) ?	next_state = s_PAD	:next_state = s_DONE;s_DONE: next_state = s_IDLE;default: next_state = s_IDLE;endcase
end

在上面这个状态机中,我考虑了填充长度不足一个消息块(448 bits)以及该消息块是最后一个消息块的情况。具体情况还有,消息块长度为消息单位长度的整数倍的情况、消息块长度为0的情况。可以请读者自己酌情添加。

哈希计算(Hash Function)

哈希函数SHA-1的具体计算在上一篇中已经详细介绍,这里不再赘述,直接给出代码。

SHA-1 Function

在SHA-1算法的计算轮次中,使用到了三种不同的函数,分别是Ch(x,y,z)、Parity(x,y,z)、Maj(x,y,z),以及ROTLn(x)具体的代码实现展示如下:

// ch(x,y,z) 
function [31:0] sha1_ch();
input [31:0] x,y,z;
beginsha1_ch = (x & y) ^ (~x & z);
end
endfunction
// parity(x,y,z)
function [31:0] sha1_parity();
input [31:0] x,y,z;
beginsha1_parity = x ^ y ^ z;
end
endfunction
// maj(x,y,z)
function [31:0] sha1_maj();
input [31:0] x,y,z;
beginsha1_maj = (x & y) ^ (x & z) ^ (y & z);
end
endfunction
// ROTL
function [31:0] sha_rotl();
input [31:0] x;
input integer n;
sha_rotl = (x << n) | (x >> 32 - n);
endfunction

SHA-1 Constants

在SHA-1算法中,每20轮有一个K值参与计算,一共4个K值,K值为常量,实现代码如下:

function [31:0] sha1_find_k();
input x;
reg [31:0] p_K [0:3];
begin{p_K[0], p_K[1], p_K[2], p_K[3]} = {32'h5a827999, 32'h6ed9eba1, 32'h8f1bbcdc, 32'hca62c1d6};
end
endfunction

Hash IV (Initial Value)

Hash 算法能实现不固定长度的消息块通过运算转化为固定长度的消息摘要,在SHA-1中,这个固定长度为5个字,160bits。最初的值可根据官方参考,展示如下:

H[0] = 32'h67452301 ;
H[1] = 32'hefcdab89 ;
H[2] = 32'h98badcfe ;
H[3] = 32'h10325476 ;
H[4] = 32'hc3d2e1f0 ;

SHA-1 Processing

经过消息块的分组&填充处理,并扩展之后,SHA-1算法的最终实现参考如下:

module	sha1_round(input					clk,input					rst_n,input					i_first,input	[511:0]		i_msg,output	[159:0]		o_digest
);
reg	[31:0]		T;
reg	[31:0]		W;
reg	[31:0]		WT;
integer i;always @ (posedge clk) begin
if(first) beginH[0] = 32'h67452301 ;H[1] = 32'hefcdab89 ;H[2] = 32'h98badcfe ;H[3] = 32'h10325476 ;H[4] = 32'hc3d2e1f0 ;
end
else beginW[4] = W[3];W[3] = W[2];W[2] = sha1_rotl(W[1], 30);W[1] = W[0];W[0] = T;
end
end
always @ (posedge clk)begin
for(i = 0; i<5; i++) beginW[i] = H[i];
end
endalways @ (posedge clk) begin
for(i = 0; i<20; i++)beginT = sha1_rotl(H[0], 5) + sha1_ch(h[1],H[2],H[3]) + H[4] + sha1_find_k(0) + WT[i];
end
for(i = 20; i<40; i++)beginT = sha1_rotl(H[0], 5) + sha1_parity(h[1],H[2],H[3]) + H[4] + sha1_find_k(1) + WT[i];
end
for(i = 40; i<60; i++)beginT = sha1_rotl(H[0], 5) + sha1_maj(h[1],H[2],H[3]) + H[4] + sha1_find_k(2) + WT[i];
end
for(i = 60; i<80; i++)beginT = sha1_rotl(H[0], 5) + sha1_parity(h[1],H[2],H[3]) + H[4] + sha1_find_k(4) + WT[i];
end
endalways @ (posedge clk) beginfor(i = 0; i<16; i++)beginWT[i] = i_msg[i+:32];endfor(i=16; i<80; i++)beginWT[i] = (WT[i-3] << 1) | (WT[i-3] >> 31) ^ (WT[i-8] << 1) | (WT[i-8] >> 31) ^ (WT[i-14] << 1) | (WT[i-14] >> 31) ^ (WT[i-16] << 1) | (WT[i-16] >> 31);end
end
assign o_digest = {W[5], W[4], W[3], W[2], W[1], W[0]};
endmodule

总结

在该章中,我使用Verilog HDL代码实现了SHA-1算法中算法的具体计算以及消息的填充。所有的代码都是凭借记忆手打,仅供参考。如果有疑问,可以留言,欢迎相互交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql -uroot -p 登陆不上_mysql的登陆和退出命令格式

mysql登陆的命令格式为&#xff1a;mysql -h [hostip] -u [username] -p [password] [database]1.普通登陆mysql数据库命令格式&#xff1a;mysql -u 用户名 -p 密码&#xff0c;例如: mysql -u root -p root如果在-p后没有提供密码&#xff0c;则会在执行命令后要求用户输入密…

Java加密与解密的艺术~RSA实现

RSA 实现 /*** 2008-6-11*/ package org.zlex.chapter08_2;import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import …

IBM发布未来五年五大科技预测

来源&#xff1a;人工智能和大数据未来五年五大科技预测之AI偏见&#xff1a;AI 偏见将会爆发。但只有公正的 AI 才能生存。 5年之内&#xff0c;有偏见的AI系统和算法将不断增多&#xff0c;就像早前的计算机病毒增多一样。但我们将采取相应的应对措施&#xff0c;提出新的解决…

在Linux环境下使用C语言倒转字符串,输出错误的解决办法

项目场景&#xff1a; 学习在Linux环境下的C语言编程&#xff0c;利用GDB打Breakpoint&#xff0c;逐步调试Bug 问题描述 尝试将一个字符串倒转后输出&#xff0c;发现执行文件并没有正常的将倒转后的字符串输出。 源代码&#xff1a; #include <stdio.h>int main(voi…

“机器人之夜”看猎豹跑得快还是五款机器人价格降得快?“鸿门宴”正式上演

来源&#xff1a;机器人大讲堂3 月 21 日&#xff0c;猎豹移动&#xff08;NYSE: CMCM&#xff09;联合旗下人工智能公司猎户星空在北京水立方举行“猎豹3.21机器人之夜”发布会&#xff0c;发布自主研发的猎户机器人平台Orion OS&#xff0c;并推出五款全系列机器人产品&#…

mysql sysbench_详解MySQL基准测试和sysbench工具

一、基准测试简介1、什么是基准测试数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试与压力测试基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑&#xff0c;更加简单、直接、易于测试&#xff0c;数据可以由工具生成&…

windows 堆栈溢出简易测试代码

环境&#xff1a;windows xp sp2 vc 6.0 Code1#include <stdio.h> 2 3int fun2() 4{ 5 printf("-------------Get privilege!---------\n"); 6 getchar(); 7 return 0; 8} 910int fun1()11{12 int iRet 0;13 int *pRet &iRet;14 pRet…

数字电路中的Single-Bit跨时钟域设计

数字电路中的Single-Bit跨时钟域设计同步时钟&异步时钟的定义Metastable&#xff08;亚稳态&#xff09;Metastable的产生原因Setup / Hold Requirement的真正原因Metastable造成的问题跨时钟域同步设计跨时钟域处理目标Single-bit的Clock Domin Crossing (CDC) 电路Single…

《Nature》重磅 | 研究员利用机器学习发现近 6000 种未知病毒

作者&#xff1a;李雨晨《Nature》杂志近日发布消息称&#xff0c;研究人员利用人工智能发现了近6000种未知的病毒。这项工作是在3月15日由美国能源部(DOE)组织的一次会议上提出的&#xff0c;它展示了一种探索地球上巨大而未知的病毒多样性的新工具。从人类健康到垃圾降解&…

mysql limit to hosts matching_MySQL 用户访问限制 -- Host Match Limit

笔者前几日在做数据库迁移的时候&#xff0c;发现了一个挺有意思的小东西&#xff1a;数据库访问限制(Host Match limit),简单地翻阅了下给官方资料&#xff0c;发现这个东西应用场景其实非常广泛&#xff0c;只是我们采用了其他可能没有原生数据库带的Access Limit 功能好地方…

数字电路中的Multi-bits跨时钟域设计

数字电路中的Multi-bits跨时钟域设计跨时钟域同步设计跨时钟域处理目标Multi-bits的Clock Domin Crossing (CDC) 电路设计1-bit "Guard" 信号同步multi-bits数据其他的Multi-bits跨时钟域同步设计跨时钟域电路的仿真验证跨时钟域同步设计 跨时钟域处理目标 在跨时钟…

ACM公布2017年图灵奖,大卫·帕特森和约翰·轩尼诗获奖

来源&#xff1a;网络大数据刚刚&#xff0c;美国计算机协会(ACM)宣布 John L. Hennessy 和 David A. Patterson 荣获 2017 年图灵奖。目前这两位学者都供职于谷歌&#xff0c;前者是谷歌母公司 Alphabet 的董事会主席&#xff0c;后者任谷歌杰出工程师&#xff0c;致力于研究机…

Java加密与解密的艺术~DES实现

密钥长度与安全性成正比&#xff0c;但Java仅支持56位密钥长度&#xff0c;作为补充&#xff0c;Bouncy Castle 提供64位密钥长度支持。在此基础上配合不同填充方式&#xff08;如PKCS5Padding&#xff0c;PKCS7Padding&#xff09;&#xff0c;可显著提高加密系统的安全性。 D…

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…

Linux学习路线及网络编程经典书籍

linux学习资源整理&#xff1a;https://zhuanlan.zhihu.com/p/22654634 Linux初学者(学习资料)&#xff1a;https://zhuanlan.zhihu.com/p/21723250 知乎 - 你是如何学习 Linux 编程的&#xff1f;&#xff1a;https://www.zhihu.com/question/20730157 如果让你推荐一本 Linux…

在Windows 7解决GAC错误

调试一网站源代码出现下面的错误 错误 1 Could not load file or assembly Microsoft.ReportViewer.WebForms, Version8.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a or one of its dependencies. The system cannot find the file specified. D:\3layerhotel\WebS…

CVPR 2018 | 腾讯AI Lab入选21篇论文详解

来源:腾讯AI实验室近十年来在国际计算机视觉领域最具影响力、研究内容最全面的顶级学术会议CVPR&#xff0c;近日揭晓2018年收录论文名单&#xff0c;腾讯AI Lab共有21篇论文入选&#xff0c;位居国内企业前列&#xff0c;我们将在下文进行详解&#xff0c;欢迎交流与讨论。去年…

Java加密与解密的艺术~DESede实现

DESede 实现 /*** 2009-10-5*/ package org.zlex.chapter07_2;import java.security.Key;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec;/*…

推荐!神经进化才是深度学习未来的发展之路!

来源&#xff1a;全球人工智能过去几年时间里&#xff0c;我们有一个完整的团队致力于人工智能研究和实验。该团队专注于开发新的进化计算方法&#xff08;EC&#xff09;&#xff0c;包括设计人工神经网络架构、构建商业应用程序&#xff0c;以及使用由自然进化激发的方法来解…

linux 命令:ping、fping、gping、hping3、tracert、traceroute

From&#xff1a; Nmap、Netcat、Hping3工具对比&#xff1a;http://www.2cto.com/article/201210/158961.html ​hping3 命令&#xff1a;http://man.linuxde.net/hping3 示例&#xff1a;Testing firewall rules with Hping3 &#xff1a;https://www.docin.com/p-74538211…