国科大-区块链技术作业1

一、RSA 签名

如果要使用RSA签名,那么首先需要生成一对RSA秘钥,即一个公钥和一个私钥。

私钥:用于签名

公钥:用于验证签名

下面是具体的RSA签名使用例子步骤

1.生成RSA密钥对

假设选择两个不同的质数:p = 17和q = 19。

  1. 计算n = p * q,这将是RSA的模数:n = 17 * 19 = 323。

  2. 计算欧拉函数φ(n) = (p - 1) * (q - 1):φ(323) = 16 * 18 = 288。

  3. 选择一个整数e,1 < e < φ(n),且e与φ(n)互质。假设e = 5。

  4. 计算e的模反元素d,使得 (d * e) mod φ(n) = 1。在这里,d = 173,因为 (173 * 5) mod 288 = 1。

  5. 现在有了RSA私钥(d,323)和公钥(e,323)。将公钥(e,323)分享给别人,以便他可以验证签名。

2.签署消息(gaoyubo)

  1. 有一条消息“gaoyubo”(我的名字郜宇博的拼音),首先将该消息转换为一个整数,使用哈希函数来完成这一步。

  2. 使用哈希函数,例如SHA-256,将消息转换为数字摘要(哈希值)。

    哈希值为:

    0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7
    
  3. 现在,有以下参数:

    • 哈希值H:0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7

    • 私钥d:2753

    • 模数n:323

  4. 计算 H^d:

    H^d = 0x0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7^2753
    
  5. 使用模n来计算签名S:

    H^d mod n  = 0x0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7^2753 mod 323
    

    最终的S是一个非常大的整数值,用于表示RSA签名。

3.发送签名,消息,公钥

发送消息

“gaoyubo”
哈希值H:0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7

签名

0x0a8b40a5c64f3c63752165083be9a22f8e24e5fc79edfd4e38050c17a2f036d7^2753 mod 323
假设为20

公钥

(5,323)

4.验证签名

  1. 计算 M' = S^e mod n

    M' = S^e mod n = (计算得到的S)^5 mod 323
    
  2. 计算 M' 的值:

    M' = (S的值)^5 mod 323
    
  3. 检查 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,所以该签名是有效的

posted @ 2024-01-18 01:56  橡皮筋儿  阅读(25)  评论(0编辑  收藏  举报