IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【图解DSA数字签名算法】DSA签名算法的Python实现 | 物联网安全 | 信息安全 -> 正文阅读

[数据结构与算法]【图解DSA数字签名算法】DSA签名算法的Python实现 | 物联网安全 | 信息安全

DSA数字签名算法基于SHA1哈希算法,关于SHA1的实现看另一篇文章。

一、什么是DSA

数字签名标准(DSS)由NIST公布,该标准能够使接收者能够验证数据的完整性和数据发送者的身份而制定,所采用的算法称为DSA算法,也称为DSA签名

二、DSA签名算法流程

在这里插入图片描述
DSA签名涉及四个参数,p,q,g,y和x,中前四者构成公钥,x为私钥(x<q)。

依据DSS标准,p为512~1024位,q是160位长的素数,且q|p-1;g=h(p-1)/q mod p,其中h是一整数,1<h<(p-1)且(h(p-1)/q mod p)>1;H(m)为参与签名的杂凑值,DSS选用SHA杂凑算法

(1)DSA 签名过程:

  用户随机选取k要求0<k<q,计算:

在这里插入图片描述

(2)DSA验证过程:

 接收者收到M,r,s后,首先验证0<r<q, 0<s<q,如果通过则计算:

在这里插入图片描述
如果v=r,则确认签名正确

三、具体实现过程(附代码)

我们实验要求参数可以设置成较小的,方便计算,如果大家严格按照算法参数要求设置需要改动。

(1)参数设置

算法的一些参数可以看要求设置成随机数,符合大小要求即可,我这里直接使用固定值先进行计算。
参数:
P、Q、H:人员输入,P要求是素数,512-1024位且位数L为64的倍数,Q为p-1的素因数比特长度160位,H是一个整数且1<H<p-1,并且要求g=h^(p-1)/q modp>1
X:(私钥)随机或伪随机整数,0<x<q,我这里设置成了75
K:随机数,0<k<q,我这里设置成了50

pqh = input("请输入P,Q,H的值:\n").split()
p, q, h = int(pqh[0]), int(pqh[1]), int(pqh[2])

g = int((h**(int((p-1)/q))) % p)

k = 50
x = 75
y = int(g**x % p)

print(f"P:{p},Q:{q},G:{g},x:{x},y:{y}")

(2)乘法逆元

乘法逆元:若存在正整数a,b,p, 满足ab = 1(mod p), 则称a 是b 的乘法逆元, 或称b 是a 的乘法逆元。
在这里插入图片描述

def EX_GCD(a, b, arr):  # 扩展欧几里得
    if b == 0:
        arr[0] = 1
        arr[1] = 0
        return a
    g = EX_GCD(b, a % b, arr)
    t = arr[0]
    arr[0] = arr[1]
    arr[1] = t - int(a / b) * arr[1]
    return g


def ModReverse(a, n):  # ax=1(mod n) 求a模n的乘法逆x
    arr = [0, 1, ]
    gcd = EX_GCD(a, n, arr)
    if gcd == 1:
        return (arr[0] % n + n) % n
    else:
        return -1

(3)签名

def sign(g, p, q, x, M):
    r = int((g**k % p) % q)
    s = int((ModReverse(k, q)*(M+x*r)) % q)
    print(f"签名为({r}, {s})")
    return r, s

(4)验证

def verify(g, p, q, y, M, r, s):
    w = int(ModReverse(s, q) % q)
    u1 = int((M*w) % q)
    u2 = int(r*w % q)
    v = int(((g**u1)*(y**u2) % p) % q)
    print(f"lc(w,u1,u2,v)=({w},{u1},{u2},{v})")
    if v == r:
        print("签名有效")
    else:
        print("签名无效")

四、跟着demo去debug

这里使用给出两组数据供大家调试,一组来源于课本,一组来源于网络。

(1)示例1:
在这里插入图片描述
在这里插入图片描述
(2)示例2:
在这里插入图片描述

五、完整代码

本次实验课作业上交后补充

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:01:27  更:2022-04-22 19:01:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:26:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码