RSA及在区块链中的应用

一、密钥生成

  1. 随机生成两个大的素数 p 和 q ;
  2. 计算 n = pq, φ(n) = (p - 1)(q - 1), 销毁 p 和 q ;
  3. 随机生成 e ,满足 (e, φ(n)) = 1(e, φ(n)“互为质数”);
  4. 计算 d 满足 ed mod φ(n) = 1 ,即 ed - 1 能够被 φ(n) 完全整除;
  5. 公钥是 (n , e),私钥为 (n , d)。

显然,由于对n做素因子分解很难,所以由公钥计算出私钥也很难。

二、加密/解密算法

上述给出 (n , e) 和 (n , d)。

  1. 加密:由 c = me mod n 将明文m转变为密文c( 即:当 me 除以 n 所得的余数)。注意:m < n(如果需要,则分块
  2. 解密:m = cd mod n (即:cd 除以 n 所得的余数)。
  3. 核心思想 m = ( m e m o d n c ) d m o d n m=(\underbrace{m^{e} \bmod n}_{c})^{d} \bmod n
  4. 由欧拉定理可知:当 gcd(a , N) = 1 时,有 a φ ( N ) m o d N = 1 a^{\varphi(N)} \bmod N=1 。于是在RSA中有:
    ① N = pq
    φ ( N ) = ( p 1 ) ( q 1 ) \varphi(N)=(p-1)(q-1)
    ③ 选择整数 e 和 d ,d 为 e 关于模 φ(n) 的模反元素
    e d = 1 + k φ ( N ) ( k > 0 , k Z ) e \cdot d=1+k \cdot \varphi(N)(k>0, k \in Z) ,于是有:
    C d = ( M e ) d = M 1 + k φ ( N ) = M 1 ( M φ ( N ) ) k = M 1 ( 1 ) k = M 1 = M m o d N \begin{aligned} C^{d}=&\left(M^{e}\right)^{d}=M^{1+k \cdot \varphi(N)}=M^{1} \cdot\left(M^{\varphi(N)}\right)^{k} =M^{1} \cdot(1)^{k}=M^{1}=M \bmod N \end{aligned}

三、举例

  1. 选取质数:p = 17 和 q = 11;
  2. 计算 n = pq = 17 × 11 = 187;
  3. 计算 φ(n) = (p - 1)(q - 1) = 16 × 10 = 160;
  4. 选定 e:e = 7 , 使得 gcd(e , 160) = 1;
  5. 选定 d:de = 1 mod 160 且 d < 160 因此确定 d 的值 d = 23,从而有 23 × 7 = 161 = 10 × 160 + 1;
  6. 公开公钥 KU = { 7 , 187 };
  7. 保留私钥 KR = { 23 ,17 , 11 }。
  8. 给定消息 M = 88 ( 88 < 187 )
  9. 加密:C = 88 7 mod 187 = 11
  10. 解密:M = 1123 mod 187 = 88

四、区块链中的应用

1.密钥分发
若要保护对称加密算法密钥的机密性,那么发送方可用接收方的公钥对消息加密得到密文,将密文发送给接收方,接收方用自己的私钥解密获得消息明文。除了接收方之外的其它人由于不知道私钥,所以不可能破解出消息。
2.身份认证
若要进行身份认证,则发送方用自己的私钥对消息加密,并将得到的密文附于明文之后一同发送给接收方,接收方用发送方的公钥解密,将解密得到的消息与明文消息对比,若一致则认为消息来自于真实的发送方,否则认为消息并非来自真实发送方。这里所说的密文就是所谓的数字签名。其实这么说并不太准确,由于消息可能比较长,所以发送方加密的不是消息本身,而是消息的哈希值。
3.交易数字化
① 签名数字化——身份认证
在上述身份认证的描述中,我们可以看到公钥的作用是公开向外界别标榜自己的身份,而私钥的作用是对消息生成数字签名,用数字签名向外界证明自己的身份与公钥所标榜的身份相符。因此,我们就用公钥作为账户,用私钥对交易信息生成数字签名,来解决了交易中账户和签名的问题。
用户可以按照以下步骤生成自己的账户和交易:
第一步,用RSA生成公钥 (n , e) 和私钥(n , d),用公钥 (n , e) 作为自己的账号;
第二步,填写交易信息 T ;
第三步,用自己的私钥对交易信息 T 生成数字签名 s = ( H ( T ) ) d m o d n s=(H(T))^{d} \bmod n ,其中 T 表示一种哈希函数,将 s 加入交易信息,得到最终的交易信息。

字段
转出账户 自己的公钥 (n , e)
转入账户 收款人的公钥 (n’ , e’)
金额 1000.00
其它(时间、说明等)
数字签名 s

用户创建完交易信息 T ,就可以把它公告给其它用户,试图得到其它用户的认可。收到该消息的任何用户都可以用转出账户(创建交易人的公钥)和数字签名(创建交易人用自己的私钥生成的)来验证该用户是不是该账户的拥有者,有没有权力从该账户转账。
② 账户数字化——唯一性
在上述过程中我们使用公钥解决了签名数字化问题,但整个过程中对账户唯一性问题从未涉及。而区块链确实没有通过任何机制检验新账户的唯一性。
我们使用公钥来作为用户标识,尽管我们没有强制要求账户标识唯一,但公钥的随机性使得账户标识几乎不可能出现重合。
以RSA的密钥生成过程为例。
如果素数 p 和 q 都取1024位,那么 n 和 φ(n) 就都大约是2048位;
若 e 取随机值,由于 ed mod φ(n) = 1 ,那么 d 也是随机值,大约也是2048位。
因此公钥 (e , d) 大约是4096位的随机值;
也就是说,我们使用4096位的随机值作为账户标识的;
所以,出现两个账户标识相同的概率是 1 2 4096 \frac{1}{2^{4096}}
我们死于小行星撞击地球的概率是7481万分之一。

发布了3 篇原创文章 · 获赞 0 · 访问量 130

猜你喜欢

转载自blog.csdn.net/yzfl_van/article/details/105753098