加密和解密

     加密和解密主要是为了实现能在消息的接受方和消息的发送方之间在不安全的网络上面实现消息的安全传递。怎么才算安全传递?

     那么怎么样才能叫安全呢?消息在接收方和发送方进行安全传递,一般要满足下面三个要点:

  1. 消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密)。
  2. 消息的接收方可以确定消息是由谁发送的(消息的接收方可以确定消息的发送方)。
  3. 消息的接收方可以确定消息在途中没有被篡改过(必须确认消息的完整性)。

     加密通常分为两种方式:对称加密和非对称加密,接下来我们先看看对称加密。

      一.对称加密:

      消息的接受方和消息的发送方同时持有一个私钥,消息的发送方在发送消息的时候根据这个私钥对消息进行加密,而消息的接受方通过这个私钥对消息进行解密。加密算法通常是公开的。但是这种加密方式有一个不足就是:虽然可以通过密钥来保证消息安全地进行传递,但是如何确保密钥安全地进行传递?因为发送者和接收者总有一次初始的通信,用来传递密钥,此时的安全如何保证?

     .NET提供的对称加密类有:DESCryptoServiceProvider RC2CryptoServiceProvider RijndaelManaged TripleDESCryptoServiceProvider.这些类都是一致的思路,定义一个私有的Key和一个私有的IV,然后通过CreateEncryptor和CreateDecryptor创建加密和解密类,对一个byte 数组进行加密和解密。

     二.非对称加密

       这种加密方式是消息的接收方和消息的发送方各自持有两个密钥,一个是对外公开的,称为公钥,一个是保密的,称为私钥。非对称加密的规则是由某人A的公钥加密的消息,只能由A的私钥进行解密;由A的私钥加密的消息只能由A的公钥解密。

        加密模式:使用接受者的公钥和私钥,消息的接受者发布自己的接受消息的公钥,消息的发送者在发送消息的时候,使用消息的接受者发布的公钥对消息进行加密,接受者在接受到消息之后,使用自己的私钥对消息进行解密,这样其他截获消息的人并不能对消息进行解密。但是这种模式有一种不足。就是由于消息接受方发布了自己的公钥,因此其他人也可以使用这个公钥对消息进行加密然后发送消息,而消息的接受方并不能对消息进行识别。

        认证模式:由消息的发送者通过自己的私钥对消息加密,然后发布公钥,消息的接受者使用消息发送者的公钥对消息进行解密。这种方式的不足之处显而易见,发送者发布公钥,只要持有公钥就能对消息进行解密,因此这种模式不安全。
        高级模式:由于这个过程比上面稍微复杂了一些,我们将其分为发送方和接收方两部分来看。先看看发送方需要执行的步骤:

        1.将消息进行散列运算,得到消息摘要。
        2.使用自己的私钥对消息摘要加密(认证模式:确保了接收方能够确认自己)。
        3.使用接收方的公钥对消息进行加密(加密模式:确保了消息只能由期望的接收方解密)。
        4.发送消息和消息摘要。
       接下来我们看一下接收方所执行的步骤:

        1.使用发送方的公钥对消息摘要进行解密(确认了消息是由谁发送的)。
        2.使用自己的私钥对消息进行解密(安全地获得了实际应获得的信息)。
        3.将消息进行散列运算,获得消息摘要。
        4.将上一步获得的消息摘要 和 第一步解密的消息摘要进行对比(确认了消息是否被篡改)。 
        可以看到,通过上面这种方式,使用了接收方、发送方全部的四个密钥,再配合使用消息摘要,使得前面提出的安全传递的所有三个条件全都满足了。那么是不是这种方法就是最好的呢?不是的,非对称加密是一种很耗时的操作,所以这个方案是很低效的。实际上,我们可以通过它来解决对称加密中的密钥传递问题,如果你已经忘记了可以翻到前面再看一看,也就是说,我们可以使用这里的高级实现方式来进行对称加密中密钥的传递,对于之后实际的数据传递,采用对称加密方式来完成,因为此时已经是安全的了。

        .NET提供的类有这两个:DSACryptoServiceProvider RSACryptoServiceProvider

        三.哈希

       上面讲到的加密和解密可以把明文加密成密文,并且在某个特定的时候实现解密,将密文还原成明文。而哈希实现的是另外一种思路,将明文哈希算法散列成一组密文,如使用MD5算法,哈希算法有三个重要的特征:

       1.不可逆,也就是明文哈希成散列值后,散列值不能通过算法在得出明文。

       2.另外一个是任意长的明文可以哈希成指定长度的散列值。

       3.如果明文稍微有改动,则散列出来的密文也会和原来有很大的差异,并且几乎不可能找到不同的两个明文能哈希成同一个散列值。

       .NET提供的哈希类有:HMACSHA1 MACTripleDES MD5CryptoServiceProvider SHA1Managed SHA256Managed SHA384Managed SHA512Managed 这些类都是通过ComputeHash方法对一个byte数组进行加密

      参考文章:http://www.tracefact.net/CLR-and-Framework/Cryptograph.aspx

posted @ 2011-05-04 10:43  雁北飞  阅读(465)  评论(0编辑  收藏  举报