RSA非对称加密算法中的密钥对由谁生成,怎样传输

先自问自答下,我查了下书和网上,主要有两种方式:方式1:由B自己产生秘钥对,然后将公钥通过网络发送给A;方式2:B通过第三方的权威机构(如VeriSign)申请,产生自己的秘钥对,A从第三方的权威机构下载B的公钥。以下是分别是对这两种情况存在的问题的一点认识和疑问,等待求证,谢谢大家。(—)对于方式1,会有一个问题,它无法抵制中间人攻击。若B在发送公钥给A的过程中,被C拦截,然后C用自己伪造的公钥替换原来的公钥发给A, A用这个伪公钥对密码加密,发送给B,C截获密文后可以用自己的私钥解密,于是密码被C盗取。(二)对于方式2,我们暂时不考虑VeriSign会被美国政府控制,被黑客攻破这样的极端情况,保持对其绝对信任,相信其绝对安全。即使这样,但还是存在两个隐患。隐患1:仍存在中间人攻击的问题。如以下两种中间人攻击手法:手法1:A向VeriSign下载公钥时被C截获,然后C替换一个伪造的公钥给A;手法2:若手法1可以通过数字签名技术解决了:即VeriSign对B的公钥进行了数字签名,A利用VeriSign的根证书对发过来公钥进行数字签名验证,若是C发来的伪造公钥,则无法通过验证,若通过验证则这个公钥确实是B在VeriSign申请的公钥。 但是问题又来了,A获得得VeriSign的根证书的过程也被中间人攻击了呢?若A的根证书实际被C发过来的伪造根证书代替,那么A用伪造的根证书区验证伪造的公钥是可以通过签名验证的。隐患2:多个第三方权威机构颁发给用户的秘钥对如何保证唯一性。若有几家第三方的权威机构都能生成秘钥对,怎么保证各家生成的秘钥对是独一无二的呢?有没有同一个秘钥对被分配给了2个以上的客户?若其中一个客户正好是黑客咋办?除了方式1和方式2,是否还存在更完美的秘钥对生成和传输方案呢?
■网友
回答你的问题:场景中B的秘钥对是由谁生成的呢?A又是通过何种途径获得B的公钥的呢?1:B的秘钥是B或任何B信任的人或机构。2:你举例的是A给B发消息,同样B收到A的消息后,也会给A发回复的消息,过程和A-》B发消息一样。如果是只发送给A,就用A的公钥加密,这样就只有A可以用自己的私钥打开。如果是发给一群人的话,就用B自己的私钥加密,这样,其他拥有B发布的公钥的用户在拿到报文就可以解密。也就是说,每个人都可以有自己的公钥和私钥。你要和谁通信,你就把自己的公钥给别人。你要和一群人通信,别人就必须都知道你的公钥。
■网友
上学期刚刚学过network security的相关内容,也来参与一下讨论,由于上学用的电脑不在身边,没有再翻回去看课件,全凭自己的理解,不对的地方请轻喷。对于方式1,本身它的安全度就是非常低的。每一个证书,都写有颁布这个证书的CA是谁(印象中应该是用digital signature写的)。而每一个CA也都会有一个证书,这个证书同样有它上一级的CA。CA是一层一层的,直到最上面一层,CA的证书的颁布者是它自己。如果按照方式1所言,这个证书的颁布者本身就是它自己,那么我们自然无法验证这个证书的真实性和可信度。因为它不是知名的CA所颁布的,用这类证书通信本身就存在风险。在浏览器设置里面“未受信任的证书”就是这类证书。下面来说方式2的隐患1。正如刚才所说,每一个证书都会写有上一级CA的签名,伪造的证书是拿不到这个签名的。而且印象中教授讲过一些在最上面的CA的证书是直接build in在浏览器里面的(不是很确定),所以这些CA的证书也是无法伪造的,就不会有你能从下到上伪造整个链的情况。关于隐患2,我觉得这个担忧有点没有必要。每个密钥都由几部分构成,本身包含了hash甚至hash之后的hash。MD5或者SHA1这类hash的特点就是在数学上几乎不可能重复。与其担心这个还不如担心在银行能不能用错误的密码从一张卡里取钱。RSA本身也不是绝对安全的。它利用了一些数学上的结论:大的整数无法分解,和对数还是指数计算在很大时候的不可逆性。个人觉得这两点的担忧要比hash被攻破可能性大得多。


推荐阅读