散列函数和数组签名概念

一、散列函数

  也称为哈希函数,消息摘要函数,单向函数或杂凑函数。

1. 作用:

  不是完成数据加密和解密的工作,而是用来验证数据的完整性的技术。
 如下图,通过对消息进行散列,然后把消息和散列值hashA一起发送出去,当接受者收到消息和散列值后,先对消息进行散列,如果散列值hashB和接收到的hashA相同,说明数据没有被更改过,从而保证数据的完整性。
在这里插入图片描述

2.特性:
  • 消息的长度不受限制
  • 确定性:对于相同的输入(根据同一函数),它必须始终生成相同的散列值,如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的, 但是对于不同的输入可能会散列成相同的输出(哈希碰撞),所以不可能从散列值来确定唯一的输入值。
  • 均匀性:良好的散列函数应该输入尽可能均匀的映射到输出范围上。
  • 单向性:在加密应用程序中,通常期望散列函数实际上是不可逆的。
3.散列函数常用算法有

MD-消息摘要算法 SHA-安全散列算法MAC-消息认证码算法。不过现在MD已经被证实存在哈希碰撞(不同的数据存在相同的MD算法后相同),所以常用SHA算法。

二、加密体制

1.对称加密

   加密和解密的密钥一样,比如用123加密就是用123解密,但是实际中密码都是普通数据在互联网传输的,这样一点密码被中间人截取并破解,加密直接被攻破

2.非对称加密

   把密钥分为公钥和私钥,公钥是公开的所有人都可以认领,私钥是保密的只有一个人知道。假设A要发送一封Email给B,他不想让任何其他人在传输中看到Email的内容,做法就是使用B的公钥对Email加密,只有B的私钥能够解密(B的私钥唯一性保证信件不会泄露)

三、数字签名

  前面已经介绍了通过散列函数可以确保数据内容的完整性,但这还远远不够。此外,还需要确保数据来源的可认证性(身份识别)和数据发送行为的不可否认性(防止抵赖行为)。

数字签名是散列函数和非对称加密的结合。

1.特性

  即完整性、可认证性和不可否认性。这些正是数字签名的主要特征。

2.过程

问题:
  使用非对称加密 对文件本身加密可能是个耗时过程,比如这封Email足够大,那么私钥加密整个文件以及拿到文件后的解密无疑是巨大的开销。

数字签名可以解决这个问题:

1.A先对这封Email执行哈希运算得到hash值简称“摘要”,取名hashA
2.然后用自己私钥对摘要加密,生成的东西叫“数字签名”
3.把数字签名加在Email正文后面,一起发送给B
(当然,为了防止邮件被窃听你可以用继续公钥加密,这个不属于数字签名范畴)
4.B收到邮件后用A的公钥对数字签名解密,成功则代表Email确实来自A,失败说明有人冒充
5.B对邮件正文执行哈希运算得到hash值,取名hashB
6.B 会对比第4步数字签名的hash值hashA和自己运算得到的hashB,一致则说明邮件未被篡改。

注意点:只能把私钥用来签名,公钥用来认证。 所以只能由拥有私钥的人发送给公钥的,反之不安全。也称为单向认证。
如图所示:
在这里插入图片描述

数字签名满足了以下的要求:
  完整性:当使用公钥解密后的消息与消息原文相同,则说明消息是完整的,否则消息不完整
  不可否认性和可认证性:当消息原文和加密后的消息密文一起被 A 发送给 接收方B 后,接收方B 可以确信信息确实是发送方A 发送的,同时 发送方A 也不能否认发送过该信息,因为除了 A 本人之外,其他任何人都无法由消息原文产生正确的消息密文。

3.常用数字签名算法

  RSA算法,DSA算法。

参考:
https://www.jianshu.com/p/4932cb1499bf
https://www.cnblogs.com/liyutian/p/9525173.html
《Java加密与解密的艺术》

猜你喜欢

转载自blog.csdn.net/weixin_40792878/article/details/84169561