浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥
概述
首先了解一下相关概念:RSA算法:1977年由Ron Rivest、Adi Shamirh和LenAdleman发明的。RSA就是取自他们三个人的名字。
算法基于一个数论:将两个大素数相乘很easy,但要对这个乘积的结果进行 因式分解却很困难,因此可以把乘积公开作为公钥。该算法可以抵抗眼下已知的全部password攻击。
RSA算法是一种非对称算法,算法须要一对密钥。使用当中一个 加密。须要使用另外一个才干解密。我们在进行RSA加密通讯时。就把公钥放在client,私钥留在server。
RSA非对称加密算法,能够验证client和server两方的合法性,安全级别很高。
这是眼下地球上最重要的加密算法
怎样生成公钥和私钥
1. 选择两个素数p=17。q=11
2. 计算乘机n = 17*11 = 187
3. 对n计算欧拉函数φ(n)=(p-1)(q-1) = 160。
4. 选择e,使得e与φ(n)互素且小于φ(n)。选择e=7 (实际应用中n是一个极大数。通常使用65537)
5. 计算d。使得de mod 160=1且d < 160.正确的值是23,这是由于23*7 = 161 = 10*16+1
这样就得出了公钥PU={7,187} 私钥PR={23,187} 參考这里
怎样加密、解密?
对于某一明文M和密文C,加密和解密有例如以下形式:加密:C=Me mod n
解密:M=Ce mod n
假设,公钥PU=7,187 私钥PR=23,187。带入公式例如以下图所看到的:
对于加密,须要计算C = 887 mod 187。
利用模运算的性质,计算例如以下:
887mod187 = [(884 mod 187)*(882 mod 187)*(881mod)] mod 187
881 mod 187 = 88
882 mod 187 = 7744 mod 187 = 77
884 mod 187 = 59969536 mod 187 = 132
887mod187 = (88*77*132)mod 187 = 89432 mod 187 = 11
对于解密。计算M = 1123 mod 187 ;
M = 1123 mod 187 = [(111 mod 187)*(112 mod 187)*(114 mod 187)*(118 mod 187)*(118 mod 187)] mod 187
111 mod 187 = 11
112 mod 187 = 121
114 mod 187 = 14641 mod 187 = 55
118 mod 187 = 214 258 881 mod 187 = 33
M = 1123 mod 187 =(11*121*55*33*33)mod 187 = 79720245 mod 187 = 88
RSA的可靠性
回想上面的密钥生成步骤,一共出现六个数字:
p
q
n
φ(n)
e
d
这六个数字之中。公钥用到了两个(n和e)。其余四个数字都是不公开的。当中最关键的是d,由于n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
那么。有无可能在已知n和e的情况下,推导出d?
(1)ed≡1 (mod φ(n))。仅仅有知道e和φ(n)。才干算出d。
(2)φ(n)=(p-1)(q-1)。仅仅有知道p和q,才干算出φ(n)。
(3)n=pq。
仅仅有将n因数分解,才干算出p和q。
结论:假设n能够被因数分解,d就能够算出,也就意味着私钥被破解。
但是。大整数的因数分解,是一件很困难的事情。眼下,除了暴力破解,还没有发现别的有效方法。
维基百科这样写道:
"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之。对一极大整数做因数分解愈困难,RSA算法愈可靠。
假如有人找到一种高速因数分解的算法。那么RSA的可靠性就会极度下降。但找到这种算法的可能性是很小的。今天仅仅有短的RSA密钥才可能被暴力破解。
到2008年为止,世界上还没有不论什么可靠的攻击RSA算法的方式。
仅仅要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。"
数字签名,私钥加密。公钥解密
2. 对摘要进行DER数据编码
3. RSA私钥加密
4. 字节串到位串的转换。
对于RSA算法,用不论什么一方密钥加密都能够用另外一个密钥解密;这也从另外一个角度说明,事实上公钥和私钥是相对而言的。发放当中一个密钥出去。另外一个自然也就成为私钥了
非对称加密案例
验证过程是:buildin-key调用SecKeyRawSign函数对(cNonce+public-key+sNonce)进行验证。
iOS平台RSA介绍
我们常见的证书能够看做是公钥,证书中包括了公钥和一些其它信息。IOSclient的加解密。首先我们须要导入Security.framework,在iOS中,我们主要关注四个函数。
SecKeyEncrypt:使用公钥对数据进行加密。
SecKeyDecrypt:使用私钥对数据进行解密。
SecKeyRawVerify:使用公钥对数字签名和数据进行验证,以确认该数据的来源合法性。
SecKeyRawSign:使用私钥对数据进行摘要并生成数字签名。
从这几个函数中,我们能够看到,公钥能做的事情就有两个:加密数据,以及对server端发来的数据进行签名认证。可是假设你想跟我之前想的一 样。要使用公钥来对数据进行解密,那就没有自带API了。
假设想在server端使用私钥加密数据,然后再在client使用公钥进行解密,以图这样来对交互数据进行加密,看来是行不通的。事实上也应该是这样,公钥是公开的。同一时候,RSA由于都是做大数的运算。算法性能上比較差,假设做大数据量的加解密。对IOS来讲。肯定也是不合适的。
银行U盾
U盾的工作过程:当网银响应用户操作,将全部的指令信息打包,并通过USB口送入U盾。U盾在其内部由MPU使用证书(私钥)进行签名,然后送出。
再由IE通过SSL传送到server。server收到指令包后由用户留存在密钥分发server上的公钥进行签名认证,若认证无误则运行指令。
然而,实际project过程中。有非常多安全隐患:
隐患一
但如此此用户的电脑被人控制。IE被篡改,还是有被盗取的可能性。只是下载证书是一次性动作,两年才一次。
隐患二
个人推測,银行应该是通过一个大素数池,随机挑选两个进行生成密钥对。
并且这个大素数池要定期更换,并且非常严格地监管此密钥分发server。
最后
破解RSA被觉得是全部计算机科学中最难的课题之中的一个。因此。假设你发明了一种可以高速地将一个极大的数字分解为质数的方法,就不只可以入侵瑞士银行的账户系统,并且还可以获得图灵奖了!