密码学:带密钥的消息摘要算法一数字签名算法

文章目录

  • 前言
  • 手写签名和数字签名
  • 前置知识点:消息摘要算法
  • 数字签名算法
    • 数字签名算法的由来
    • 数字签名算法在实际运用的过程
      • 附加:签名和摘要值的解释
  • 数字签名算法的家谱
  • 数字签名算法的消息传递模型
  • 经典数字签名算法-RSA
    • 实现
  • 数字签名标准算法-DSA
    • 实现
  • 圆曲线数字签名算法-ECDSA
  • 总结
  • 参考

请添加图片描述

前言

在微软 (Microsoft) 、Adobe等软件产品中,我们常常需要输入序列号,那么序列号是什么?它背后用到的技术是什么?它实现算法又是什么?然后什么是数字签名?它和手写的签名又有什么区别和联系?本文将为你揭晓答案。

手写签名和数字签名

相信绝大多数读者朋友都有刷卡购物的经历。刷卡时,我们都要签下自己的名字我们把这种行为简称为“签名”,或者叫做“手写签名”。这种签名几乎与使用者一绑定,成为防止使用者对其行为否认的一种手段。如果使用者对自己的行为表示质疑,可鉴定签名是否一致,判别签名是否有效。

数字签名是手写签名在计算机软件应用中的一种体现,它同样起到了抗否认的作用。手写签名应用于纸质文件,数字签名应用于数据。手写签名针对纸质文件内容确认,数字签名对数据进行摘要处理。两种方式都离不开签名实体,其校验方法也基本一致。
无论是手写签名还是数字签名,如果离开了签名实体(文件或数据)就没有了意义。如果经过手写签名的文件被修改了,我们可以认为该文件无效。同理,经过数字签名的数据可以通过验证签名操作辨别该数据是否被修改。
相信大多数读者朋友都使用过微软的操作系统(如Windows XP),在安装该系统时需要输入一个25位的产品密钥,系统会验证这个产品密钥是否合法,这其实就是一个签名验证的过程。

前置知识点:消息摘要算法

消息摘要是一种通过对任意长度的输入数据进行处理,生成固定长度的输出字符串的算法。它也被称为哈希函数或散列函数。消息摘要具有以下特点:

  1. 固定长度输出: 无论输入数据的长度如何,消息摘要算法生成的输出都是固定长度的。常见的摘要长度包括128位、256位等。

  2. 唯一性: 不同的输入数据应该生成不同的摘要。即使输入数据的细微变化,输出的摘要也应该发生明显的变化。这种性质称为抗碰撞性。

  3. 不可逆性: 由摘要生成原始输入的过程是不可逆的。即使知道摘要值,也应该极其困难(理论上不可能)从摘要值还原出原始输入数据。

  4. 高效性: 摘要算法应该能够在合理的时间内处理大量数据并生成摘要。

消息摘要在信息安全领域中有多种应用,包括:

  • 数据完整性验证: 通过比较发送和接收方计算的消息摘要,可以验证数据是否在传输过程中被篡改。

  • 密码学应用: 消息摘要用于生成数字签名、密码学哈希函数等,以确保数据的安全性和不可篡改性。

  • 存储密码学: 在存储密码学中,消息摘要常用于存储密码的安全存储,以防止密码泄露后被逆向还原。

一些常见的消息摘要算法包括MD5(较为不安全,不建议使用)、SHA-1(已经被证明不安全)、SHA-256、SHA-3等。在选择摘要算法时,安全性和性能都是需要考虑的因素。SHA-256和SHA-3目前是比较常见且被广泛接受的安全摘要算法。

数字签名算法

数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说,数字签名算法是非对称加密算法和消息摘要算法的结合体

数字签名算法的由来

数字签名算法是公钥基础设施 (Public Key lnfrastructure,PKI) 以及许多网络安全机制 (SSL/TLS、VPN等)的基础。
数字签名算法要求能够验证数据完整性、认证数据来源,并起到抗否认的作用。这3点与OSI参考模型中的数据完整性服务、认证(鉴别) 服务和抗否认性服务相对应。
消息摘要算法是验证数据完整性的最佳算法,因此,该算法成为数字签名算法中的必要组成部分。

基于数据完整性验证,我们希望数据的发送方(以下称甲方)可以对自己所发送的数据做相应的处理(签名处理),同时给出对应的凭证(签名),并且数据的接收方(以下称乙方)可以验证该签名是否与数据甲方发送的数据相符

如果任何机构都可以进行签名处理,那签名本身就失去了验证的意义。因此,签名操作只能由甲方来完成,验证签名操作则由乙方来完成。既然签名操作仅限于甲方,那么签名操作本身是基于甲方的某些私有信息完成的操作。并且,用于验证操作的相关信息是由甲方公布给乙方。

用于签名的相关信息私有,用于验证的相关信息公有,且这两种信息必须成对出现。非对称加密算法中的私钥和公钥满足这种关系,成为数字签名算法中的重要元素。

数字签名算法包含签名和验证两项操作,遵循“私钥签名,公钥验证”的签名/验证方式,签名时需要使用私钥和待签名数据,验证时则需要公钥、签名值和待签名数据,其核心算法主要是消息摘要算法。因此,我们可以把数字签名算法近似看成是一种附加了公钥和私钥的消息摘要算法

与摘要值的表示方式相同,签名值也常以十六进制字符串的形式来表示。

数字签名算法在实际运用的过程

需要注意的是,数字签名算法在实际运用时,通常是先使用消息摘要算法对原始消息做摘要处理,然后再使用私钥对摘要值做签名处理,验证签名时,则使用公钥验证消息的摘要值。

数字签名算法的目的是确保消息的完整性、身份认证和防篡改。在实际运用中,通常采用以下步骤:

  1. 消息摘要:使用消息摘要算法(如MD5、SHA-1、SHA-256)对原始消息进行摘要处理,生成摘要值。摘要是一个固定长度的字符串,唯一标识了原始消息。

  2. 签名处理:使用私钥对摘要值进行签名处理。签名处理使用非对称加密算法(如RSA、DSA、ECDSA),其中私钥用于生成签名,确保只有私钥持有者能够生成签名。

  3. 验证签名:在验证签名时,需要使用公钥对消息摘要值进行验证。公钥是私钥的配对密钥,公钥可以公开给其他人使用。验证过程是通过使用公钥解密签名,得到一个摘要值,与原始消息生成的摘要进行对比。如果二者一致,说明签名是有效的,消息没有被篡改。

通过这样的流程,数字签名算法实现了对消息的加密签名和验证,确保了消息的完整性和身份认证。只有持有私钥的人才能够生成签名,而任何人都可以使用公钥来验证签名。这种机制使得数字签名在网络通信、电子商务等领域被广泛应用。

附加:签名和摘要值的解释

为了更好理解,这里解释一下 签名和摘要值的区别和联系:
区别:

  • 摘要值是对原始消息使用摘要算法处理后得到的结果,是一个固定长度的字符串,用于唯一标识原始消息。摘要值的目的是确保消息的完整性,防止消息在传输过程中被篡改。
  • 签名是对摘要值使用私钥进行加密得到的结果,也是一个固定长度的字符串。签名的目的是为了确保消息的身份认证,即确认消息是由私钥持有者生成的,防止冒充和伪造。

联系:

  • 摘要值是签名的前置步骤:在使用私钥对摘要值进行签名之前,需要首先使用摘要算法对原始消息进行摘要处理。摘要值作为签名的输入之一,保证了签名的可靠性。
  • 验证签名时使用摘要值进行对比:在验证签名的过程中,会使用公钥对签名进行解密,得到一个摘要值。然后将原始消息使用相同的摘要算法生成一个摘要值,将两个摘要值进行对比,如果一致,则说明签名是有效的。

签名和摘要值是数字签名算法中密切相关的概念,摘要值保证了消息的完整性,而签名则用于身份认证和防篡改。

数字签名算法的家谱

数字签名算法主要包括RSA、DSA和ECDSA共3种算法。其中,RSA算法源于整数因子分解问题,DSA和ECDSA算法源于离散对数问题。
作为非对称加密算法,RSA算法堪称典型,同样也是数字签名算法中的经典。基于RSA算法密钥,结合消息摘要算法可形成对应的签名算法。如结合消息摘要算法MD5算法,可形成MD5withRSA算法。
DSA算法是继RSA算法后出现的基于DSS的数字签名算法,旨在形成数字签名标准。DSA算法主要为后续数字签名算法的形成奠定基础。
ECDSA算法是椭圆曲线加密算法ECC与DSA算法的结合,相对于传统签名算法,它具有速度快、强度高、签名短等优点,其用途也越来越广泛。

数字签名算法的消息传递模型

我们继续以消息传递模型为例,介绍基于数字签名算法的消息传递模型。
数字签名算法在应用领域的使用较为简单,在密钥处理方面与一般非对称加密算法无异,只是将加密/解密换成了签名/验证。
无论我们将要介绍哪一种数字加密算法,在构建密钥对这一操作中,都与非对称加密算法无异,尤其是与RSA算法完全一致。
在这里插入图片描述
在图中,甲方作为消息的发送方,乙方作为消息的接收方。我们假设甲乙双方在消息传递之前已将指定了将要使用的数字签名算法(如RSA算法)。为完成签名验证,甲乙双方需要以下操作:
1)由消息发送的一方构建密钥对,这里由甲方完成
2)由消息发送的一方公布公钥至消息接收方,这里由甲方将公钥公布给乙方

完成这两步操作后,甲方向乙方发送的数据就可以做验证了
在这里插入图片描述
图中,甲方向乙方发送数据时需要附加签名,数据与签名形成一则消息发送给接收者。签名与实体(这里指签名前的数据)不可分离,作为一个整体发送给乙方。并且,私钥仅用于签名,公钥仅用于验证。

经典数字签名算法-RSA

RSA算法既是非对称加密算法中的经典,同样也是数字签名算法中的经典。而且在Java语言的世界里,对于RSA算法的支持是最为完整的。

RSA数字签名算法是Diffie和Hellman提出数字签名思想后的第一个数字签名算法,是由Rivest、Shamir和Adleman三人共同完成的,该签名算法源于RSA公钥密码算法的思想,将RSA公钥密码算法按照数字签名的方式运用。RSA数字签名算法是迄今为止应用最为广泛的数字签名算法。

实现

RSA数字签名算法的密钥实现与RSA加密算法一致,算法名称同为“RSA”,密钥产生与转换完全一致。

RSA数字签名算法主要可以分为MD系列和SHA系列两大类。

MD系列主要包括MD2withRSA和 MD5withRSA共 2种 数字签名算法。

SHA系列主要包括SHA1withRSA、SHA224withRSA.SHA256withRSA、SHA384withRSA和SHA512withRSA共 5种数字签名算法。其中,SHA224withRSA.SHA256withRSA、SHA384withRSA和SHA512withRSA这4种数字签名算法需要由第三方加密组件包提供,例如 Bouncy Castle。
Java 6则 只提供了MD2withRSA、MD5withRSA和SHA1withRSA共3种数字签名算法。

有关RSA数字签名算法的Java6实现与Bouncy Castle实现细节如表所示:在这里插入图片描述

数字签名标准算法-DSA

RSA作为经典数字签名算法,很快就成了数字签名算法的研究对象,并逐步转为标准一DSS,并形成了DSA算法,这为后续数字签名算法的提出奠定了基础,如ECDSA (圆曲线数字签名算法)。
1991年,美国国家标准技术协会公布了数字签名标准 ( Digital signatureStandard,DSS),于1994年正式生效,并作为美国联邦信息处理标准。DSS本质上是ElGamal数字签名算法, DSS使用的算法称为数字签名算法 (Digital Signature Algorithm,DSA)。
DSA算法与RSA算法都是数字证书中不可或缺的两种算法。两者不同的是,DSA算法仅包含数字签名算法,使用DSA算法的数字证书无法进行加密通信,而RSA算法既包含加密/解密算法,同时兼有数字签名算法。

实现

Java 6提供了DSA算法实现,在实现层面,我们可以认为DSA算法实现就是RSA数字签名算法实现的简装版。与RSA数字签名算法实现相比,DSA算法仅支持SHA系列的消息摘要算法。Java 6仅支持SHA1withDSA算法,通过Bouncy Castle可以SHA384withDSA和扩 展 SHA224withDSA、SHA256withDSA、SHA512withDSA共4种数字签名算法。
在这里插入图片描述

需要注意的是,DSA密钥长度默认为1024位,密钥长度必须是64的倍数,范围在512~1024位之间 (含)。DSA算法的签名长度与密钥长度无关,且长度不唯一。

圆曲线数字签名算法-ECDSA

对微软 (Microsoft) 产品有所了解的读者朋友可能对于这个算法的名称不会太陌生,它正是微软操作系统及办公软件的序列号验证算法。序列号是什么? 正是微软为其软件经过签名得到的签名值!

ECDSA是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm)的缩写。它是一种非对称加密算法,用于确保数字数据的完整性和认证发送方的身份。ECDSA基于椭圆曲线密码学,通过利用椭圆曲线上的数学运算来实现数字签名的生成和验证。

与传统的非对称加密算法(如RSA)相比,ECDSA在相同的安全级别下使用更短的密钥长度,从而提供了更高的性能和更小的资源需求。这使得ECDSA成为许多安全协议和应用程序中的首选选择,特别是在有限的资源环境中,如移动设备和物联网设备。

ECDSA的基本流程包括私钥的签名生成和公钥的验证。签名方使用私钥对消息进行签名,而验证方使用相应的公钥验证签名的有效性。这种算法的安全性基于椭圆曲线离散对数问题,即在椭圆曲线上找到给定点的私钥,从而在实际应用中提供了强大的安全性。

总结

数字签名算法是公钥基础设施 (Public Key Infrastructure,PKI) 以及许多网络安全机制 (SSL/TLS、VPN等) 的基础。数字签名算法包含签名和验证两项操作,遵循“私钥签名,公钥验证”的签名/验证方式,签名时需要使用私钥和待签名数据,其核心算法主要是消息摘要算法。因此,我们可以把数字签名算法近似看成是-种附加了公钥和私钥的消息摘要算法。

数字签名算法主要包括RSA、DSA和ECDSA共3种算法。其中,RSA算法源于整数因子分解问题,DSA和ECDSA算法源于离散对数问题。

RSA算法是数字签名算法中的经典,主要可以分为MD系列和SHA系列两大类。

RSA算法是目前应用最为广泛的非对称加密算法和数字签名算法,在电子商务和产品验证方面均有使用。

DSA算法是继RSA算法后出现的基于DSS的数字签名算法,旨在形成数字签名标准。并且, DSA算法本身不包含任何消息摘要算法。DSA算法主要为后续数字签名算法的形成奠定基础。

Java 提供了DSA算法实现,在实现层面,我们可以认为DSA算法实现就是RSA数字签名算法实现的简装版.

ECDSA算法相对传统签名算法具有速度快、强度高、签名短等优点,其用途也越来越广泛。微软操作系统的25位的产品密钥中就使用了圆曲线签名算法,产品密钥就是签名的十六进制串表示形式。

参考

《Java加密与解密的艺术》

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

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

相关文章

Grafana UI 入门使用

最近项目上需要使用Grafana来做chart,因为server不是我在搭建,所以就不介绍怎么搭建grafana server,而是谈下怎么在UI上具体操作使用了。 DOCs 首先呢,贴一下官网doc的连接,方便查询 Grafana open source documenta…

大数据StarRocks(三) StarRocks数据表设计

1. 列式存储 1.1 列式存储方式有以下几个优点: 1.快速的数据查询 由于数据是按照列进行存储的,所以查询某个列时只需要读取该列所在的块,而不是整行数据,从而大大提高了查询效率。 2.压缩效率高 由于列式存储的数据块中只有一…

在docekr中运行openwrt镜像

1镜像下载 地址: https://archive.openwrt.org/releases/23.05.1/targets/x86/64/ #linux 下下载命令为 wget https://archive.openwrt.org/releases/23.05.1/targets/x86/64/openwrt-23.05.1-x86-64-rootfs.tar.gz ./#加载镜像 docker import openwrt-23.05.1-x…

计算机毕业设计——基于SSM+Layui的图书管理系统(附源码)

1,项目背景 国家大力推进信息化建设的大背景下,城市网络基础设施和信息化应用水平得到了极大的提高和提高。特别是在经济发达的沿海地区,商业和服务业也比较发达,公众接受新事物的能力和消费水平也比较高。开展商贸流通产业的信息…

HTML5-简单文件操作

文件操作 简介 概念&#xff1a;可以通过file类型的input控件或者拖放的方式选择文件进行操作 语法格式&#xff1a; <input type"file" multiple>属性 multiple&#xff1a;表示是否选择多个文件 accept&#xff1a;用于设置文件的过滤类型&#xff08;MI…

ThreadLocal线程重用导致用户信息错乱的 Bug

在生产上遇到一个诡异的问题&#xff0c;有时获取到的用户信息是别人的。查看代码后&#xff0c;我发现他使用了 ThreadLocal 来缓存获取到的用户信息。 我们知道&#xff0c;ThreadLocal 适用于变量在线程间隔离&#xff0c;而在方法或类间共享的场景。如果用户信息的获取比较…

AI:106-基于卷积神经网络的遥感图像地物分类

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Linux22.04系统安装显卡驱动,cuda,cudnn流程

1. 安装显卡驱动 ubuntu-drivers deices显示所有适配显卡的驱动型号&#xff0c;recommended为推荐安装 安装 sudo apt install nvidia-driver-440重启 sudo reboot验证 nvidia-smi2. 安装cuda 在 CUDA Toolkit 的下载页面选择系统版本和安装方式&#xff0c;下载并运行…

[Flutter]WindowsOS上运行遇到的问题总结

[Flutter]WindowsOS上运行遇到的问题总结 写在开头 Flutter项目已能在移动端完美使用后&#xff0c;想看看在桌面端等使用情况 基于Flutter3.0后已支持Windows/MacOS等桌面端&#xff0c;不过具体的系统&#xff0c;还需要看下官方文档解释。 这里抛出文档地址&#xff0c;可…

代码随想录刷题笔记(DAY 8)

今日总结&#xff1a;最后一道题解决的比较糟糕&#xff0c;后续会补上新解法&#xff0c;今天还是将中心放在了前端。 Day 8 01. 反转字符串&#xff08;No. 344&#xff09; 题目链接 代码随想录题解 1.1 题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。…

医院信息系统集成平台—Ensemble集成平台中间件

Ensemble HIE(健康信息交换)是InterSystems公司一个新的产品,它采用了一种全新的解决方案,是一个强大的应用软件整合平台,它包括了为医疗信息交换预先开发好的组件,使用Ensemble可以快速地整合和开发复合应用程序。Ensemble在增强现有软件功能、协调新的商业过程和集中企…

力扣hot100 二叉树的层序遍历 BFS 队列

&#x1f468;‍&#x1f3eb; 题目地址 时间复杂度&#xff1a; O ( n ) O(n) O(n)空间复杂度&#xff1a; O ( n ) O(n) O(n) &#x1f60b; 队列写法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode…

Java 第19章 IO流 课堂练习+本章作业

文章目录 Buffered流拷贝二进制文件创建文件写入文本读取文本文件存读Properties文件 Buffered流拷贝二进制文件 package com.hspedu.chapter19.outputStream;import java.io.*;public class BufferedCopy02 {public static void main(String[] args) {String srcFilePath &q…

【面试高频算法解析】算法练习2 回溯

目录 前言算法解析练习题组合总和全排列II单词搜索 前言 本篇章开放目的是按算法类型学习算法&#xff0c;学习对应算法理论&#xff0c;并通过练习一些经典算法题深入理解这类算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 算法解析 回溯&#xff…

Canal+RabbitMQ实现MySQL数据同步至ClickHouse

ClickHouse作为一个被广泛使用OLAP分析引擎&#xff0c;在执行分析查询时的速度优势很好的弥补了MySQL的不足&#xff0c;但是如何将MySQL数据同步到ClickHouse就成了用户面临的第一个问题。本文利用Canal来实现ClickHouse实时同步MySQL数据&#xff0c;使用RabbitMQ来做消息队…

FreeRTOS——计数型信号量知识总结及实战

1计数型信号量概念 1&#xff09;计数型信号量相当于队列长度大于1 的队列&#xff0c;因此计数型信号量能够容纳多个资源 2&#xff09;适用场景&#xff1a; 事件计数&#xff1a; 当每次事件发生后&#xff0c;在事件处理函数中释放计数型信号量&#xff08;计数值1&#x…

【C语言】汉诺塔问题/数据结构经典问题/详细总结讲解

1. 前言 汉诺塔问题是一个经典的递归问题&#xff0c;源于印度的一个古老传说。这个问题的特点是其独特的解决方式&#xff0c;需要将一堆盘子从一个柱子移动到另一个柱子&#xff0c;每次只能移动一个盘子&#xff0c;并且不能将一个较大的盘子放在较小的盘子上面。这个问题的…

在Docker中安装Tomact

目录 前言&#xff1a; 一.安装Tomact 查找指定的tomact版本 下载tomact9.0 查看该镜像是否安装成功 安装成功之后就开始运行镜像了 ps&#xff08;用于列出正在运行的Docker容器&#xff09; ​编辑 测试(虚拟机ip:8080) ​编辑 解决措施 ​编辑 完成以上步骤&…

如何将本文中的表情符号,使用正则表达式pattern,匹配并替换

如下面的文本: xxxxx \uD83E\uDD1F xxxxx 🤟 xxxxx \uD83E\uDD1Fxxxxx 🤟如何替换这些特殊的unicode呢? 我们先学习下常见的正则: 基本的 Unicode 属性分类 \p{L}|\p{Letter} 字母 \p{M}|\p{Mark

LabVIEW在高精度机器人视觉定位系统中的应用

在现代工业自动化中&#xff0c;精确的机器人视觉定位系统对于提高生产效率和产品质量至关重要。LabVIEW软件&#xff0c;以其卓越的图像处理和自动化控制功能&#xff0c;在这一领域发挥着重要作用。本案例将展示LabVIEW如何帮助开发和实现一个高精度的机器人视觉定位系统&…