首页 > 编程语言 >python实现数字签名算法 (DSA)

python实现数字签名算法 (DSA)

时间:2024-08-31 19:52:12浏览次数:14  
标签:验证 数字签名 self python 签名 key DSA mod

目录

数字签名算法 (DSA) 介绍

数字签名算法 (Digital Signature Algorithm, DSA) 是一种基于公钥加密的数字签名标准。它被广泛用于确保数据的完整性、认证消息的来源以及验证消息的身份真实性。DSA于1991年由美国国家标准与技术研究院 (NIST) 提出,并成为数字签名标准 (DSS) 的一部分。

DSA 的数学基础

DSA 基于离散对数问题,其安全性依赖于大素数域上求解离散对数的困难性。其核心思想是生成一个数字签名来验证消息的来源和完整性。DSA 主要依赖以下几个数学概念:

  1. 素数和模运算:DSA的计算是在一个大素数p的有限域内进行的。通常还有一个次大素数qqp-1的一个因子。

  2. 离散对数:基于离散对数问题的困难性,给定y = g^x mod p,已知yg的情况下,计算x是非常困难的。

  3. 哈希函数:DSA使用安全哈希算法(如SHA-1或SHA-256)来生成消息的哈希值。这个哈希值用于签名生成和验证过程中。

DSA 签名生成和验证流程

DSA 的数字签名过程包括三个主要步骤:密钥生成、签名生成和签名验证。

  1. 密钥生成

    • 选择一个大素数p和一个次大素数q,使得qp-1的因子。
    • 选择一个基数g,使得g^q mod p = 1
    • 选择一个随机的私钥x,其中0 < x < q
    • 计算公钥y = g^x mod p
  2. 签名生成

    • 对消息M计算其哈希值H(M)
    • 选择一个随机数k,其中0 < k < q
    • 计算r = (g^k mod p) mod q
    • 计算s = (k^(-1) * (H(M) + xr)) mod q
    • 签名由(r, s)组成。
  3. 签名验证

    • 验证消息的哈希值H(M)
    • 计算w = s^(-1) mod q
    • 计算u1 = (H(M) * w) mod qu2 = (r * w) mod q
    • 计算v = ((g^u1 * y^u2) mod p) mod q
    • 如果v == r,则签名有效,否则无效。

Python 面向对象实现 DSA 签名和验证

下面是 Python 的面向对象实现,模拟 DSA 签名和验证的过程。我们实现了密钥生成、签名生成和签名验证方法。

import hashlib
import random

class DSA:
    def __init__(self, p, q, g):
        """
        初始化DSA参数
        :param p: 大素数p
        :param q: 素数q (p-1的一个因子)
        :param g: 基数g (g^q mod p = 1)
        """
        self.p = p
        self.q = q
        self.g = g
        self.private_key = None
        self.public_key = None

    def generate_keys(self):
        """生成DSA密钥对 (私钥, 公钥)"""
        self.private_key = random.randint(1, self.q - 1)  # 私钥 x
        self.public_key = pow(self.g, self.private_key, self.p)  # 公钥 y = g^x mod p
        return self.private_key, self.public_key

    def sign(self, message):
        """对消息进行签名"""
        if self.private_key is None:
            raise ValueError("私钥未生成!")
        
        # 计算消息的哈希值
        hash_value = int(hashlib.sha256(message.encode()).hexdigest(), 16)
        
        while True:
            k = random.randint(1, self.q - 1)  # 选择随机数k
            r = pow(self.g, k, self.p) % self.q  # 计算r = (g^k mod p) mod q
            
            if r == 0:
                continue
            
            k_inv = pow(k, -1, self.q)  # 计算k的逆元
            s = (k_inv * (hash_value + self.private_key * r)) % self.q  # 计算s
            
            if s != 0:
                break
        
        return (r, s)

    def verify(self, message, signature):
        """验证签名"""
        r, s = signature
        if r <= 0 or r >= self.q or s <= 0 or s >= self.q:
            return False
        
        # 计算消息的哈希值
        hash_value = int(hashlib.sha256(message.encode()).hexdigest(), 16)
        
        w = pow(s, -1, self.q)  # 计算w = s^(-1) mod q
        u1 = (hash_value * w) % self.q  # 计算u1 = (H(M) * w) mod q
        u2 = (r * w) % self.q  # 计算u2 = (r * w) mod q
        
        v = ((pow(self.g, u1, self.p) * pow(self.public_key, u2, self.p)) % self.p) % self.q  # 计算v
        
        return v == r

# 设置DSA的参数
p = 0xA0DC65FFCA79988D900FC52C6C569C21D2A801A1AEB0BE87978DA6DFE24D2060E18B6E1A3C3EF6B6DC70B841BAC3EAA85E0C1896FFB5C3DAA63B79E31B0EED79
q = 0xF7E1A085D69B3DDE00E1DBD1CBF52E3705
g = 0x678471B27A9CF44E431D7C2A23A6C0B7A2B7CCF014A54646DAD0B38C6CCB08A29F2A924BE40A99A51FEAEC9802BCFDECC7E6D3E9EC9D6D79123D91B2AEF9C722

# 创建DSA对象
dsa = DSA(p, q, g)

# 生成密钥对
private_key, public_key = dsa.generate_keys()
print(f"私钥: {private_key}")
print(f"公钥: {public_key}")

# 签名
message = "Hello, DSA!"
signature = dsa.sign(message)
print(f"签名: {signature}")

# 验证
is_valid = dsa.verify(message, signature)
print(f"签名验证结果: {is_valid}")

代码解释

  1. DSA:封装了 DSA 的密钥生成、签名生成和签名验证等操作。

  2. 密钥生成:通过随机选择一个私钥,并使用模幂计算生成公钥。

  3. 签名生成:使用随机数k生成签名(r, s)

  4. 签名验证:通过计算哈希值和验证公式,验证签名的有效性。

场景应用:电子合同签署

假设在一个电子合同系统中,用户需要签署合同并确保合同内容的完整性和真实性。DSA 可以用于生成数字签名,以便接收方可以验证合同是否由正确的签署人签署,并且在传输过程中合同内容没有被篡改。

总结

本文介绍了数字签名算法 (DSA) 的数学基础、签名生成和验证流程,并使用 Python 面向对象的思想完整实现了 DSA 签名和验证过程。DSA 在电子合同、数字证书等领域有着广泛的应用,通过这篇文章和代码实现,相信读者能够更好地理解 DSA 算法的原理及其应用。

标签:验证,数字签名,self,python,签名,key,DSA,mod
From: https://blog.csdn.net/qq_42568323/article/details/141757563

相关文章

  • Python3 AD域操作
    #!/usr/bin/envpython#coding=UTF-8'''https://www.cnblogs.com/haiya2019/p/10627730.html@Author:wjx@Description:AD域@Date:2018-12-2321:23:57@LastEditTime:2019-03-2823:46:56'''fromldap3importServer,Connection,......
  • python——python-docx
    Python的python-docx库:完整说明python-docx是一个用于创建、修改和操作Word文档的Python库。本文将全面介绍如何使用python-docx进行文档创建、格式化、表格操作、图像插入及高级用法。一、安装首先,需要安装python-docx库。可以通过pip安装:pipinstallpython-docx......
  • Python的Matplotlib库详解
    Python的Matplotlib库详解Matplotlib是Python中功能强大的数据可视化库,广泛应用于科研、数据分析、报告生成等领域。它能创建各种类型的图表,帮助用户直观地展示数据。一、使用场景1.数据探索和分析:在数据科学领域,Matplotlib经常被用来绘制各种图表,如折线图、散点图、......
  • python字符画
    fromPILimportImageimportargparse#命令行输入参数处理parser=argparse.ArgumentParser()parser.add_argument('file')#输入文件parser.add_argument('-o','--output')#输出文件parser.add_argument('--width',type=int,de......
  • Python基础知识-7(打包成EXE)
    (目录)一、python处理各种格式文件的模块csv处理CSV文件。xml.etree.ElementTree,xml.dom,xml.sax处理XML文件。前两者会将整个XML文件载入内存,最后一个是循序读入。json处理JSON文件。yaml处理YAML文件tablib处理:CSV,JSON,YAML,Excel,PandasDataFrameconfigparser处理Wi......
  • Python如何进行ADF(Augmented Dickey-Fuller)检验
    microPythonPython最小内核源码解析NI-motion运动控制c语言示例代码解析python编程示例系列python编程示例系列二python的Web神器Streamlit如何应聘高薪职位ADF(AugmentedDickey-Fuller)检验用于检查时间序列数据是否具有单位根,从而判断该序列是否平稳。主要用途平......
  • 【基于python tkinter的本地音乐播放器优化版】
    系列文章目录本地音乐播放器初版本地小说阅读器初版本地小说阅读器优化版文章目录系列文章目录前言一、功能介绍二、使用注意项三、界面展示1)菜单分类:2)关键字搜索3)拓展项4)临时列表四、附件前言前面写了一文,学习开发本地音乐播放器,小试牛刀,界面小气、粗糙且羞涩......
  • 【大数据】Java与Python的无缝对接:探讨Java调用Python的方法与原理
    文章目录一、引言二、Java调用Python的原理1.JNI(JavaNativeInterface)2.Jython3.进程间通信三、Java调用Python的实现方法及示例1.使用JNI调用Python2.使用Jython调用Python3.使用进程间通信调用Python4.性能和安全性考虑5.实际应用场景6.最佳实践四、总结一、......
  • python如何输出对称数
    1.什么是回文数/对称数回文数(PalindromeNumber)是指一个正整数,它从左向右读和从右向左读是完全相同的。换句话说,这个数关于其中心点是对称的。例如,数字12321是一个回文数,因为它从左读(12321)和从右读(12321)都是相同的。回文数可以是任何进制的数,但通常我们在讨论回文数时,指的......
  • 如何开发针对不平衡分类的成本敏感神经网络 python
    如何开发针对不平衡分类的成本敏感神经网络深度学习神经网络是一类灵活的机器学习算法,可以在各种问题上表现良好。神经网络使用误差反向传播算法进行训练,该算法涉及计算模型在训练数据集上产生的误差,并根据这些误差的比例更新模型权重。这种训练方法的局限性在于,每个类别......