一、密钥生成
- 随机生成两个大的素数 p 和 q ;
- 计算 n = pq, φ(n) = (p - 1)(q - 1), 销毁 p 和 q ;
- 随机生成 e ,满足 (e, φ(n)) = 1(e, φ(n)“互为质数”);
- 计算 d 满足 ed mod φ(n) = 1 ,即 ed - 1 能够被 φ(n) 完全整除;
- 公钥是 (n , e),私钥为 (n , d)。
显然,由于对n做素因子分解很难,所以由公钥计算出私钥也很难。
二、加密/解密算法
上述给出 (n , e) 和 (n , d)。
- 加密:由 c = me mod n 将明文m转变为密文c( 即:当 me 除以 n 所得的余数)。注意:m < n(如果需要,则分块)
- 解密:m = cd mod n (即:cd 除以 n 所得的余数)。
- 核心思想:
- 由欧拉定理可知:当 gcd(a , N) = 1 时,有
。于是在RSA中有:
① N = pq
②
③ 选择整数 e 和 d ,d 为 e 关于模 φ(n) 的模反元素
④ ,于是有:
三、举例
- 选取质数:p = 17 和 q = 11;
- 计算 n = pq = 17 × 11 = 187;
- 计算 φ(n) = (p - 1)(q - 1) = 16 × 10 = 160;
- 选定 e:e = 7 , 使得 gcd(e , 160) = 1;
- 选定 d:de = 1 mod 160 且 d < 160 因此确定 d 的值 d = 23,从而有 23 × 7 = 161 = 10 × 160 + 1;
- 公开公钥 KU = { 7 , 187 };
- 保留私钥 KR = { 23 ,17 , 11 }。
- 给定消息 M = 88 ( 88 < 187 )
- 加密:C = 88 7 mod 187 = 11
- 解密:M = 1123 mod 187 = 88
四、区块链中的应用
1.密钥分发
若要保护对称加密算法密钥的机密性,那么发送方可用接收方的公钥对消息加密得到密文,将密文发送给接收方,接收方用自己的私钥解密获得消息明文。除了接收方之外的其它人由于不知道私钥,所以不可能破解出消息。
2.身份认证
若要进行身份认证,则发送方用自己的私钥对消息加密,并将得到的密文附于明文之后一同发送给接收方,接收方用发送方的公钥解密,将解密得到的消息与明文消息对比,若一致则认为消息来自于真实的发送方,否则认为消息并非来自真实发送方。这里所说的密文就是所谓的数字签名。其实这么说并不太准确,由于消息可能比较长,所以发送方加密的不是消息本身,而是消息的哈希值。
3.交易数字化
① 签名数字化——身份认证
在上述身份认证的描述中,我们可以看到公钥的作用是公开向外界别标榜自己的身份,而私钥的作用是对消息生成数字签名,用数字签名向外界证明自己的身份与公钥所标榜的身份相符。因此,我们就用公钥作为账户,用私钥对交易信息生成数字签名,来解决了交易中账户和签名的问题。
用户可以按照以下步骤生成自己的账户和交易:
第一步,用RSA生成公钥 (n , e) 和私钥(n , d),用公钥 (n , e) 作为自己的账号;
第二步,填写交易信息 T ;
第三步,用自己的私钥对交易信息 T 生成数字签名
,其中 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位的随机值作为账户标识的;
所以,出现两个账户标识相同的概率是
;
我们死于小行星撞击地球的概率是7481万分之一。