RSA-数字签名与加密
1. 公钥私钥(标准条目)
- 公钥和私钥成对出现
- 公开的密钥叫公钥,只有自己知道的叫私钥
- 用公钥加密的数据只有对应的私钥可以解密
- 用私钥加密的数据只有对应的公钥可以解密
- 如果可以用公钥解密,则必然是对应的私钥加的密
- 如果可以用私钥解密,则必然是对应的公钥加的密
密码学中要使用Key,而在公钥密码学中,有两个Key,一个公钥PK(Public Key),一个私钥SK(Secret Key),其中公钥PK公开,任何人都可以查到,而私钥SK保密,理论上只应该有你一个人知道。这一点是与分组密码算法(DES,AES)不同的,因为在分组密码算法中,只有一个KEY,且是在通信双方共享的,并且需要保密。下面以公钥密码算法RSA为例,来讲一讲在公钥密码学,加密与签名时,key的选择问题。
首先要说一说通信,通信自然要涉及通信双方。密码学的大师给了通信双方两个好听的名字A(lice),B(ob)。下面约定一下PK(A),PK(B)分别代表Alice和Bob的公钥,是完全公开的,任何人都可以查到;SK(A)为Alice的私钥,只有Alice自己知道,SK(B)为Bob的私钥,只有Bob一个人知道。下面从Bob的角度来讨论。
2. 加密
加密,为什么要加密?因为通信的双方使用的是公开的信道,而信道上是可能有窃听者的,如果使用明文传输消息,即不加密,那么窃听者就可以知道消息的内容了,如果你传输的是什么XX消息的话,你就悲剧了。所以为防止消息被不应该知道的人知道,传输时要加密。
在公钥密码学中,一个消息M,在key1的控制下,经过密码算法,得到密文C,是为加密;而密文C,在另一个Key2的控制下,经过密码算法,可以得到对应的明文M,是为解密。其中一个是公钥PK,一个是私钥SK,这是与分组密码不同的。下面来说Bob要传输消息给Alice,该使用那个Key。这里使用枚举,这个办法很好用。总共用四个key。(你不会还想用其他人的key吧。。。)
- 使用PK(B)吗(自己的公钥)?这个,来分析分析。使用PK(B)加密的消息,只能使用对于的SK(B)来解密,而SK(B)只有你自己知道,Alice不知道,窃听者也不知道。使用这个Key的效果最好,别的人都不能知道消息的内容,窃听者也拿它没办法,但是,通信的另一方Alice也不知道消息的内容了,这样的通信就没有意义了。所以,否定掉。
- 使用SK(B)吗(自己的私钥)?我们来看看,使用SK(B)加密的消息,要使用PK(B)来加密。而PK(B)是公开的,Alice知道,恩,Alice可以解密消息了,这个可以吧!这个真的可以吗?正是因为PK(B)是公开的,Alice知道,窃听者也知道,所以Alice能解密,窃听者也能解密,所以根本就没有保密性。和明文传输没多大的差别了。这个一个悲剧的选择。Pass掉。
- 使用SK(A)吗(对方的私钥)?SK(A)是Alice的私钥,只有Alice知道,Bob不知道,这个不行。假设Alice将私钥偷偷告诉了你,这样你就可以使用了吧。原理和结局同2中的分析。同样……
- 使用PK(A)吗(对方的公钥)?排除法告诉我们,只有这个可以选了,那就选它吧。原理什么的就不用讲了吧,大家也没兴趣的。不行,老夫子教导我们,知其然必知其所以然。我们要知道原理。好吧,讲一讲。使用PK(A)加密的消息,要使用SK(A)来解密,而SK(A)对方是知道的,所以消息是可以解密的;而又因为SK(A)只有Alice知道,别的人包括窃听者是不知道的,所以消息的保密性是可以保证的。
大致过程如下:
1 | A---------------------------------------------------------------->B |
仔细分析上面三步,可以发现会话是安全的。用公钥加密的数据只有对应的私钥可以解密。
假设有个拦截者,他拦截到了PK(A),同时他也拦截到了Y,但是因为他没有私钥,所以无法解密Y,从而就保证了X只有A和B知道,也就保障了会话安全。
那么如果这个拦截者截到了PK(A),然后他用PK(A)加密某些东西发给A,他想要冒充B,对A进行欺诈,这该怎么办?这时候就需要数字签名,证明对面就是B,不是被冒充的,也就是接下去要讲的。
3. 签名
签名,现实生活中,我们可以使用自己的笔迹来签名的。而电子世界呢?签名,这个是公钥密码学提供的而分组密码是无法与他比的特性。签名,为什么要签名?举个例子,假如你发送一条消息给银行,从你的账号中转1亿出去(反正是举例子,说这么大的数额也没什么关系),银行执行了这条消息,转了账,事后,你跟银行说,你没有转过账,要让银行赔偿,如果银行拿不出证据,那银行就悲剧了、破产了,而银行是可以拿出证据的,证据就在那条消息中,因为你对它签名了,而签名在法律上是有效的证据的。好吧。那么,Bob要对消息签名,他该使用哪个key?枚举法再次闪亮登场……
- 使用PK(A)吗(对方的公钥)?假设可以的话,由于PK(A)是公开的,那么任何都是可以伪造你的签名的,你的银行卡就爆了。。。
- 使用SK(A)吗(对方是私钥)?同样这个你是不知道的。就是对方告诉了你,还是有问题的,因为这个和你的另一个key不匹配,签名是不能验证的,这个问题同样出现在1中。所以,不妥。。。
- 使用PK(B)吗(自己的公钥)?同样有问题,第一,原理同1,由于是公开的,任何人都可以伪造,银行卡再次爆掉了;第二,原理同2,要验证,就需要使用你的另一个key,即你的私钥,而这个只有你自己知道,所以签名无法验证。这又是一个失败的例子。。。
- 私钥SK(B)吗(自己的私钥)?还是说说原理吧。签名要使用唯一能确认是你的东西来签名,譬如笔迹。因为SK(B)只有你自己知道,所以满足要求的;其次,使用SK(B)签名的东西,是可以用PK(B)验证的,因为它是公开的。所以也满足要求。
大致过程如下:
1 | A------------------------------------------------------------->B |
至此,A可以确认对方就是B,因为如果可以用公钥解密,则必然是对应的私钥加的密,只有B才拥有SK(B)。
4. 总结
安全通信过程总结如下:
1 | A--------------------------------------------------------------------->B |
上面这个过程是安全的。假设有个拦截者,他拦截到了PK(B),他也拦截到了密文Y1,那么他也可以解密出“我是B”,同样A也解密得到“我是B”,但是拦截者并不能冒充B,因为A知道,只有真正的B才拥有SK(B),才能加密得到密文Y1,从而完成认证,A可以放心的跟B进行下一步通信。紧接着,A将自己的公钥发送给B,B生成随机数X,用PK(A)进行加密得到密文Y2并发送,假设拦截者获得了PK(A),也获得了密文Y2,但是拦截者却始终无法解密得到X,从而保证了X的安全传送。最后,A和B以X作为回话密钥进行通信,以AES加密方式通信。
以上所有讨论都基于一个前提:那就是私钥一直都是安全的,都只有自己知道!
上面的都是废话,下面来总结一下,接下来的这句才是重点.在公钥密码学中,加密使用对方的公钥,那么只有对方能解密,签名使用自己的私钥,用公钥来验证签名。
到这里我们发现,数字签名是用私钥进行签名。这样的话,会话过程比较复杂。继续讨论上面的议题,有个拦截者,拦截了PK(A),想要冒充B跟A进行对话,如果我们约定,A和B对话之前,先来一段口令,只有口令对了,那么A才能认为对面是B。也就是B必须按照和A约定好的协议进行通信,否则A就认为对面是冒充的。这个方法简单有效,关键在于口令协议无法保证安全,如果口令协议外泄,那么这个方法危险就很大。所以,加密和认证都是必要的。
5. 扩展
- 加密和解密发送方利用接收方的公钥对要发送的明文进行加密,接受方利用自己的私钥进行解密,其中公钥和私钥匙相对的,任何一个作为公钥,则另一个就为私钥.但是因为非对称加密技术的速度比较慢,所以,一般采用对称加密技术加密明文,然后用非对称加密技术加密对称密钥,即数字信封技术.
- 签名和验证发送方用特殊的hash算法,由明文中产生固定长度的摘要,然后利用自己的私钥对形成的摘要进行加密,这个过程就叫签名。接受方利用发送方的公钥解密被加密的摘要得到结果A,然后对明文也进行hash操作产生摘要B.最后,把A和B作比较。此方式既可以保证发送方的身份不可抵赖,又可以保证数据在传输过程中不会被篡改。