zoukankan      html  css  js  c++  java
  • 第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证

    第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证

    这是密码学52件事系列中第16篇,这周我们描述关于DSA,Schnorr和RSA-FDH的密钥生成,签名和验证.

    1.DSA

    数字签名场景(DSA),也叫数字签名标准(the Digital Signature Standard,DSS),在1991年[1]被NIST(国际标准和技术机构)提出.DSA的安全是基于计算离散对数的困难性上.但是却没有一个基于一个标准困难性假设的证明,即便在随机访问模型里.

    域参数生成

    1.选择一个素数(p),其中(2^{L-1}<p<2^L),同时(L)是64的倍数, (512 le L le 1024)

    2.选择一个(p-1)的质因数(q),其中(2^{159}<q<2^{160})

    3.计算(q)阶子群的生成函数(g):随机选择一个整数(r),其中(1<r<p-1),(g=r^{(p-1)/q} mod p) and (g e 1).

    密钥生成

    1.选择一个随机整数(x),其中(0<x<q)

    2.计算(y=g^x mod p)

    然后公钥是(y),私钥是(x).

    签名

    1.选择一个随机的整数(k),其中(0<k<p)

    2.计算(r=(g^k mod p ) mod q)

    3.计算(s = (h(m)+x*r)*k^{-1} mod q),其中(h(m))(m)在使用SHA-1下的函数

    m的签名对是((r,s))

    验证

    1.计算(u_1 = h(m)*s^{-1} mod q)

    2.计算(u_2 = r*s^{-1} mod q)

    3.计算(v = (g^{u_1}*g^{u_2}) mod q)

    4.如果(v=r),输出1,否则输出0

    正确性

    如果((r,s))是一个(m)的合法签名,那么我们有

    [v = g^{u_1}cdot y^{u_2}=g^{h(m)cdot (h(m)+xcdot r)^{-1}cdot k}cdot {g^{x cdot r cdot (h(m)+xcdot r)^{-1}cdot k}} mod p = g^{(h(m)+xcdot r)cdot (h(m)+x cdot r)^{-1}cdot k} mod p = g^k mod p ]

    2.Schnorr

    Schnorr是一个重要的基于DLP问题的签名场景.它工作在任何素数域.它的安全性在DL假设和随机访问模型下是被证明了的.

    域参数生成

    1.选择一个素数(p)

    2.选择一个和(p-1)互质的(q)

    3.选择(q)阶子群的生成器(g)

    密钥生成

    1.随机选择一个整数(x),其中(0<x<q)

    2.计算(y = g^x mod p)

    公钥就是(y),私钥就是(x).

    签名

    1.选择一个随机整数(k),其中(0<k<q)

    2.计算(a = g^k mod p)

    3.计算(r = h(m||a)),其中(m)是被签名的消息,同时(h:{0,1}^* ightarrow Z_q).是一个哈希函数.

    4.计算(s = (k+r*x) mod q)

    签名就是((r,s))

    正确性

    如果((r,s))是一个正确的签名在(m)上,那么我们有

    [v=g^scdot y^{-r}=g^{k+rcdot x}cdot g^{-rcdot x}=g^k=r ]

    (注意:schnorr协议是一个交互式的协议,这里应该说的不是最初的想法)

    3.RSA-FDH

    (RSA-FDH)(full domain hash)是一种Bellare和Rogaway in [3]中介绍的基于RSA的签名.遵循先hash后签名的范例.它利用哈希函数(输出正好等于RSA的模数),为普通的RSA签名方案生成输出.它保护了textbook RSA签名的代数攻击方案.并且对任意长度的消息都能签名.但是实际中很难创建这样的哈希函数.RSA-FDH可以在随机的oracle模型中证明EU-CMA安全(存在不可为造性).

    密钥生成

    1.选择两个大素数(p)(q)

    2.计算(N = p*q)

    3.选择一个随机整数(e),其中(1<e<phi(N)).使得(gcd(e,phi(N))=1).

    4.计算一个整数d,使得(1<d<phi(N)),(e*d=1modphi(N))

    公钥是((N,e)),私钥是((d,p,q))

    签名

    计算(s = h(m)^dmod N),其中(m)是将要被签名,同时(h:{0,1}^* ightarrow Z_N)是一个hash函数.

    (m)的签名就是(s).

    验证

    如果(s^e=h(m)),输出(1).否则输出0.

    正确性验证

    [s^e=h(m)^{dcdot e} mod N=h(m) mod N ]

    Reference

    [1] http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf

    [2] http://eprint.iacr.org/2012/029.pdf

    [3] http://web.cs.ucdavis.edu/~rogaway/papers/exact.pdf

  • 相关阅读:
    02-JavaScript语法
    001 docker基本环境的搭建
    023 虚拟机的安装
    022 虚拟机的网络配置
    021 虚拟机的安装
    004 java客户端的开发
    003 Rabbitmq中交换机的类型
    002 Rabbitmq的基础概念
    001 基础环境的搭建
    001 基本的环境的安装
  • 原文地址:https://www.cnblogs.com/zhuowangy2k/p/12242720.html
Copyright © 2011-2022 走看看