IPv6详解:SHA1算法实现及详解_sha1算法详细图解_CQ小子的博客-程序员宝宝

技术标签: security  Networking  安全  IPV6  ipv6  加密  密码学  

SHA-1的算法属于密码学的知识,但是这个地方主要是由于在IPv6生成stable address的时候用到,所以在IPv6的模块进行介绍。


安全哈希算法(Secure Hash Algorithm)

SHA1是一种数据加密的算法,其思想就是将一段明文加密成一个不可逆的密文。 因为是不可逆的,所以是无法通过密文推测出明文的内容,所以这个算法不会被用来进行传输,一般主要是用来进行数据完整性校验。在数字签名之中应用比较广泛,  数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。如下图展示下载软件的时候提供的SHA1用于验证下载数据包是否被破坏。


SHA1算法描述[FIPS 180-4]

网络中有很多这样的加密工具,可以先通过在线工具尝试一下效果,如下图所示:输入一段明文,然后选择SHA1(支持好多加密算法)输出一段密文ae5b5072d6bf792cb9398e28f01b656594b08046,可以看到输出是一个160位的消息摘要


SHA1把消息当成一个位(bit)字符串来处理。本文中,一个字(Word)是32位,而一个字节(Byte)是8位。比如,字符串“abc”可以被转换成一个位字符串

01100001 01100010 01100011。它也可以被表示成16进制字符串: 0x616263.

简单来讲:SHA-1算法是把输入二进制串分成512位的块,把二进制串的位数存储在最后64位,二者之间填充为0,依次对每个块进行一些列高深的数学运算,最后得到一个160位的二进制串

下面说明下整个算法的过程

1. 补位 

先进行填充,保证数据是512或者其倍数,SHA-1要求是512,。消息必须进行补位,以使其长度在对512取模以后的余数是448
补位是这样进行的:先补一个1,然后再补0,直到长度满足448。 如下图所示
比如abc 原始的比特字符串为:01100001 01100010 01100011 (长度为24bit)
在后面加一个1, 后面填0,到448bit,然后后面的64保持数据的真正bit长度,为24
这样就组成了一个512bit的填充消息

2.初始化Hash Value

在使用Hash进行计算之前,需要初始化Hash Value, H(0),一共160bit,每个32bit

3)SHA-1算法

计算W0~W79,这一部将每一个输入分组,计算80个32位值(W0~W79),首先将输入的512bit字串分成16个32位的组,命名为W0~W15

从上述公式中可以看出:在t属于(0~15)的时候,W(t)为 512bit分成的16个分组, 当t为(16~79)的时候:
W(t) = W(T-3) xor W(T-8) xor W(T-14) xor W(T-16)  循环左移一位  [ROTL的解释可以参考下图]

经过上述计算能够得到 W0~W79的值(根据要认证的数据块计算而得出)

4) SHA-1分组处理

通过上一步计算出W0~W79,这步主要是对这80个双字进行处理,首先要有一些计算使用的常量K(t)

在T不同的范围下,使用不同的分段函数

有了常量和函数,可以对t(0~79)内进行运算
先初始化A,B,C,D,E

在循环使用0~79 执行如下步骤

计算结果得到 a,b,c,d,e与原始的初始化的值相加

组成一个160bit摘要,上面就描述的是对一个512 块的SHA-1算法,如果是多个512块,进行循环即可。 组成的160位摘要信息:H0H1H2H3H4
算法的C语言实现可以参考: http://blog.csdn.net/c_duoduo/article/details/43889743

SHA-1算法结论

1. SHA-1使用big- endian
2. 没有发现两个不同的512块在相同的算法下产生相同的消息摘要
3. 速度慢于MD5
4.安全性高于MD5

参考资料


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wdscq1234/article/details/52782328

智能推荐

firebug详细使用方法_firebug如何使用_CareChere的博客-程序员宝宝

Firebug是网页浏览器 Mozilla Firefox下的一款开发类插件, 现属于Firefox的五星级强力推荐插件之一。它集HTML查看和编辑、Javascript控制台、网络状况监视器于一体,是开发 JavaScript、CSS、HTML和Ajax的得力助手。Firebug如同一把精巧的瑞士军刀,从各个不同的角度剖析Web页面内部的细节层面, 给Web开发者带来很大的便利。例如 Yahoo

开源arduino可视化编辑器Ardublockly源码开发环境搭建_arduino源码github_zhuanshunzhijian的博客-程序员宝宝

linux环境下开源arduino可视化编辑器Ardublockly二次开发搭建1 安装1.1 系统环境搭建在Ubuntu上安装Python 2的Tkinter:sudo apt-get install python-tk或者,在Ubuntu上为Python 3安装Tkinter:sudo apt-get install python3-tk1.2 从git上下载Ardubloc...

用Java生成word文档_代码生成word_拾码.的博客-程序员宝宝

用Java生成生成word生成word思路编辑好需要使用的word文档Java代码层编写生成后的文档如下图生成word思路用WPS或者office编辑好word的样式,然后另存为word xml文档,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Docx。编辑好需要使用的word文档1、把需要注入的信息换成变量名称,比如公司名称用${data1}表示,全部替换后的格式如下图所示2、替换完成后另存为word xml格式的文档,如下图3、生成后更改xm

Idea中使用Git管理时,新建文件自动add(摆脱弹框提示)_idea git 自动add_掉发的小王的博客-程序员宝宝

一、前言我们在开发中必须使用的版本控制工具,最好的就是Git,但是小编用的过程中发现,每次新建一个文件都会提示你要不要add。这不是废话吗?我不add我添加它干嘛呢?于是问了一下旁边的大神同事,他说简单啊!在设置中直接默认add即可,钦佩之心不由得涌上来了!大佬牛牛!!二、难受的提醒坑:小编看到后以为在旁边打个√就没问题了,后来发现打钩是默认不add,并且不提示!!!更加坑了~有没有和小编一样的经历的,下面教大家解决哈!!三、设置自动Add1. 打开设置2. 勾选自动Add参数说明:1

随便推点

解决Ubuntu中安装Teamviewer成功但打开Teamviewer后无法登陆无法获取ID的问题_teamviewer打开没有id_阳东雨夏的博客-程序员宝宝

Ubuntu安装好Teamviewer后,运行它的时候由于权限不足无法打开PID文件,所以无法获得ID,更无法在界面操作。解决办法:进入 /run 文件夹,修改teamviewer.pid的权限,博主使用的是个人电脑,直接执行 chmod 777 teamviewer.pid 给这个文件赋予的所有权限,如果是服务器的话,应该是赋予读和写的权限就可以了。赋予修改权限后,再重新打开teamviewer就可以像在Windows里面一样操作啦!!!...

嵌入式图形界面ugfx源码工程文件分析_落叶行健的博客-程序员宝宝

1 ugfx源码工程文件分析版本依据 version 2.51.1 源码文件总览文件夹类:/3rdparty /boards /demos /docs /drivers /src /tools 文本类:Doxygenfile ffconf.h gfx.h gfx.mk gfxconf.example.h license mf_bwfont.h mf_rlefont.h mf_scaledfon

Linux服务器挂载U盘_初入职场低阶搬砖人的博客-程序员宝宝

1.服务器端口接入外部设备U盘,首先 fdisk -l,然后回车,会显示当前u盘分区名称,如下显示/dev/sda1,da2,da3,da4,da5是服务器正常的磁盘分区,标签system类型显示的是linux/dev/sdb1 是插入的u盘,标签system类型是u盘有些服务器敲完 fdisk-l 以后,仍然会显示不出来u盘,这应该是服务器禁用u盘,需要输入命令 /etc/init.d/remove_usb*.sh stop 关闭禁用u盘服务然后我们需要挂载u盘到服务器,首先 cd

Hibernate一对多双向关联_beckham0207的博客-程序员宝宝

一种商品类别下有多个商品,多个商品对应同一个商品类别,这种关系就是一对多双向关联。商品类:package com.pojo;/** * Product entity. * * @author MyEclipse Persistence Tools */public class Product implements java.io.Serializable {...

android AudioManager类 详解 ._find_xiaohei的博客-程序员宝宝

AudioManager类位于android.Media 包中,该类提供访问控制音量和钤声模式的操作。通过getSystemService(Context.AUDIO_SERVICE)方法获得AudioManager实例对象。AudioManager audiomanage = (AudioManager)context.getSystemService(Context.AUDIO

推荐文章

热门文章

相关标签