数字签名算法实现

article/2025/10/30 12:20:18

一、实验目的
  掌握利用Hash算法对要传送信息提取消息摘要的方法,理解数字签名的作用及数字签名算法的工作原理,了解多种非对称加密算法都可以用来设计数字签名算法。综合运用前面实验掌握的知识和技术,利用C语言或Java语言设计并实现数字签名程序。
二、实验原理
  以往的文件或书信可以通过亲笔签名来证明其真实性,而通过计算机网络传输的信息则通过数字签名技术实现其真实性的验证。
数字签名目前采用较多的是非对称加密技术,其实现原理简单的说,就是由发送方利用Hash算法对要传送的信息进行计算得到一个固定位数的消息摘要值,用发送者的私有密钥加密此消息的Hash值所产生的密文即数字签名。然后将数字签名和消息一同发给接收方。接收方收到消息和数字签名后,用同样的Hash算法对消息进行计算得出新的Hash值,然后用发送者的公开密钥对数字签名解密,将解密后的结果与新的Hash值相比较,如相等则说明报文确实来自发送方。
  下面我们以DSA(Digital Signature Algorithm)为例,介绍数字签名算法。DSA源于ElGamal和Schnorr签名算法,被美国NIST采纳作为DSS(DigitalSignature Standard)数字签名标准。
DSS数字签名算法的具体实现过程见图5-1。
在这里插入图片描述
首先介绍DSS算法的主要参数:
1.全局公开密钥分量
 (1)素数P,2511<p<2512;
 (2)q是(p-1)的一个素因子,2159<q<2160:
 (3)g=h(p-1)/q mod p,其中h是整数,l<h<(p-1)。
2.私钥
 私钥x是随机或伪随机整数,其中0<x<q。
3.公钥
 y=gx mod p,(p,q,g,y)为公钥。
4.用户的随机选择数
 k为随机或伪随机整数,其中0<k<q。
基于以上参数,DSS的签名过程如下:
 r=-(gk mod p)mod q
 s=[k-1 (H(M)+xr)]mod q
则形成了对信息M的数字签名(r’,s’),数字签名和信息M一同发送给接收方。接收方接收到信息M’和数字签名(r’,s’)后,对数字签名的验证过程如下:
 w=(s’)-1 mod q
 ul=[H(M’)w]mod q,u2=(r’)w mod q
 V=[(gu1yu2)mod p]mod q
如果v=r’,则说明信息确实来自发送方。

实验代码:
DSA:数字签名和验证

#-*- coding: UTF-8 -*-
"""DSA:数字签名和验证@author WQ@time 2020/12/20
"""
import random
from Crypto.Hash import SHA
import math
class DSA():"""签名和验证"""def __init__(self):passdef Globalpublickey(self):"""p:满足2^(L-1)<p<2^L的大素数 其中512<=L<=1024 且L为64的倍数q:p-1的素因子,满足2^159<2^160,即q长160比特g:g=h^((p-1)/q)mod p,h是满足1<h<p-1且h^((p-1)/q)mod p>1的任意整数"""n=160#q的长度while True:Q=random.randrange(2**(n-1)+1,2**n-1,2)if self.MillerRabin(Q):self.q=Qbreak while True:i=random.randint(0,8)#满足L是64的倍数L=512+i*64k=random.randint((2**(L-160)-2**(L-163)),(2**(L-160)+2**(L-163)))p=k*self.q+1if self.MillerRabin(p):self.p=pbreakwhile True:h=random.randint(2,self.p-2)#print("shdjsa",(self.p-1)//self.q,k)g=self.modExp(h,(self.p-1)//self.q,self.p)if g>1:self.g=gbreakdef UserKey(self):x=random.randint(1,self.q-1)self.x = x #Usersecretself.y=self.modExp(self.g,self.x,self.p) #Publickeydef MillerRabin(self,n):#素数检测算法"""判断一个数是否是素数,使用Miller-Rabin概率检测法n:待检验的数a:小于n的数如果n暂时测试为素数,则返回true"""if n<2:return Falseif n<=3:return Truebinstr = bin(n-1)[2:]for i in range(8):a = random.randint(2, n)d = 1for i in binstr:x = dd = d*d%nif d==1 and x!=1 and x!=n-1:return Falseif i=='1':d = d*a%nif d!=1:return Falsereturn Truedef modExp(self,a,b,n):"""快速幂取模,a^b%nargs{a:底数b:指数n:取模数}"""ans=1while b:if b&1:ans=self.modMul(ans,a,n)a=self.modMul(a,a,n)b>>=1return ansdef modMul(self,a,b,n):"""快速积取模,a*b%nargs{a:乘数b:乘数n:取模数}"""ans=0while b:if b&1:ans=(ans+a)%na=(a+a)%nb>>=1return ansdef Inverse(self, a,mod):#求秘钥a的逆元 欧几里得算法   x1,x2,x3 = 1,0,mody1,y2,y3 = 0,1,awhile(1):if(y3==0):g=x3breakif(y3==1):g=y3breakq=math.floor(x3/y3)#向下取整t1,t2,t3=x1-q*y1,x2-q*y2,x3-q*y3x1,x2,x3=y1,y2,y3y1,y2,y3=t1,t2,t3if y2<0:y2+=modreturn y2   #逆元求得为y2,y3为gcd(a,26),最大公因数 def signature(self):self.k=random.randint(1,self.q-1)self.k_Reverse=self.Inverse(self.k,self.q)print("用户为待签消息选取的秘密数k:",self.k)print("秘钥数k的逆元:",self.k_Reverse)choice=int(input("请选择待签数据类型-对字符串签名[0],对文件签名[1]:"))if choice==0:message=input("请输入待签消息:")self.data=messageHash=SHA.new(message.encode("utf8")).hexdigest()self.Hash=int(Hash,16)self.r=self.modExp(self.g,self.k,self.p)%self.qself.s=self.modMul(self.k_Reverse,self.Hash+self.x*self.r,self.q)print("用户对消息的签名为:(r,s)\nr:{}\ns:{}".format(self.r,self.s))elif choice==1:filename=input("请输入文件:")with open(filename,'rb') as fp:if not fp:print("请输入正确文件名!")exit(0)data=fp.read()self.data=dataHash=SHA.new(data).hexdigest()self.Hash=int(Hash,16)self.r=self.modExp(self.g,self.k,self.p)%self.qself.s=self.modMul(self.k_Reverse,self.Hash+self.x*self.r,self.q)print("用户对消息的签名为:(r,s)\nr:{}\ns:{}".format(self.r,self.s))return choicedef verification(self,message,flag=0):if flag==0:Hash=SHA.new(message.encode("utf8")).hexdigest()elif flag==1:Hash=SHA.new(message).hexdigest()#print("验证",message,Hash)#print("签名",self.data,hex(self.Hash).replace("0x",""))Hash=int(Hash,16)print("接受到的消息的哈希值:",Hash)w=self.Inverse(self.s,self.q)u1=self.modMul(Hash,w,self.q)u2=self.modMul(self.r,w,self.q)v=self.modMul(self.modExp(self.g,u1,self.p),self.modExp(self.y,u2,self.p),self.p)%self.q#v1=hex(v).replace("0x","")#print("v:",v1,len(v1))#print("r:",hex(self.r).replace("0x",""))#print(len(str(bin(self.q).replace("0b",""))),len(str(bin(self.p).replace("0b",""))))#print(v,self.r)if v==self.r:print("签名有效!")else:print("签名无效!")if __name__ == "__main__":test=DSA()test.Globalpublickey()test.UserKey()print("全局公开钥\nP:{}\nQ:{}\nG:{}".format(test.p,test.q,test.g))print("用户密钥\n秘密钥x:{}\n公开钥y:{}".format(test.x,test.y))opntion=test.signature()print("消息哈希值为",test.Hash)test.verification(test.data,opntion)while True:flag=input("是否继续验证?[y][n]:")if flag.lower()=='y':#opntion=int(input("验证签名的消息类型-[0]字符串[1]文件:"))#test.signature()if opntion==0:message=input("验证消息:")test.verification(message)elif opntion==1:filename=input("请输入文件:")with open(filename,'rb') as fp:if not fp:print("请输入正确文件名!")continuedata=fp.read()test.verification(data,opntion)elif flag.lower()=='n':break

运行结果为:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/tlrvEQAA.shtml

相关文章

数字签名——

数字签名和公钥加密的区别 公钥加密&#xff1a; Alice采用Bob的公钥对消息加密&#xff0c;传给Bob,Bob用自己的私钥解密 数字签名: Alice采用自己的私钥对消息m签名&#xff0c;Alice将消息m和签名发送给Bob收到m和签名后&#xff0c;Bob用Alice的公钥来验证签名的有效性 数…

安全技术 数字签名

&#xff08;一&#xff09;介绍 数字签名是一种将相当于现实世界中的盖章、签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装&#xff0c;还可以防止否认。 通过消息认证码&#xff0c;我们可以识别消息是否被篡改或者发送者身份是否被伪装&#xf…

数字签名技术简介

数字签名&#xff08;又称公钥数字签名&#xff09;是只有信息的发送者才能产生的别人无法伪造的一段数字串&#xff0c;这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用数字签名机制作为保障网络信息安全的…

数字签名技术

目录 一、数字签名 二、数字签名技术 2.1、基于哈希算法的数字签名与验证 2.2、基于非对称密钥加密体制的数字签名与验证 三、数字签名的作用 一、数字签名 数字签名&#xff08;又称公钥数字签名&#xff09;是只有信息的发送者才能产生的别人无法伪造的一段数字串&…

kettle spoon双击打开无反应

环境 windows 10、kettle 8.2、JDK 1.8 、CPU&#xff1a;I7-8565U、内存&#xff1a;16GB kettle的启动文件spoon双击之后&#xff08;也试过以管理员身份运行&#xff09;无反应 一、注册表修复 这个问题在网上各种搜索&#xff0c;查到的资料都是修改spoon里的Xms、Xmx、…

spoon工具的一些小细节问题

version7.1 1.输出乱码问题 &#xff08;1&#xff09;转换中的字段选择可对字段的编码做选择&#xff08;此方法输出到excel可用&#xff09; &#xff08;2&#xff09;数据库输出设置编码——>编辑——>选项&#xff0c;然后添加characterEncoding参数&#xff0c;值…

Kettle工具——Spoon、Kitchen、Pan、Carte

目录 1. Spoon 2. Kitchen和Pan &#xff08;1&#xff09;命令行参数 &#xff08;2&#xff09;例子 3. Carte Kettle里有不同的工具&#xff0c;用于ETL的不同阶段。主要工具如下&#xff1a; Spoon&#xff1a;图形化工具&#xff0c;用于快速设计和维护复杂的ETL工作…

kettle Spoon.bat启动问题

问题 启动Spoon.bat报错 解决方法 一、首先查看本机安装的jdk版本 在cmd命令窗口输入&#xff1a;java -version 能得到版本即为安装成功&#xff08;需要配置环境&#xff09; 一般为1.8&#xff0c;如果版本过高也会导致运行kettle出错 二、尝试修改Spoon.bat中的内存设…

kettle打开spoon.bat后无反应

主要两点 1.配置环境变量 、 2.修改spoon.bat 3.删掉 kettle根目录下E:\pdi-ce-7.1.0.0-12\data-integration\.kettle\db.cache-7.1.0-stable , 删掉db.cache-7.1.0-stable 文件 &#xff1b; 以及 C:\Users\Administrator\.kettle\db.cache-7.1.0-stable &#xff0c; …

spoon.bat打不开或者打开闪退 | 解决办法

1.查看jdk版本&#xff0c;这里jdk必须为1.8及以上&#xff0c;强烈推荐使用jdk1.8&#xff0c;因为jdk1.9和jdk10对于spoon来说都不太稳定&#xff0c;因此最好使用jdk1.8&#xff1b; 查看jdk版本方法&#xff1a;winR再输入cmd然后按回车进入终端界面。 然后在终端输入&…

kettle的图形工具(Spoon)简单介绍

kettle&#xff08;ETL&#xff09;的简单使用 最近刚接手一个新项目&#xff0c;接触了一个叫kettle的工具&#xff0c;这玩意可以用在数据同步&#xff0c;数据清洗&#xff0c;跨数据源等问题&#xff0c;而且不需要写代码&#xff0c;简单易懂。 以下来源百度百科&#xf…

Spoon系列-概要

Spoon系列-概要 概要相关资源主要功能可构建 AST(Abstract Syntax Tree)静态代码分析&#xff08;Static Code Analysis&#xff09; 代码重写转换(Transform) 概要 可对Java 源代码进行分析&#xff0c;重写&#xff0c;转换的开源工具。支持Java13。 相关资源 Source&…

Spoon图形操作

Spoon图形操作 一、 Kettle的导入导出1.1 csv、txt(02、03)1.2 xlsx(Excel)(04)1.3 XML(05)1.4 json(06)1.5 SQL1.5.1 MySQL基础语法1.5.2 Spoon中的数据库操作(08) 1.6 CDC操作(Change Data Capture)(09、10)1.6.1 基于时间戳的CDC1.6.2 基于自增序列的CDC数据导入1.6.3 基于触…

kettle Spoon 的简单使用

Spoon分享 Kettle Spoon简介 ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;&#xff0c;对于企业或行业应用来说&#xff0c;我们经常会遇到各种数据的处理&#xff0c;转换&#xff0c;迁移&#xff0c;了解并掌握一种e…

基于kettle部署图形化界面(spoon)

最近使用kettle部署windows&#xff0c;mac、linux服务遇到的坑做一个总结。 1、mac、linux部署&#xff1a; 1⃣️拉取docker镜像 docker pull hiromuhota/webspoon 2⃣️创建并运行docker容器 docker run -d -p 8080:8080 hiromuhota/webspoon --name webspoon --restar…

数据导入与预处理——1.初步熟悉kettle-Spoon

文章目录 数据文件1.导入2.导出3.分发与复制 提示&#xff1a;以下是本篇文章正文内容&#xff0c;为初步使用spoon软件进行数据的导入导出步骤。 数据文件 1.导入 数据文件的导入 首先建立csv文件格式如下&#xff1a; 打开kettle新建转换&#xff1a; 从输入中找到对应的…

kettle运行spoon.sh启动图形化界面报错处理

一、问题描述&#xff1a; 安装kettle成功后运行spoon.sh显示如下报错&#xff1a; 二、原因分析&#xff1a; 没有安装Xmanager 三、解决方案&#xff1a; 1.下载Xmanager软件&#xff0c;安装教程参考 Xmanager 6标准版详细安装教程_小祥V5的博客-CSDN博客_xmanager安装教程…

问题:Spoon.bat启动不起来

问题&#xff1a;使用kettle进行数据迁移时&#xff0c;Spoon.bat死活启动不起来&#xff0c;尝试各种办法。 运行环境&#xff1a;windows7 64位&#xff0c;jdk1.8及以上&#xff0c;且环境变量配置ok。 检验&#xff1a;cmd->java -version&#xff0c;可以查看。环境变…

Macox kettle安装启动报错:一个未预期的错误发生在Spoon: probable cause:在停止Spoon前,请先关闭其它spoon窗口!

Macox kettle安装启动报错&#xff1a;一个未预期的错误发生在Spoon: probable cause:在停止Spoon前&#xff0c;请先关闭其它spoon窗口! 最近需要从oracle导一批数据到mysql&#xff0c;需要用到kettle&#xff0c;于是下载了mac版的kettle工具&#xff0c;基本步骤如下&…

Kettle spoon 工具实战分享

今天给大家带来一款ETL工具kettle spoon的实践分享 Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。 Kettle这个ETL工具集&#xff0c;它允许你管理来自不同数据库的数据&#xff0c;通过提…