公钥与私钥,在使用公钥密码学加密与签名时,真的就很难选择吗?算法
这篇文章是第二版,由于初版不幸地……闲话少说,言归正传。加密
常常听到有人说,在使用公钥密码学加密与签名时,必定要知道是使用公钥仍是使用私钥,不然容易闹笑话。但是,对于一个学过一点密码学的人来讲,真的就那么难吗?下面就来讨论一下这个问题。spa
密码学中要使用Key,而在公钥密码学中,有两个Key,一个公钥PK(Public Key),一个私钥SK(Secret Key),其中公钥PK公开,任何人均可以查到,而私钥SK保密,理论上只应该有你一我的知道。这一点是与分组密码算法(DES,AES)不一样的(DES的实现能够看我之前的一篇博文),由于在分组密码算法中,只有一个KEY,且是在通讯双方共享的,而且须要保密。下面以公钥密码算法RSA为例(RSA的小数状况实现也能够看个人另外一篇文章),来说一讲在公钥密码学,加密与签名时,key的选择问题。io
首先要说一说通讯,通讯天然要涉及通讯双方,固然,你也能够本身和本身通讯(若是你这时还加密签名的话,你这是闲得……)。密码学的大师给了通讯双方两个好听的名字A(lice),B(ob)。下面约定一下PK(A),PK(B)分别表明Alice和Bob的公钥,是彻底公开的,任何人均可以查到;SK(A)为Alice的私钥,只有Alice本身知道,SK(B)为Bob的私钥,只有Bob一我的知道。下面从Bob的角度来讨论。class
加密:原理
加密,为何要加密?由于通讯的双方使用的是公开的信道,而信道上是可能有窃听者的,若是使用明文传输消息,即不加密,那么窃听者就能够知道消息的内容了,若是你传输的是什么**消息的话,你就悲剧了。因此为防止消息被不该该知道的人知道,传输时要加密。密码
在公钥密码学中,一个消息M,在key1的控制下,通过密码算法,获得密文C,是为加密;而密文C,在另外一个Key2的控制下,通过密码算法,能够获得对应的明文M,是为解密。其中一个是公钥PK,一个是私钥SK,这是与分组密码不一样的。下面来讲Bob要传输消息给Alice,该使用那个Key。这里使用枚举,这个办法很好用。总共用四个key。(你不会还想用其余人的key吧。。。)im
1)使用PK(B)吗(本身的公钥)?这个,来分析分析。使用PK(B)加密的消息,只能使用对于的SK(B)来解密,而SK(B)只有你本身知道,Alice不知道,窃听者也不知道。使用这个Key的效果最好,别的人都不能知道消息的内容,窃听者也拿它没办法,可是,通讯的另外一方Alice也不知道消息的内容了,这样的通讯就没有意义了。因此,否认掉。总结
2)使用SK(B)吗(本身的私钥)?咱们来看看,使用SK(B)加密的消息,要使用PK(B)来加密。而PK(B)是公开的,Alice知道,恩,Alice能够解密消息了,这个能够吧!这个真的能够吗?正是由于PK(B)是公开的,Alice知道,窃听者也知道,因此Alice能解密,窃听者也能解密,因此根本就没有保密性。和明文传输没多大的差异了。这个一个悲剧的选择。Pass掉。通信
3)使用SK(A)吗(对方的私钥)?SK(A)是Alice的私钥,只有Alice知道,Bob不知道,这个不行。假设Alice将私钥偷偷告诉了你,这样你就可使用了吧。原理和结局同2中的分析。一样……
4)使用PK(A)吗(对方的公钥)?排除法告诉咱们,只有这个能够选了,那就选它吧。原理什么的就不用讲了吧,你们也没兴趣的。不行,老夫子教导咱们,知其然必知其因此然。咱们要知道原理。好吧,讲一讲。使用PK(A)加密的消息,要使用SK(A)来解密,而SK(A)对方是知道的,因此消息是能够解密的;而又由于SK(A)只有Alice知道,别的人包括窃听者是不知道的,因此消息的保密性是能够保证的。知足要求。恩,终于弄懂了。
讲了这么多,口都渴了,喝口水了再来说。。。。。。下面将签名。
签名:
签名,现实生活中,咱们可使用本身的笔迹来签名的。而电子世界呢?签名,这个是公钥密码学提供的而分组密码是没法与他比的特性。签名,为何要签名?举个例子,假如你发送一条消息给银行,从你的帐号中转1亿出去(反正是举例子,说这么大的数额也没什么关系),银行执行了这条消息,转了帐,过后,你跟银行说,你没有转过帐,要让银行赔偿,若是银行拿不出证据,那银行就悲剧了、破产了,而银行是能够拿出证据的,证据就在那条消息中,由于你对它签名了,而签名在法律上是有效的证据的。好吧。那么,Bob要对消息签名,他该使用哪一个key?枚举法再次闪亮登场……
1)使用PK(A)吗(对方的公钥)?假设能够的话,因为PK(A)是公开的,那么任何都是能够伪造你的签名的,你的银行卡就爆了。。。
2)使用SK(A)吗(对方是私钥)?一样这个你是不知道的。就是对方告诉了你,仍是有问题的,由于这个和你的另外一个key不匹配,签名是不能验证的,这个问题一样出如今1中。因此,不妥。。。
3)使用PK(B)吗(本身的公钥)?一样有问题,第一,原理同1,因为是公开的,任何人均可以伪造,银行卡再次爆掉了;第二,原理同2,要验证,就须要使用你的另外一个key,即你的私钥,而这个只有你本身知道,因此签名没法验证。这又是一个失败的例子。。。
4)私钥SK(B)吗(本身的私钥)?仍是说说原理吧。签名要使用惟一能确认是你的东西来签名,譬如笔迹。由于SK(B)只有你本身知道,因此知足要求的;其次,使用SK(B)签名的东西,是能够用PK(B)验证的,由于它是公开的。因此也知足要求。Jackpot!
写了这么多,终于写完了。因为昨天的失误,今天算是从新敲了一遍,我还觉得只有几百字呢,没想到竟有2k多的字。不过上面的都是废话,下面来总结一下,接下来的这句才是重点。
在公钥密码学中,加密使用对方的公钥,签名使用本身的私钥。
废话完了,昨天写的是洗洗睡了,今天就写个,喝水去了!