非对称加密
非对称加密能够提供一对密钥,公钥和私钥,使用公钥加密的内容无法使用公钥进行解密,必须使用其对应的私钥才能解密,反之亦然,正好符合我们的要求:
我们可以自己保留私钥,把公钥提供给Web程序,这样注册文件只能由私钥生成而无法使用公钥进行生成,用户即使掌握了公钥也无法生成注册文件。
简单介绍一下我们使用的非对称加密方法:RSA,该方法基于一个数学难题:大数的因子分解,该加密方法已经集成在.net的类库中。
在C#中我们可以使用RSACryptoServiceProvider类进行产生密钥对,明文加密和密文解密的动作。
在使用RSACryptoServiceProvider类的时候我们会发现,类库要求我们进行加密的明文必须为128个字节,多于这个数量会引发异常,所以很多朋友在网上提出解决方案,比如把明文切断,分别加密啦等等,其实我觉得这是一个误区,要解释这个误区,我们得先从非对称加密的常用领域说起。
非对称加密的常用领域
使用非对称加密时我们一般会将私钥保留,将公钥分发给用户,当然,具体的分发动作是通过证书还是怎么样不在我们这次的讨论范围内。
第一种场景:用户使用公钥进行加密,则 只能由我们自己的私钥进行解密,就可以保证我们传递的信息是加密过的只有私钥的持有人能够对密文进行解密,其他人(包括公钥的持有人)也是无法解密密文的,但是这同样带来一个问题,由于非对称加密实现算法较为复杂,加密过程比较耗时,因此,我们一般将对称加密和非对称加密结合使用。即:使用对称加密算法对明文进行加密,使用非对称加密算法对对称加密的密钥进行加密,其实说到底,就是使用非对称加密算法进行对称加密密钥的发布,这也是“一次一密”的一种实现方法。
第二种场景是我们使用私钥进行加密,公钥的持有人都可以使用公钥进行解密,这样,公钥持有人就可以确认该内容是由私钥的持有人发布出来的,同样,由于非对称加密和解密比较耗时的原因,我们可以对该实现方式进行改良,最常见的改良方式为:我们可以对明文进行散列操作,最终将明文散列为较短的一个散列码,然后我们使用私钥对该散列码进行加密,在公钥的持有人收到消息后,可以重复上面的操作,比对自己的散列码和解析出的散列码是否相同,如果相同,则可以证明该消息是由公钥的持有人发布的,这就是我们常说的电子签名,当然我们也可以将上面提到的对称密钥的发布过程也包含在电子签名的过程中,以此来保证消息的内容只有公钥的持有人能够查看。
通过上面两种应用场景我们可以发现,非对称加密算法只要能够满足128个字节的加密就能满足所有的应用需求。