首页 > 编程语言 >Python使用RSA+MD5实现数字签名

Python使用RSA+MD5实现数字签名

时间:2023-06-09 20:05:44浏览次数:43  
标签:数字签名 verify 报文 RSA rsa Python signature message


数字签名主要有防抵赖防篡改两种功能:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名,二是能确定消息的完整性。

作为具体实现,发送报文时,发送方用一个哈希函数(例如MD5SHA-1SHA-256SHA-384SHA-512)从报文文本中生成报文摘要,然后用自己的私钥(由RSA或其他公钥密码体制算法生成,只有发送方本人知道,需保密)对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公钥(必须与发送方的私钥配对使用,无法对其他人私钥加密的信息进行正确解密)来对报文附加的数字签名进行解密,如果能够正确解密并且这两个摘要相同、那么接收方就能确认该数字签名是发送方的。

下面的代码演示了Python扩展库rsa中数字签名的用法。

>>> import rsa
#生成配对的公钥和私钥
>>> publicKey, privateKey = rsa.newkeys(3000)
>>> message = 'Hello world.'
#签名,也可以指定其他哈希算法
>>> signature = rsa.sign(message.encode(), privateKey, 'MD5')
#验证签名
>>> print(rsa.verify(message.encode(), signature, publicKey))
True
#消息错误
>>> print(rsa.verify('message'.encode(), signature, publicKey))
Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    print(rsa.verify('message'.encode(), signature, publicKey))
  File "C:\Python 3.5\lib\site-packages\rsa\pkcs1.py", line 322, in verify
    raise VerificationError('Verification failed')
rsa.pkcs1.VerificationError: Verification failed
#签名错误
>>> print(rsa.verify(message.encode(), signature+b'0', publicKey))
Traceback (most recent call last):
  File "<pyshell#63>", line 1, in <module>
    print(rsa.verify(message.encode(), signature+b'0', publicKey))
  File "C:\Python 3.5\lib\site-packages\rsa\pkcs1.py", line 308, in verify
    raise VerificationError('Verification failed')
rsa.pkcs1.VerificationError: Verification failed

标签:数字签名,verify,报文,RSA,rsa,Python,signature,message
From: https://blog.51cto.com/u_9653244/6450960

相关文章

  • Python+tensorflow计算整数阶乘的方法与局限性
    本文代码主要演示tensorflow的基本用法。importtensorflowas#创建变量,保存计算结果start=tf.Variable(1,dtype=tf.int64)#初始化变量的opinit_op=tf.global_variables_initializer()#启用默认图withtf.Session()assess:#初始化变量sess.run(ini......
  • Python使用scipy进行多项式计算与符号计算
    本文代码主要演示如何使用poly1d进行多项式计算和符号计算。fromscipyimport>>>p1=poly1d([1,2,3,4])#输出结果中,第一行的数字为第二行对应位置项中x的指数>>>print(p1)321x+2x+3x+4#等价于p2=(x-1)(x-2)(x-3)(x-4)>>>p2=poly1d([1,2,3......
  • Python中else关键字的常见用法
    Python中的else常见用法有三:选择结构、循环结构和异常处理结构。(1)选择结构这应该是最常见的用法,与关键字if和elif组合来使用,用来说明条件不符合时应执行的代码块。(2)循环结构Python中的for循环和while循环都可以带else子句,如果循环是因为条件不再成立而自然结束时会执行else中的代码......
  • Python实现字符串与指定密钥循环异或加解密
    异或运算在很多密码学算法中都有不同程度的应用,其运算特定在于一个数和另一个数连续异或两次仍得到原来的数。在实际使用中,因为要加密的信息和所使用的密钥在大多数情况下是不等长的,所以经常需要循环使用密钥。defcrypt1(source,key):'''source是要加密或解密的字符串,key是......
  • 详解Python生成器函数和生成器对象的原理和用法
    包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。yield语句与return语句的作用相似,都是用来从函数中返回值。与return语句不同的是,return语句一旦执行会立刻结束函数的运行,而每次执行到yield语句并返回一个值之后会暂停后面代码的执行,下次通过生成器对象的__n......
  • Python 3.6+Django开发入门小案例(自动变化的问候)完整步骤
    第一步:在命令提示符环境使用pipinstalldjango命令安装django第二步:在命令提示符环境使用pythondjango-admin.pystartprojectdjango_greeting命令创建网站django_greeting第三步:利用资源管理器在网站目录django_greeting中创建子文件夹templates,并在该子文件夹中创建文件gree......
  • Python批量提取PDF文件中的文本
    首先需要执行命令pipinstallpdfminer3k来安装处理PDF文件的扩展库。importosimportsysimporttimepdfs=(pdfsforpdfsinos.listdir('.')ifpdfs.endswith('.pdf'))forpdf1inpdfs:pdf=pdf1.replace('','_').replace('-......
  • 基于Python+tkinter+pygame的音乐播放器完整源码
    importosimporttkinterimporttkinter.filedialogimportrandomimporttimeimportthreadingimportpygamefolder=''defplay():#folder用来表示存放MP3音乐文件的文件夹globalfoldermusics=[folder+'\\'+musicfo......
  • 最优的素数判断代码(Python)是这样写出来的
    素数判断是个很经典的问题,各种语言的程序设计课程都会涉及到,按照素数定义(除了1和自身,素数没有其他因数)很容易写出下面的代码:defisPrime1(n):foriinrange(2,n):ifn%i==0:returnFalsereturnTrue功能完全没有问题,就是非常非常非常非常慢。......
  • Python代码覆盖性测试入门
    覆盖测试通过代码分析工具和跟踪钩子来判断哪些代码可执行以及哪些代码被执行了,是对单元测试的有效补充,可以用来判断测试的有效性。Python扩展库coverage可以实现对Python代码的覆盖测试,使用pip工具安装之后,可以使用命令“coveragerunfile.py”对Python程序file.py进行覆盖测试,然......