CTF-Crypto学习记录-第四天 “ “ --- SHA1安全散列算法,实现原理。

news2024/11/16 0:48:44

文章目录

  • 前言
  • SHA-1加密算法介绍
    • 关于SHA-1和MD5
  • SHA-1 加密过程
    • 原文处理
    • 设置初始值和数据结构定义
    • 加密运算原理过程
  • 在python中调用SHA-1

前言

MD5学习MD5加密算法

SHA-1加密算法介绍

SHA-1(Secure Hash Algorithm1,安全散列算法1)是一种密码散列函数。
SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

SHA-1的历史:

2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自2010年以来,许多组织建议用SHA-2或SHA-3来替换SHA-1。Microsoft、Google以及Mozilla都宣布,它们旗下的浏览器将在2017年停止接受使用SHA-1算法签名的SSL证书。
2017年2月23日,CWI Amsterdam与Google宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA-1散列值相同的PDF文件作为概念证明。
2020年,针对SHA-1的选择前缀冲突攻击已经实际可行。建议尽可能用SHA-2或SHA-3取代SHA-1。

关于SHA-1和MD5

在上一篇学习笔记里学了MD5加密算法,SHA-1和MD5同样是哈希函数,俩者对于任意长度明文的预处理也都是相同的,那么俩者有什么不同呢?

  • 摘要长度 (安全性)
    SHA-1所产生的摘要是160位比MD5产生的摘要长32位,因此在安全性上SHA-1高于MD5。
  • 运算速度
    同样因为,SHA-1的摘要长于MD5,运算步骤也比MD5多了16步,因此运算速度要慢于MD5

关于MD5和SHA-1,在如今现代计算环境中都已经不再被认为是安全的哈希函数了,为了保证数据和应用的安全,应该使用SHA-256或SHA-3等算法。

SHA-1 加密过程

同MD5一样,可以分为三个过程:

原文处理

对于任意长度明文,需要先进行填充处理,使得明文长度为448(mod 512)位,有俩种情况:

  • 原始明文长度mod512不为448,需要进行填充;这里假设原始明文一共有b bit,那就在b+1 bit处填充一个1,后面全部填充0,直到明文长度mod512等于448为止。
  • 第二种情况,原始明文长度mod512正好为448,这种情况也需要进行填充,总共填充512位的数据,直到明文再次mod512等于448为止。

因此填充的数据长度最小为1 bit ,最大为512 bit。‘

再得到448bit长度的明文后,还需要添加64bit的数据,使得明文长度等于512 bit

填充处理完成之后是分组处理

要先将恰好为512整数倍的明文,分成 L 个512 bit长度 的明文分组。接下来对每个512 bit大小的明文分组进行类似于MD5的操作;

  • 先将512 bit 的明文分组,分成 16个 32 bit的子明文分组。可以用 M[k] 表示
  • 之后再将这16个子明文分组扩展到 80个子明文分组。 可以用W[k]表示
    扩充的方式如下:

W t = M t , 当0≤t≤15
W t = ( W t-3 ⊕ W t-8⊕ W t-14⊕ W t-16 ) <<< 1, 当16≤t≤79

设置初始值和数据结构定义

一些相关定义:

SHA 1 针对输入的比特流是按块 (block) 依次进行处理的, 每个块的长度固定为 512 bit, SHA 1 算法允许的最大输入长度为 2^64−1 bit, 在 SHA 1 算法中, 我们将 32 bit 定义为字 (word), 所以每个字可以用 8 位十六进制来表示, 例如对于字 1010 0001 0000 0011 1111 1110 0010 0011 可表示为 A103FE23, 对于一个长度在 [0, 2^32−1] 的整数便可以用一个字来表示, 整数的最低有效 4 位为字的最右侧的十六进制字符, 对于一个整数 z, 若 0≤z<2^64 则 z=(2^32*x+y), 其中 0≤x,y<2^32, 于是 x, y都分别可以用一个字来表示, 我们记这两个字分别为 X, Y, 此时整数 z 便可以使用这对字来表示, 我们记为 (X,Y)

可以将针对bit 的逻辑运算符扩展定义到字上;

X AND Y 为两个字按位逻辑与
X OR Y 为两个字按位逻辑或
X XOR Y 为两个字按位异或
NOT X 为对字 X 的每一位按位取反

除了逻辑运算符,还可以定义字上的算术运算,

X + Y 定义为 (x + y) mod 2^32

最后定义字上的循环左移运算符(逻辑移位),循环左移即是将字的比特整体向左移动 n 位, 左侧溢出的比特位补到右侧空出来的比特位, 我们将这一运算记作 S^n(X), 循环左移可以使用逻辑表达式来描述, 如下所示:

S^n(X) = (X << n) OR (X >> 32 -n)

MD5中有4个初始变量值,而SHA-1中有五个链接变量,如下:

H0=0x67452301

H1=0xEFCDAB89

H2=0x98BADCFE

H3=0x10325476

H4=0xC3D2E1F0

此外 SHA-1定义了4个逻辑函数和4个常量。每个逻辑函数针对3个字作为输入,函数的输出为一个字,其中 t (0 ≤ t ≤ 79) 是变量, 函数的表达式如下:

  f(t;B,C,D) = (B AND C) OR ((NOT B) AND D)         ( 0 <= t <= 19)

  f(t;B,C,D) = B XOR C XOR D                        (20 <= t <= 39)

  f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D)  (40 <= t <= 59)

  f(t;B,C,D) = B XOR C XOR D                        (60 <= t <= 79)

4个常量分别如下(十六进制表示):

 K(t) = 5A827999         ( 0 <= t <= 19)

  K(t) = 6ED9EBA1         (20 <= t <= 39)

  K(t) = 8F1BBCDC         (40 <= t <= 59)

  K(t) = CA62C1D6         (60 <= t <= 79)

加密运算原理过程

SHA1有4轮运算,每一轮包括20个步骤,一共80步。

下图是 SHA-1算法中的一个回圈;
在这里插入图片描述

  • 也如MD5一样,SHA-1会现将H0,H1,H2,H3,H4,H5五个初始变量依次放入ABCDE中;即 A = H0, B = H1, C = H2, D = H3, E = H4
  • 定义循环变量 t, 对 t 从 0 到 79 依次赋值, 每一次循环执行如下操作:
    • TEMP = S^5(A) + f(t;B,C,D) + E + W(t) + K(t);
    • E = D;
    • D = C;
    • C = S^30(B);
    • B = A;
    • A = TEMP;
  • 分别令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E

从 M(0) 开始每一轮计算后会得到新的 H0, H1, … , H4, 下一轮计算中使用上一次产生的新值, 对最后一个块计算完毕后得到的 H0, H1, … , H4便是算法的输出, 即原文的 SHA 1 哈希值

在python中调用SHA-1

import hashlib

# 要哈希的数据
data = b'Hello, World!'  # 在 Python 3 中,请确保数据以字节字符串的形式表示

# 创建一个 SHA-1 哈希对象
sha1 = hashlib.sha1()

# 更新哈希对象以处理数据
sha1.update(data)

# 获取 SHA-1 哈希值的十六进制表示
sha1_hash = sha1.hexdigest()

print("SHA-1 哈希值:", sha1_hash)

输出:

SHA-1 哈希值: 0a0a9f2a6772942557ab5355d76af442f8f65e01

文献参考:

https://www.cnblogs.com/scu-cjx/p/6878853.html
https://sunyunqiang.com/blog/sha1/
https://zh.wikipedia.org/zh-hans/SHA-1

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

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

相关文章

Python3打印九九乘法表

# 九九乘法表 # 定义行数 i 1while i<9:# 定义列数j 1while j<i: # print(" %d * %d %d\t" %(j,i,(j*i)),end) # \t:对齐;end:不换行&#xff1b;j1i1print() # 必须添加这句话&#xff01;&#xff01;&#xff01;print("九九乘法表打印完毕&#xf…

环形链表-力扣

一、题目描述 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、题解 解题思路&#xff1a; 快慢指针&#xff0c;即慢指针一次走一步&#xff0c;快指针一次走两步&#xff0c;两个指针从链表起始位置开始运行&#xff0c;…

Windows相关知识

目录 window用户管理 前言 SID 内置账户 与使用者关联的 与Windows组件关联的 用户相关命令 查看命令 用户管理 windows用户组 内置组账户 需要人为添加进入的组 动态包含成员的组&#xff08;符合某种条件自动进入的&#xff09; 管理组命令 NTFS权限 前言 常…

AFsim 三维地图部署

1.打开三维地图 点击上面菜单栏的地球&#xff0c;打开三维地图&#xff0c;或者按快捷键f4&#xff0c;弹出三维地球&#xff0c;如下图&#xff1a; 2.三维地图设置平台 在地球上任意位置&#xff0c;右击选择创建平台&#xff0c;弹出创建平台窗口&#xff0c;输入平台名称…

docker的安装部署nginx和mysql

小白自己整理&#xff0c;如有错误请指示&#xff01; 自我理解&#xff1a;docker就是把应用程序所用的依赖程序&#xff0c;函数库等相关文件打包成镜像文件&#xff0c;类似系统光盘&#xff0c;然后可以在任意电脑上安装使用&#xff08;方便运维人员部署程序&#xff09;…

设计模式面试知识点总结

文章目录 设计原则常用设计模式单例模式1. 饿汉式2. 懒汉式3. 双重检测 工厂方法模式&#xff08;简单工厂、工厂方法、抽象工厂&#xff09;简单工厂静态工厂工厂方法模式抽象工厂模式 策略模式责任链模式 设计原则 标记设计模式原则名称简单定义OCP开闭原则对扩展开放&#…

C生万物 | 从浅入深理解指针【第一部分】

C生万物 | 从浅入深理解指针【第一部分】 文章目录 C生万物 | 从浅入深理解指针【第一部分】一、内存和地址1.1 内存1.2 究竟该如何理解编址 二、指针变量和地址2.1 取地址操作符&#xff08;&&#xff09; 三、指针变量和解引用操作符&#xff08;*&#xff09;3.1 指针变…

①【数据库操作】 MySQL数据库的查询、创建、删除、使用。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 数据库相关概念数据库的查询、创建、删除…

UI组件库基础

UI组件库 全局组件* 全局注册组件 & 并且使用了require.context 模块化编程 & webpack打包 const install(Vue)>{const contextrequire.context(.,true,/\.vue$/)context.keys().forEach(fileName>{const modulecontext(fileName)Vue.component(module.default.n…

【MySQL】并发事务产生的问题及事务隔离级别

先来复习一下事务的四大特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是不可分割的最小操作单位&#xff0c;事务中的所有操作要么全部执行成功&#xff0c;要么全部失败回滚&#xff0c;不能只执行其中一部分操作。一致性&#xff08;Consisten…

vue2组件库-上传组件

vue2组件库 上传组件 核心思路&#xff1a;监控整个上传的流程 上传成功 上传失败 类型&#xff1a;拖拽 多个文件上传 上传必备属性 & 钩子属性 跟上传强关联的属性&#xff0c;上传必备的字段 name: 提交的那个formData字段名 action&#xff1a;ajax接口路径 limit&…

如何中断一个正在运行的线程?

线程 线程是系统级别的概念&#xff0c;在 Java 里面实现的线程&#xff0c;最终的执行和调度都是由操作系统来决定的&#xff0c;JVM 只是对操作系统层面的线程做了一层包装而已。所以我们在 Java 里面通过 start 方法启动一个线程的时候&#xff0c;只是告诉操作系统这个线程…

R语言入门看这一章就够了(上)

目录 一、R的基础 1.1、R的安装 1.2、牛刀小试 1.3、线性关系实例 1.4、工作空间 1.5、R包的使用 包的安装 结果的重用 二、R数据集 2.1、向量 2.2、矩阵 2.3、数组 2.4、数据框 2.5、列表 三、R的常用命令 四、list列表详解 五、数据源导入方法 5.1、键盘输…

黔院长 | 黄帝内经:人有四经十二从!

"人有四经十二从"这句话出自《黄帝内经素问》&#xff0c;“四经”指的是与四时相应的正常脉象&#xff0c;也是指四个主要经络&#xff1a;太阳经、少阳经、太阴经和少阴经。在中医理论当中这些经络被认为是人体气血运行的通道。 而“十二从”则表示人体的十二个经脉…

VulnHub Metasploitable-2

一、信息收集 nmap扫描 访问80端口 二、漏洞利用 1.漏洞一 1.vsftpd 2.3.4&#xff08;CVE-2011-2523&#xff09; 2.msf msf6 > search vsftpd msf6 > use 0 msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set rhosts 192.168.103.189 msf6 exploit(unix/ftp/vs…

ATV32变频器在堆垛机应用

一、机型介绍&#xff1a; 目前国内物流行业发展速度很快&#xff0c;特别是在自动仓库这一块&#xff0c;自动仓库用的最多是堆垛机&#xff0c;自动仓库目前驱动用得基本上变频器。品牌基本是丹佛斯、日系及其他等重载系列变频器。设备主要包括&#xff1a;提升机、货叉及行…

【Java题】输出基本数据类型的最大值和最小值,以及float和double的正无穷大值和负无穷大值

一&#xff1a;代码 public class Test {public static void main(String[] args) {//输出byte型的最大值与最小值System.out.println(Byte.MAX_VALUE);System.out.println(Byte.MIN_VALUE);//输出short型的最大值与最小值System.out.println(Short.MAX_VALUE);System.out.pri…

2023-2024 年最佳 6 款数据恢复软件免费在线下载

如果您正在寻找在线数据恢复工具来帮助自己摆脱数据丢失的麻烦&#xff0c;这篇文章可以为您提供帮助。我们讲解如何免费在线恢复数据&#xff0c;并从兼容性、适用性、易用性、价格等角度分享了市场上六款著名的数据恢复软件。每个在线恢复工具都是安全的&#xff0c;并且可以…

植物大战僵尸 forMac/Windows系统中文版:一场惊心动魄的生存之战

在充满惊喜与挑战的《植物大战僵尸》游戏中&#xff0c;一场奇妙的生存之战正等待着你。为了保护你的大脑&#xff0c;你必须组建一支植物军队&#xff0c;利用各种独特的植物和能力&#xff0c;抵御一波又一波的僵尸大军。现在就让我们深入了解这款引人入胜的游戏&#xff0c;…

【C++】Linux下如何查看opencv的版本

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…