安全基础学习-SHA-1(Secure Hash Algorithm 1)算法

SHA-1(Secure Hash Algorithm 1)是一种密码学哈希函数,用于将任意长度的输入数据(消息)转换成一个固定长度的输出(哈希值或摘要),长度为160位(20字节)。SHA-1的主要用途包括数据完整性验证、数字签名、密码存储等。

1、SHA-1 的特性

  • 定长输出:无论输入数据长度是多少,SHA-1都会产生160位的固定长度哈希值。
  • 单向性:SHA-1函数是不可逆的,无法通过哈希值推导出原始输入数据。
  • 碰撞抵抗:理想情况下,找到两个不同的输入具有相同的哈希值的概率应该非常低。然而,SHA-1已经被发现存在碰撞漏洞,因此在现代应用中逐渐被更安全的算法(如SHA-256)取代。

2、SHA-1 工作原理概述

SHA-1 算法的核心步骤包括:

  1. 消息填充:将消息长度填充到一个满足某种条件(例如512位块)的长度。填充方式通常是先在消息末尾添加一个 1,然后再添加若干个 0,直到消息长度为接近但不超过512的整数倍。最后,消息长度信息也会被附加到填充后的消息中。

  2. 初始化散列值:SHA-1 使用五个初始散列值 H0、H1、H2、H3 和 H4,这些值都是常量。

  3. 处理每个数据块:消息分块后,每个块都经过一系列的操作(如扩展、位运算、混合等),并更新中间哈希值。

  4. 输出最终哈希值:经过所有块的处理后,五个散列值被连接在一起,形成最终的160位哈希值。

3、示例数据

以字符串 “abc” 为例,通过 SHA-1 算法计算其哈希值。

3.1 步骤 1: 消息填充

原始消息 “abc” 转换为 ASCII 编码:01100001 01100010 01100011

3.1.1 原始消息长度

消息的二进制长度为 3 * 8 = 24 位。

3.1.2. 填充“1”

在消息末尾添加一个 1,得到:01100001 01100010 01100011 1
添加1的目的是作为字节结束标志位

3.1.3. 填充“0”

在SHA-1算法的填充步骤中,最终会在填充后的消息末尾附加一个64位的字段,这个字段记录的是原始消息的比特长度。

在“1”位之后,填充若干个“0”位,直到消息的长度达到448位。这一步的目的是确保最终消息长度为512的倍数。

填充后的消息长度为448位(448 = 512 - 64,因为最后要附加64位的消息长度字段)。因此,填充的内容将是:

01100001 01100010 01100011 10000000 00000000...(后续填充到448位)

这段消息长度为448位,其中包含了原始消息一个“1”位以及多个“0”位。

注:

附加消息长度:在填充后的消息末尾,附加一个64位的字段,这个字段表示原始消息的比特长度。在这个例子中,原始消息长度是24位(二进制为00000000 00000000 00000000 00000000 00000000 00000000 00000000 00011000,注意它是64位的)。

因此,最后的消息变为:

01100001 01100010 01100011 10000000 00000000...(后续填充到448位)...00000000 00000000 00000000 00011000

最终,整个消息的长度是 512位,它由**填充后的消息(448位)原始消息长度(64位)**组成。

为什么附加64位的消息长度

附加的64位字段用于存储原始消息的比特长度,目的是确保不同长度的消息,即使内容相同,经过SHA-1处理后也会得到不同的哈希值。这是为了避免哈希碰撞并确保消息的完整性。

3.2 步骤 2: 初始化哈希值

使用SHA-1算法的初始哈希值:

H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0

3.3 步骤 3: 处理512位数据块

对512位的消息块进行处理:

3.3.1 消息分组:将512位的消息分成16组,每组32位。

W[0] = 01100001 01100010 01100011 10000000
W[1] = 00000000 00000000 00000000 00000000
W[2] = 00000000 00000000 00000000 00000000
...
W[14] = 00000000 00000000 00000000 00000000
W[15] = 00000000 00000000 00000000 00011000

3.3.2. 消息扩展:扩展到80个32位字。

通过以下公式将消息扩展到 80 个 32 位字:

W[i] = (W[i-3] XOR W[i-8] XOR W[i-14] XOR W[i-16]) 左旋转 1

需要根据上面的公式计算出 W[16] 到 W[79]。

消息扩展的理解

消息扩展是SHA-1算法中将初始消息块从16个32位字(总共512位)扩展到80个32位字(总共2560位)的过程。这一步是为了增加消息的复杂性,确保生成的哈希值更难以预测,从而提高加密的安全性。

消息扩展的步骤

假设我们有一个512位的消息块,将其分成16个32位字,标记为 W[0] 到 W[15]。这些是初始的16个字。接下来,通过以下的递推公式生成 W[16] 到 W[79]。

递推公式:

对于 i 从16到79(扩展的64个32位字),使用以下公式来计算:

W[i] = (W[i-3] XOR W[i-8] XOR W[i-14] XOR W[i-16]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值