当前位置: 首页 > java >正文

【密码学】7. 数字签名

目录

  • 数字签名
    • 数字签名的基本概念
    • RSA 数字签名
    • ElGamal 数字签名
    • 数字签名标准(DSS)
    • 其他数字签名
      • 基于离散对数问题的数字签名
      • 基于大整数分解问题的数字签名
      • 具有特殊用途的数字签名

数字签名

数字签名的基本概念

  1. 核心特性
    • 不可伪造性:仅签名者能生成合法签名,他人无法伪造。
    • 认证性:接收者可确认签名来自签名者。
    • 不可重复使用性:一个消息的签名不能用于其他消息。
    • 不可修改性:消息签名后无法被篡改。
    • 不可否认性:签名者事后不能否认自己的签名。
  2. 签名体制组成
    • 签名算法:输入消息 mmm 和密钥 kkk,输出签名 s=Sigk(m)s = Sig_k(m)s=Sigk(m)
    • 验证算法:输入消息 mmm 和签名 sss,输出 “真” 或 “伪”(Ver(m,s)Ver(m, s)Ver(m,s))。
    • 安全性基础:从 mmmsss 难以推出密钥 kkk,或伪造可验证的消息 - 签名对。
  3. 分类方式
    • 按用途:普通数字签名、特殊用途签名(盲签名、不可否认签名、群签名、代理签名等)。
    • 按消息恢复功能:具有消息恢复功能、不具有消息恢复功能。
    • 按随机数使用:确定性数字签名、随机化数字签名。

RSA 数字签名

  1. 参数与密钥生成
    • 选两个保密大素数 pppqqq,计算 n=pqn = pqn=pq,欧拉函数 φ(n)=(p−1)(q−1)φ(n) = (p-1)(q-1)φ(n)=(p1)(q1)
    • 随机选 eee1<e<φ(n)1 < e < φ(n)1<e<φ(n)gcd(e,φ(n))=1gcd(e, φ(n)) = 1gcd(e,φ(n))=1),计算 ddd 满足de≡1modφ(n)de ≡ 1 mod φ(n)de1modφ(n)
    • 公钥为 (e,n)(e, n)(e,n),私钥为 ddd
  2. 签名与验证
    • 签名:对消息 m∈Znm ∈ ZₙmZns=Sigk(m)=mdmodns = Sig_k(m) = m^d mod ns=Sigk(m)=mdmodn
    • 验证:若 m=semodnm = s^e mod nm=semodn,则签名有效。
  3. 缺陷
    • 伪造随机消息签名:选 sss,计算 m=semodnm = s^e mod nm=semodn,则 sssmmm 的伪造签名。
    • 对消息组合脆弱:若 m1m_1m1 的签名为 s1s_1s1m2m_2m2 的签名为 s2s_2s2,则 m1m2m_1m_2m1m2 的伪造签名为 s1s2modns_1s_2 mod ns1s2modn(因 (m1m2)d=m1dm2dmodn(m_1m_2)^d = m_1^dm_2^d mod n(m1m2)d=m1dm2dmodn)。
    • 消息长度限制:仅能对 log2nlog_2nlog2n 位消息签名,长消息需分组,导致签名变长、运算量增加。
  4. 改进方法
    • 对消息的 Hash 值签名:签名 s=h(m)dmodns = h(m)^d mod ns=h(m)dmodn,验证时检查 h(m)=semodnh(m) = s^e mod nh(m)=semodnhhh 为 Hash 函数)。

ElGamal 数字签名

  1. 参数与密钥生成
    • 选大素数 pppgggZp∗Z_p*Zp 的本原元(pppggg 公开)。
    • 随机选 xxx1≤x≤p−21 ≤ x ≤ p-21xp2),计算 y=gxmodpy = g^x mod py=gxmodp
    • 公钥为 yyy,私钥为 xxx
  2. 签名与验证
    • 签名:对消息 mmm,随机选 kkk1≤k≤p−21 ≤ k ≤ p-21kp2),计算 r=gkmodpr = g^k mod pr=gkmodps=(h(m)−xr)k−1mod(p−1)s = (h(m) - xr)k^{-1} mod (p-1)s=(h(m)xr)k1mod(p1)hhh 为 Hash 函数),签名为(r,s)(r, s)(r,s)
    • 验证:若 yr∗rs≡gh(m)modpy^r * r^s ≡ g^{h(m)} mod pyrrsgh(m)modp,则签名有效。

数字签名标准(DSS)

  1. 参数与密钥生成
    • pppLLL 位素数(512≤L≤1024512 ≤ L ≤ 1024512L1024LLL 是 64 的倍数),qqq:160 位素数且 q∣(p−1)q | (p-1)q(p1)
    • hhh1<h<p−11 < h < p-11<h<p1),计算 g=h(p−1)qmodpg = h^{(p-1) \over q} mod pg=hq(p1)modpggg 为生成元)。
    • 随机选 xxx0<x<q0 < x < q0<x<q),计算 y=gxmodpy = g^x mod py=gxmodp
    • 公开参数 p,q,gp, q, gp,q,g,公钥 yyy,私钥 xxx
  2. 签名与验证
    • 签名:对消息 mmm,随机选 kkk0<k<q0 < k < q0<k<q),计算 r=(gkmodp)modqr = (g^k mod p) mod qr=(gkmodp)modqs=k−1(h(m)+xr)modqs = k^{-1}(h(m) + xr) mod qs=k1(h(m)+xr)modqhhh 为 SHA-1),签名为 (r,s)(r, s)(r,s)
    • 验证:计算 w=s−1modqw = s^{-1} mod qw=s1modqu1=h(m)wmodqu₁ = h(m)w mod qu1=h(m)wmodqu2=rwmodqu₂ = rw mod qu2=rwmodqv=(gu1∗yu2modp)modqv = (g^{u_1} * y^{u_2} mod p) mod qv=(gu1yu2modp)modq,若 v=rv = rv=r,则签名有效。

其他数字签名

基于离散对数问题的数字签名

  1. 离散对数签名方案(通用框架)
    • 参数:大素数 pppqqqp−1p-1p1 的大素因子,g∈Zp∗g ∈ Zₚ*gZpgq≡1modpg^q ≡ 1 mod pgq1modp;私钥 xxx1<x<q1 < x < q1<x<q),公钥 y=gxmodpy = g^x mod py=gxmodp
    • 签名:计算 h(m)h(m)h(m),选 kkk1<k<q1 < k < q1<k<q),得 r=gkmodpr = g^k mod pr=gkmodp,从 ak≡(b+cx)modqak ≡ (b + cx) mod qak(b+cx)modqsssa,b,ca, b, ca,b,c 为参数,如 a=r,b=h(m),c=−ra=r, b=h(m), c=-ra=r,b=h(m),c=r),签名为 (r,s)(r, s)(r,s)
    • 验证:检查 ra≡gb∗ycmodpr^a ≡ g^b * y^c mod pragbycmodp
  2. Schnorr 签名方案
    • 参数:p≥2512p ≥ 2^{512}p2512(素数),q≥2160q ≥ 2^{160}q2160(素数且 q∣p−1q | p-1qp1),g∈Zp∗g ∈ Zₚ*gZpgq≡1modpg^q ≡ 1 mod pgq1modp;私钥 xxx,公钥 y=gxmodpy = g^x mod py=gxmodp
    • 签名:选 kkk,得 r=gkmodpr = g^k mod pr=gkmodpe=h(r,m)e = h(r, m)e=h(r,m)s=(xe+k)modqs = (xe + k) mod qs=(xe+k)modq,签名为 (e,s)(e, s)(e,s)
    • 验证:计算 r′=gs∗y−emodpr' = g^s * y^{-e} mod pr=gsyemodp,若 h(r′,m)=eh(r', m) = eh(r,m)=e,则有效。
  3. Nyberg-Rueppel 签名方案
    • 参数:同 Schnorr(p,q,gp, q, gp,q,g,私钥 xxx,公钥 y=gxmodpy = g^x mod py=gxmodp)。
    • 签名:计算 R(m)R(m)R(m)(冗余函数),选 kkk,得 r=g−kmodpr = g^{-k} mod pr=gkmodpe=r∗R(m)modpe = r * R(m) mod pe=rR(m)modps=(xe+k)modqs = (xe + k) mod qs=(xe+k)modq,签名为 (e,s)(e, s)(e,s)
    • 验证:检查 0<e<p0 < e < p0<e<p0≤s<q0 ≤ s < q0s<q,计算 v=gs∗yemodpv = g^s * y^e mod pv=gsyemodpt=e∗v−1modpt = e * v^{-1} mod pt=ev1modp,若 t∈Rt ∈ RtR 的值域,则恢复 m=R−1(t)m = R^{-1}(t)m=R1(t)

基于大整数分解问题的数字签名

  1. Feige-Fiat-Shamir 签名方案
    • 参数:n=pqn = pqn=pqp,qp, qp,q 为保密素数),kkk 为正整数;私钥 x1,...,xkx_1,..., x_kx1,...,xk,公钥 yi=xi−2modny_i= x_i^{-2} mod nyi=xi2modn
    • 签名:选 rrr,得 u=r2modnu = r² mod nu=r2modne=h(m,u)e = h(m, u)e=h(m,u)ei∈0,1e_i ∈ {0,1}ei0,1),s=r∗Πxieimodns = r * Πx_i^{e^i} mod ns=rΠxieimodn,签名为 (e,s)(e, s)(e,s)
    • 验证:计算 u′=s2∗Πyieimodnu' = s^2 * Πy_i^{e^i} mod nu=s2Πyieimodn,若 h(m,u′)=eh(m, u') = eh(m,u)=e,则有效。
  2. Guillou-Quisquater 签名方案
    • 参数:n=pqn = pqn=pqkkk 满足 gcd(k,(p−1)(q−1))=1gcd(k, (p-1)(q-1)) = 1gcd(k,(p1)(q1))=1;私钥 xxx,公钥 y=x−kmodny = x^{-k} mod ny=xkmodn
    • 签名:选 rrr,得 u=rkmodnu = r^k mod nu=rkmodne=h(m,u)e = h(m, u)e=h(m,u)s=r∗xemodns = r * x^e mod ns=rxemodn,签名为 (e,s)(e, s)(e,s)
    • 验证:计算 u′=sk∗yemodnu' = s^k * y^e mod nu=skyemodn,若 h(m,u′)=eh(m, u') = eh(m,u)=e,则有效。

具有特殊用途的数字签名

  1. 群签名
    • 特点:群体成员可代表群体签名,接收者用群公钥验证但不知具体签名者,争议时管理员可识别签名者。
    • 组成:建立(生成群公钥 / 私钥)、加入(用户成为成员)、签名、验证、打开(识别签名者)。
    • 性质:正确性、不可伪造性、匿名性、不可关联性、可跟踪性、可开脱性、抗联合攻击。
  2. 代理签名
    • 组成:系统建立(参数和密钥)、签名权力委托、代理签名生成、代理签名验证。
  3. 盲签名
    • 用途:匿名性场景(如电子投票、电子现金),签名者不知消息内容及签署对象。
    • 步骤:消息盲化(用户用盲因子处理消息)、盲消息签名(签名者对盲化消息签名)、恢复签名(用户移除盲因子得真实签名)。
http://www.xdnf.cn/news/17517.html

相关文章:

  • 四、RuoYi-Cloud-Plus 部署时nacos配置服务启动
  • Python 中的 Mixin
  • 区块链密码学简介
  • 第05章 排序与分页
  • 详解Windows(十四)——PowerShell与命令提示符
  • 09 【C++ 初阶】C/C++内存管理
  • 【pyqt5】SP_(Standard Pixmap)的标准图标常量及其对应的图标
  • Vulnhub----Beelzebub靶场
  • 深度学习中基于响应的模型知识蒸馏实现示例
  • Vue 使用element plus组件库提示doesn‘t work properly without JavaScript enabled
  • 【自动化运维神器Ansible】playbook实践示例:HTTPD安装与卸载全流程解析
  • Vue 3.6 Vapor模式完全指南:告别虚拟DOM,性能飞跃式提升
  • [TryHackMe]Challenges---Game Zone游戏区
  • ThingsBoard配置邮件发送保姆级教程(新版qq邮箱)
  • 第二十天:余数相同问题
  • 相册管理系统介绍
  • ARMv8 MMU页表格式及地址转换过程分析
  • 当配置项只支持传入数字,即无法指定单位为rem,需要rem转px
  • js零基础入门
  • java之父-新特性
  • 如何搭建ELK
  • 李宏毅深度学习教程 第16-18章 终身学习+网络压缩+可解释性人工智能
  • LeetCode 刷题【36. 有效的数独】
  • 【Datawhale AI夏令营第三期】多模态RAG
  • c++ 容器vector基础
  • 【递归、搜索和回溯】FloodFill 算法介绍及相关例题
  • Zread:把 GitHub 仓库“一键变说明书”的体验与实战指南
  • AutoML 的下半场——从“模型选择”到“端到端业务闭环”
  • Redhat Linux 9.6 配置本地 yum 源
  • Java类和对象课上练习题目设计