国科大区块链作业
一、RSA 签名
如果要使用RSA签名,那么首先需要生成一对RSA秘钥,即一个公钥和一个私钥。
私钥:用于签名
公钥:用于验证签名
下面是具体的RSA签名使用例子步骤
1.生成RSA密钥对
假设选择两个不同的质数:p = 17和q = 19。
-
计算n = p * q,这将是RSA的模数:n = 17 * 19 = 323。
-
计算欧拉函数φ(n) = (p - 1) * (q - 1):φ(323) = 16 * 18 = 288。
-
选择一个整数e,1 < e < φ(n),且e与φ(n)互质。假设e = 5。
-
计算e的模反元素d,使得 (d * e) mod φ(n) = 1。在这里,d = 173,因为 (173 * 5) mod 288 = 1。
-
现在有了RSA私钥(d,323)和公钥(e,323)。将公钥(e,323)分享给别人,以便他可以验证签名。
2.签署消息(gaoyubo)
-
有一条消息“gaoyubo”,首先将该消息转换为一个整数,使用哈希函数来完成这一步。
-
使用哈希函数,例如SHA-256,将消息转换为数字摘要(哈希值)。
哈希值为:
0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7
-
现在,有以下参数:
-
哈希值H:0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7
-
私钥d:2753
-
模数n:323
-
-
计算 H^d:
H^d = 0x0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7^2753
-
使用模n来计算签名S:
H^d mod n = 0x0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7^2753 mod 323
最终的S是一个非常大的整数值,用于表示RSA签名。
3.发送签名,消息,公钥
发送消息
“gaoyubo”
哈希值H:0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7
签名
0x0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7^2753 mod 323
假设为20
公钥
(5,323)
4.验证签名
-
计算 M' = S^e mod n
M' = S^e mod n = (计算得到的S)^5 mod 323
-
计算 M' 的值:
M' = (S的值)^5 mod 323
-
检查 M' 是否等于哈希值 H:
M' = (S的值)^5 mod 323 = (计算得到的S)^5 mod 323 = (0x0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7^2753)^5
如果M'等于原始消息M的哈希值,那么签名有效,否则签名无效。
二、DSA签名
需要的参数:
全局公开密钥分量:p(素数),q(p-1)的素因子,g=h^((p-1)/q) mod p
用户私有密钥:x 随机或伪随机整数
用户公开密钥:y=g^x mod p
随机数k
2.1签名过程
0.需要参数
- q = 89
- p = 624
- h = 2
- g = 156
- 私钥 x = 42
- 公钥 y = 316
1.用户随机取k
选择随机数 k = 50
2.得到e=h(M)
假设,消息哈希值 h(m) = 5678
3.计算k^-1(mod q)
k^(-1) (mod q) = k^(-1) (mod 89) = 40
3.计算r=(g^k mod p) mod q
r = (g^k mod p) mod q
= (156^50 mod 624) mod 89
= (3301362781124031607314559615731063689754212850453344585008398501056 mod 624 ) mod 89
= 112 mod 89
= 23
4.计算s=k^-1(e+k * r) mod q
s = (h(m) + k * r) * k^(-1) mod q
= (5678 + 50 * 23) * 40 mod 89
= (5678 + 1150) * 40 mod 89
= 6828 * 40 mod 89
= 273120 mod 89
= 68
5.得出签名值
这就完成了使用DSA签名过程,得到了签名值 (23, 68)。
2.2验证过程
1.接受M,r,s,并验证
r=23
q=89
s=68
满足:0 < r < q, 0 < s < q;
2.计算w=(s)^-1 mod q
w = s^(-1) (mod q) = 68^(-1) (mod 89)
= 72
3.计算u1=e * w mod q
u1 = h(m) * w (mod q) = 5678 * 72 (mod 89)
= 408816 mod 89
= 39
4.计算u2=r * w mod q
u2 = r * w (mod q) = 23 * 72 (mod 89)
= 1656 mod 89
= 54
5.计算v=[(g^u1 * y^u2) mod p] mod q
v = (g^u1 * y^u2 mod p) mod q
= (156^39 * 316^54 mod 624) mod 89
= ((3831293915853705778674757108580107746624313951631656763752854936 * 2771818711322521036790735511161532047805619300650632484174043948443639447425348080505131890638040971851159523776467380637522930490057851395874411608498144907588702041783774722280966198216) mod 624) mod 89
= (10608846866783215492004284968492886132550550634694476068691394275898068495698748915040723614224139868018302739880205401125621969482083854500880288943843346641694418335678821775599837007858880141582273922810703863557282538148007645620822244923009101175282234723874656898135049943208016 mod 624) mod 89
= 290 mod 89
= 23
v = 23
r = 23
v=r,所以该签名是有效的