密码学中的Hash函数

目录

一. 介绍

二. hash函数的五个基本性质

(1)压缩性

(2)正向计算简单性

(3)逆向计算困难性

(4)弱无碰撞性

(5)强无碰撞性

三. 哈希函数的攻击方式

四. 生日攻击

4.1 第 1 类生日问题

4.2 第2类生日攻击:生日悖论

五. 小结


一. 介绍

Hash函数(也称散列函数或散列算法)的输入为任意长度的消息,而输出为某一固定长度的消息。即 Hash 函数将任意长度的消息串 M 映射成一个较短的定长消息串,记为 H。称 H(M)为消息 M 的 Hash值或消息摘要(message digest),有时也称为消息的指纹。

通常 Hash 函数应用于数字签名消息完整性等方面。设 H 是一个 Hash 函数,x 是任意长度的二元串,相应的消息摘要为y=H(x),通常消息摘要是一个相对较短的二元串(例如 160 比特)。假设我们已经计算出了 y 的值,那么如果有人改变 x 的值为 x’,则通过计算消息摘要 y’=hash(x’),验证 y’与 y 不相等就可以知道原来的消息 x 已被改变。

通常,Hash 函数可以分为两类:

  1. 不带密钥的 Hash 函数只需要有一个消息输入;
  2. 带密钥的 Hash 函数规定要有两个不同的输入,即一个消息和一个秘密密钥;

二. hash函数的五个基本性质

Hash 函数是为指定的消息产生一个消息“指纹”, Hash 函数通常具有以下这些性质:

(1)压缩性

Hash 函数将一个任意比特长度的输入 x 映射为固定长度为 n 的输出 H(x)。

(2)正向计算简单性

给定 Hash 函数 H 和任意的消息输入 x,计算 H(x)是简单的。

(3)逆向计算困难性

对所有预先给定的输出值,找到一个消息输入使得它的 Hash 值等于这个输出在计算上是不可行的。即对给定的任意值y,求使得 H(x)=y 的 x 在计算上是不可行的。在密码学中,通常这一性质也称为 Hash函数的单向性。

(4)弱无碰撞性

对于任何的输入,找到一个与它有相同输出的第二个输入,在计算上是不可行的。即给定一个输入 x,找到一个 x’,使得H(x)=H(x’)成立是计算不可行的,如果单向 Hash 函数满足这一性质,则称其为弱单向 Hash 函数。

(5)强无碰撞性

找出任意两个不同的输入 x 与 x’,使得 H(x)=H(x’)在计算上是不可行的,如果单向 Hash 函数满足这一性质,则称其为强单向Hash 函数。在网络安全中,这个性质非常重要。

三. 哈希函数的攻击方式

攻击者可以对 Hash 函数发起两种攻击。

第一种就是找出一个 x’,使得 H(x)=H(x’)。

例如,在一个使用 Hash 函数的签名方案中,假设 s 是签名者对消息 x 的一个有效签名,s=sig(H(x))。攻击者可能会寻找一个与 x 不同的消息 x’使得 H(x)=H(x’)。如果能找到一个这样的 x’,则攻击者就可以伪造对消息 x’的签名,这是因为 s 也是对消息 x’的有效签名。Hash 函数的弱无碰撞性可以抵抗这种攻击。

攻击者可以发起另一种攻击。同样一个应用 Hash 函数的签名方案中,对手可能会寻找两个不同的消息 x 和 x’,使得 H(x)=H(x’)。然后说服签名者对消息 x 签名,得到 s=sig(H(x))。由于 s=sig(H(x’)),所以攻击者得到了一个对消息 x’的有效签名。Hash 函数是强无碰撞性可以抵抗这种攻击。

四. 生日攻击

4.1 第 1 类生日问题

假设已经知道 A 的生日为某一天,问至少有多少个人在一起时,至少有 1/2 的概率使有一个人和 A 的生日相同?

初步理解:我们假定一年有 365 天,且所有人的生日均匀分布于 365 天中。下面我们求解所需的最少人数。

首先,有 1 人和 A 有相同生日的概率为 1/365,有不同生日的概率则为:

1-1/365=364/365

K 个人与 A 生日不同的概率应为:

(\frac{364}{365})^k

K 个人至少有 1 个人与 A 的生日相同,且概率不小于 1/2 应为:

1-(\frac{364}{365})^k\geq \frac{1}{2}

所以可得:

(\frac{364}{365})^k\leq \frac{1}{2}

进一步计算可得:

k\geq -ln2/ln(364/365)\geq 0.6931471/0.027370\geq 253

即至少为 253 人。

若已知 A 的生日,则当至少有 253 个人时,才能保证有 1/2 的概率使有 1 人和 A 的生日相同。

4.2 第2类生日攻击:生日悖论

假设一年有 365 天,每个人的生日均匀分布于 365天,那么至少有多少个人在一起是,能保证至少有 1/2 的概率存在 2 个人有相同的生日?

第 2 类生日问题也称生日悖论。

P_m为 m 个人在一起,不存在相同生日的概率。根据假定,则 m-1个人中无相同生日的概率为 P_{m-1},m-1 个人共有生日 m-1 天。第 m 个人与前面 m-1 人无相同生日的概率为:

也就是递推关系满足:

由此可得:

可以验证当 m≥23 时,Pm<1/2。即 23 个人在一起时,无相同生日的概率小于 1/2。反过来就是当 23 个让你在一起是,有两个人的生日相同的概率大于 1/2。这个结果挺神奇的。

五. 小结

哈希函数的迭代结构一般为:

目前使用的大多数Hash函数如MD5、SHA-1,其结构都是迭代型的,如上图所示。其中函数的输入M被分为L个分组,每一个分组的长度为b比特,如果最后一个分组的长度不够,需对其做填充。最后一个分组中还包括整个函数输入的长度值。这将使得攻击者的攻击更为困难,即攻击者若想成功地产生假冒的消息,就必需保证假冒消息的Hash值与原消息的Hash值相同,而且假冒消息的长度也要与原消息的长度相等。

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

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

相关文章

【2058错误】sql软件链接数据库 mysql 报错误2058

【2058错误】sql软件链接数据库报错误2058 操作&#xff1a;仅需在mysql登陆之后运行一行代码即可&#xff1a;注意1.后面必须是%&#xff0c;而不是别人说的 localhost2.此处的password是你自己的mysql密码。 操作&#xff1a;仅需在mysql登陆之后运行一行代码即可&#xff1a…

Django(六)

员工管理系统(用户管理&#xff09; {% extends layout.html %}{% block content %}<div class"container"><div style"margin-bottom: 10px"><a class"btn btn-success" href"#"><span class"glyphicon gl…

YOLOv8模型yaml结构图理解(逐层分析)

前言 YOLO-V8&#xff08;官网地址&#xff09;&#xff1a;https://github.com/ultralytics/ultralytics 一、yolov8配置yaml文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨架&#xff08;backbone&#xff09;和头部&#xff08;hea…

小程序面试问答(解决方案)

目录 问&#xff1a;uni-app 组件库的解决方案&#xff1f;&#xff08;xx 分钟&#xff09; 必答​ 加分​ 深入​ 再深入​ 参考链接​ 问&#xff1a;在 uni-app 中&#xff0c;如何进行全局状态管理&#xff1f;请介绍一下你对 Vuex 和 Pinia 的了解。​ 必答​ 加…

【前端设计】小球loading动画

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

metartc5_jz源码阅读-yang_push_h264_package_stap_a

//通过stap_a模式发送sps和pps包给对端。 int32_t yang_push_h264_package_stap_a(void *psession,YangPushH264Rtp *rtp, YangFrame *videoFrame) {int err Yang_Ok;YangRtcSession *session(YangRtcSession*)psession;//重置rtpPacket的字段yang_reset_rtpPacket(&rtp-&…

Kali Linux——设置中文

【问题现象】 从下图可以看到&#xff0c;菜单全是英文的。对于英文不好的同学&#xff0c;使用起来很难受。 【解决方法】 1、获取root权限 su root 2、进入语言设置 dpkg-reconfigure locales 3、选择zh_CN.UTF-8 UTF-8 4、设置默认 5、安装完成 6、重启虚拟机 reboot…

20. Mysql 游标的定义和使用

文章目录 概念游标的基本语法声明游标打开游标使用游标关闭游标精选示例 总结 概念 游标&#xff08;Cursor&#xff09;是一种数据库对象&#xff0c;可以指向存储在数据库表中的数据行指针。用于在 sql 语句的执行过程中&#xff0c;通过对查询结果集进行逐行的操作和访问。…

2023我的工作后有上学的研究生之旅,让你避坑

目录 印象深刻的实战经历 系统学习新技术的心得体会 想要安利给所有人的开发工具&#xff1a;VS Code 对技术行业的深度思考 职业规划与心灵成长 职场经历与升职感悟 编程语言的新趋势 我的最大收获与成长:团队&#xff0c;平台 我的技术发展规划 印象深刻的实战经历 …

C#,入门教程(08)——基本数据类型及使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体&#xff08;DataEntity&#xff0c;包括但不限于类或结构体的属性、变量、常量、函数返回值&#xff09;…

【Flink精讲】双流Join之Regular Join(即普通Join)

Regular Join 普通Join 通过条件关联两条实时数据流&#xff1a;动态表Join动态表支持Inner Join、Left Join、Right Join、Full Join。 1. Inner Join(Join)&#xff1a;只有两边数据流都关联上才输出[L,R] 2. Left Join(Left Outer Join)&#xff1a;只要左流有数据即输出[…

数据库系统原理:从基础到实践的探索

数据库系统原理&#xff1a;从基础到实践的探索 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我将和大家深入探讨数据库系统原理。 数据库系统作为信息系统的…

C语言程序设计——程序流程控制方法(一)

C语言关系运算符 ---等于ab!不等于a!b<、>小于和大于a>b 、a<b<、>小于等于、大于等于a>b 、a<b!非!(0)、!(NULL) 在C99之后&#xff0c;C语言开始支持布尔类型&#xff0c;头文件是stdbool.h。在文中我所演示的所有代码均是C99版。 在C语言上上述关…

mxxWechatBot微信机器人自定义接口支持配置多个关键词、多个群聊和好友

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 注意&#xff1a; 免责声明&#xff1a;该工具仅供学习使用&#xff0c;禁止使用该工具从事违法活动&#xff0c;否则永久拉黑​封禁账号。本工具我不会绝对保证对你的账号没有影响…

【爱发电】正式入驻爱发电平台

我的爱发电主页地址&#xff1a;https://afdian.net/a/leoatliang 欢迎大家来用爱发电&#xff01;&#xff01;&#xff01;

Android 横竖屏切换之窗体泄露leaked window DecorView XXXActivity

前言 遇到问题 Android 横竖屏切换之窗体泄露leaked window DecorView XXXActivity has leaked window DecorViewe6d2d3c[XXXActivity] that was originally added here 场景 在android 横竖屏切换时androidManifest 对应Activity可以设置 <activityandroid:name".XX…

vue3中vite.config.js文件常用配置

文章目录 配置root&#xff1a;base&#xff1a;publicDir&#xff1a;plugins&#xff1a;optimizeDeps&#xff1a;server&#xff1a;build&#xff1a;resolve&#xff1a; 配置 vite.config.js文件是 Vite 项目的配置文件&#xff0c;通过该文件你可以对 Vite 进行一些配…

draw.io基础操作和代码高效画图进阶

文章目录 一、基础操作1、链接2、等比例变形3、复制4、插入表格 二、在线打开三、插入—功能聚集地1、插入图片2、插入画笔3、插入布局4、导出 四、图码转换——高效画图1、通用图码转换2、流程图生成&#xff1a;使用mermaid语言生成图&#xff1a; 五、图码转换高效画图的典型…

C++八股学习心得.7

1.在 CGI 中使用 Cookies HTTP 协议是一种无状态的协议。但对于一个商业网站&#xff0c;它需要在不同页面间保持会话信息。例如&#xff0c;一个用户在完成多个页面的步骤之后结束注册。但是&#xff0c;如何在所有网页中保持用户的会话信息。 在许多情况下&#xff0c;使用…

locust 快速入门--HttpUser与TaskSet

背景&#xff1a; locust 压测是以模拟一定用户数量完成指定操作实现的压测。 它的基础维度是用户数量&#xff08;HttpUser&#xff09;&#xff0c;压测时指定多少用户数&#xff0c;就会有相应的HttpUser实例。 用户的操作行为定义&#xff0c;是通过一个个task装饰的方法实…