DSS签名算法

1、简介

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名目前采用较多的是非对称加密技术,其实现原理简单的说,就是由发送方利用哈希算法对要传送的信息计算得到一个固定位数的消息摘要值,用发送者的私有密钥加密此消息的哈希值所产生的密文即数字签名。然后数字签名和消息一同发给接收方。接收方收到消息和数字签名后,用同样的哈希算法对消息进行计算得出新的哈希值,然后用发送者的公开密钥对数字签名解密,将解密后的结果与新的哈希值相比较,如相等则说明报文确实来自发送方。

2、DSS签名算法与RSA签名算法的区别

(1)安全性

DSS的安全性是建立在求离散对数问题上,至今虽未证明破解DS与求解q阶乘法群的离散对数等价,但也未找到其他可绕开求离散对数的解法。整数分解与求离散对数的计算复杂度是近似的,因而两种签名算法的安全性大体相当。

(2)参数选择

DSS算法参数的选择比RSA算法要容易。RSA算法出于安全性考虑,对参数p、q的选择有一些较严格的要求,如 (k为较小自然数)应足够大、gcd(p-1,q-1)应比较小、p 1和q 1都应至少含有一个充分大的素数因子等;DSS算法安全性的关键参数是q,可比前两种算法中的n值略小,但应远大于单独的p和q。

(3)参数共享性

RSA 算法无法共享参数;DSS算法可以共享参数,因为它可以对k有不同选择,所以p、q、g,参数共享时至今尚未发现用户之间可以互相伤害的途径。

(4)签名速度

DSS算法签名速度较慢。RSA算法签名时耗费时间的主要部分都是mod p、mod q的指数运算,DSS 算法签名时mod p(p>q)的指数运算所耗费的时间要比RSA算法长。

(5)验证速度

DSS算法验证速度较慢。RSA算法验证时需进行一次mod n的e次指数运算,DSS算法验证时需要进行2次mod p的指数运算,因此DSS算法验证速度较慢。

(6)印记长度

DSS算法签名印记较长。RSA算法签名印记是一个mod n 数,DSS算法的签名印记是两个mod q数r 、s,比RSA算法的印记要长。

(7)印记的重复性

DSS算法签名印记具有不重复特性。文件m和h(m)完全相同,用DSS算法签名时因每次可以选择不同的k产生签名印记,故DSS算法的签名印记每次可以不同;RSA算法无此特性,但可以对算法作适当改进,以增加1个随机数加长传送的数据为代价,使算法具有签名印记不重复的特性。

3、DSS算法的实现

(1)DSS算法的主要参数:

1)全局公开密钥分量
素数p, 2 ^ 511 < p < 2 ^ 512;
q是(p-1)的一个素因子, 2^159 < q < 2^160;
g=h ^ [(p-1)/q] mod p, 其中h是一整数,1<h<(p-1)
2)私钥
 私钥x是随机或伪随机整数, 其中0<x<q;
3)公钥
  y=g ^ x mod p,(p,q,g,y)为公钥;
4)用户的随机选择数
  k为随机或伪随机整数, 其中0<k<q

(2)DSS的签名过程:

r=(g ^ k mod p) mod q
s=[k ^ (-1) (H(M)+xr)] mod q
 形成了对信息M的数字签名(r,s),数字签名和信息M一同发送给接收方。接收方接收到信息M’和数字签名(r’,s’)后,对数字签名的验证过程如下:
 w=(s’) ^ (-1) mod q
u1=[H(M’)w] mod q, u2=( r’) w mod q
 v=[(g ^ u1 y ^ u2) mod p] mod q
如果 v= r’,则说明信息确实来自发送方。

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我知道了。首先,我来回答你的问题: DSS(Digital Signature Standard,数字签名标准)是一种公钥密码学算法,用于生成和验证数字签名。使用DSS算法可以生成数字证书,用于验证数据的真实性和完整性。 主要函数: 1. `DSS_generate_key()`:用于生成DSS密钥对,包括公钥和私钥。 2. `DSS_sign()`:用于对数据进行数字签名,需要传入待签名的数据、数据长度、DSS私钥等参数。 3. `DSS_verify()`:用于验证数字签名的有效性,需要传入待验证的数据、数据长度、数字签名DSS公钥等参数。 下面是使用openssl中的DSS数字签名算法生成数字证书,并验证的C语言代码示例: ``` #include <stdio.h> #include <openssl/dsa.h> #include <openssl/err.h> int main() { DSA *dsa; int ret, sig_len; unsigned char data[] = "Hello World!"; unsigned char sig[1024]; unsigned int data_len = strlen(data); // 生成DSS密钥对 dsa = DSA_generate_parameters(1024, NULL, 0, NULL, NULL, NULL, NULL); ret = DSA_generate_key(dsa); // 对数据进行数字签名 ret = DSA_sign(0, data, data_len, sig, &sig_len, dsa); // 验证数字签名 ret = DSA_verify(0, data, data_len, sig, sig_len, dsa); if (ret == 1) { printf("数字签名验证成功!\n"); } else { printf("数字签名验证失败!\n"); } DSA_free(dsa); return 0; } ``` 在这段代码中,我们首先使用`DSA_generate_parameters()`和`DSA_generate_key()`生成了DSS密钥对,然后使用`DSA_sign()`对数据进行数字签名,最后使用`DSA_verify()`验证数字签名的有效性。如果数字签名验证成功,程序将输出“数字签名验证成功!”;反之,输出“数字签名验证失败!”。 需要注意的是,在实际使用DSS算法生成数字证书时,还需要进行证书颁发机构(CA)认证等操作,这里只是简单地介绍了DSS数字签名算法的基本使用方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值