SHA1摘要算法

SHA算法家族包括SHA-1、SHA-224、SHA-256、SHA-384、SHA-512几种算法,接下来就以最具代表性的SHA-1算法的具体计算过程。

  SHA-1是一种能够根据上限为264比特的信息计算出160比特的单向散列函数

  算法分析:

  1)填充

  SHA-1算法的输入信息长度在0到264比特之间,为了后续处理,会在信息的末尾添加多余的数据,使其长度为512比特的整数倍。512比特是SHA-1算法的输入分组长度。

  填充过程:

  · 在消息末尾添加一个1比特的数值“1”,此时,信息的长度增加1比特。

  · 在消息末尾继续追加0,直到消息的长度达到512比特的整数倍,最后一个分组需要保留最后64比特,以便存储原始输入信息的长度。

  · 在最后一个分组的最后64位需要保存原始输入信息的长度,因此输入信息的最大长度是264比特。

  2)计算W0 ~ W79

  填充完成之后,对每个输入分组计算80个32比特的值(W0 ~ W79),这80个值用于“单步处理”阶段使用。

  计算过程:

  · 针对512比特的输入分组进行切分,切分为16个32比特的分组,命名为W0 ~ W15,然后,计算剩余的W16 ~ W79。

  · 公式:Wt = (Wt - 16⊕Wt - 14⊕Wt - 8⊕Wt - 3)循环左移1比特。循环左移的意思是,将比特序列逐一向左平移,最高位的比特移动到最低位。
在这里插入图片描述
  ⊕表示异或操作,安装上面的计算逻辑计算出W0 ~ W79,计算数量较大,但计算逻辑较简单。

  3)分组处理

  接下来,需要对输入分组进行80个步骤处理,目的是根据输入分组的信息来改变内部状态(160比特),对所有的输入分组都要执行这一操作。
在这里插入图片描述
  160比特的内部状态是通过名为A、B、C、D、E的5个32比特的缓冲区来表示。如图所示,这一步是将5个缓冲区的值与输入分组的信息进行混合,然后再执行80个步骤的处理。这80个步骤所完成的操作,就是将输入分组的512比特的数据,与SHA-1所保持的160比特的内部状态进行混合。通过上述80个步骤的反复执行,SHA-1就能够将已经过填充的消息全部混入这160比特的内部状态中,而SHA-1所输出的散列值,就是所有处理结束之后最终的内部状态(160比特)。

  4)单步处理

  “3)分组处理”中提到的80个步骤,其中每个步骤详细流程如下图:
在这里插入图片描述
  这些处理非常复杂,目的是为了根据W0 ~ W79的信息是内部状态(即A、B、C、D、E的值)产生变化。

  在一个步骤完成后,缓冲区A、B、C、D的内容会被分别复制到B、C、D、E中(其中B要循环左移30比特之后再复制),而缓冲区E的内容则会与其它缓冲区的内容自己Wt、Kt相加之后再被复制到缓冲区A中。

  由于上述处理要循环80个步骤,因此分组中1个比特发生变化,都会影响到散列值中几乎所有的比特,通过这样的方式,就能够实现单向散列函数所具备的性质。

代码:

import java.nio.charset.StandardCharsets;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class SHA1Example {

    

    public static void main(String[] args) {

        String input = "Hello, world!";  // 待加密的字符串

        try {

            // 创建一个SHA-1 MessageDigest实例

            MessageDigest sha1Digest = MessageDigest.getInstance("SHA-1");

            // 将输入字符串编码成字节数组并计算哈希值

            byte[] hashedBytes = sha1Digest.digest(input.getBytes(StandardCharsets.UTF_8));

            // 将哈希值转换为十六进制字符串

            StringBuilder sb = new StringBuilder();

            for (byte b : hashedBytes) {

                sb.append(String.format("%02x", b));

            }

            String hexString = sb.toString();

            // 打印输出结果

            System.out.println("Input string: " + input);

            System.out.println("SHA-1 hash value: " + hexString);

        } catch (NoSuchAlgorithmException e) {

            System.err.println("Error: SHA-1 algorithm not found.");

        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值