加密有多种形式,多种规模,一直以来仍然属于热门话题。在现在由的数据加密技术中,并没有权威的解决方案,但是可以给出大量的建议。总的来说,加密形式有两种:
- 对称加密:加密和解密使用的是同一个密匙
- 非对称加密:加密和解密时将使用不同的密匙。通常是用公匙作为加密密匙,任何人都可以用它来加密信息。而私匙才是用来做解密密匙的,它只能用来对使用其对应的公匙加密的数据进行加密
注解:在某些场景中(诸如数字签名),私匙是用来加密的,公匙才是用来解密的。
和散列一样,不管是对称加密还是非对称加密,都有几种算法可以使用。在.NET的命名空间System.Security.Cryptography中提供了几种不同的实现。
可用的非对称加密算法包括DSA(数字签名算法)和RSA两种,其中DSA只能用来对数据进行”签名“,因此通常用来做验证,而RSA更加通用(尽管在生成的数字签名时会比DSA更慢)。DSA现在是美国政府使用的数字验证的标准。
在.NET框架中可以找到的对称加密算法包括DES(数据加密标准)。RC2和Rijndael。DES成为标准已经有一段时间了,尽管它不断的发生变化。虽然标准是使用64位的密匙,但是在实践中通常只用到其中的56位,其中8位被用作“奇偶校验”位:正是因为如此,在使用现在计算机破解时,DES还是显得很脆弱的。3DES和RC2都是DES的变种。3DES是通过对数据进行三次独立的DES加密,扣除奇偶校验位,其总的密匙长度也达到了168位。RC2的密匙长度是可变化的,最大可以达到128位(如果要更长的密匙,可以使用RC3,RC4等),因此根据密匙长度不同,可能比DES更脆弱或者更强壮。Rijndael是一种完全不同的加密方法,现在已经被接纳为新的AES(高级加密标准)。该标准的目标是代替DES,在选中Rijndael之前,还有几种相互竞争的算法。该标准正在拙见代替DES,成为最常用的对称加密算法。
在对数据进行加密和解密时,需要完成的任务也比散列更复杂一些。在.NET框架中的类是针对数据流进行优化的,因此需要花一些时间来处理数据格式转换。同样需要定义一个密匙以及执行加密或解密操作的初始向量(IV)。在实践中,IV和密匙都将表示为一个字节数组,而在DES加密中,其长度是64位。
对一个字符串进行加密所需要的步凑如下:
- 将源字符串转换为一个字节数组
- 初始化一个加密算法类
- 使用这个加密算法类来生成一个加密者(encryptor)对象,实现ICryptoTransform接口。它需要密匙和IV值
- 使用加密者对象来初始化一个密文数据流(CryptoStreamd对象)。该数据流还需要知道你要加密哪些数据,以及用来写入加密数据的目标数据流。
- 使用这个密文数据流生成加密数据,并写到由前面创建的源字节数组创建的目标内存数据流中
- 获取存储在这个数据流中的字节数据
- 将这些字节数据转换为一个字符串。
解密的模式与加密类似:
- 将源字符串转换为一个字节数组
- 根据这个字节数组填充内存数据流的值
- 初始化一个加密算法类
- 使用加密算法类生成一个解密者(decryptor)对象,实现ICryptoTransform接口。它需要密匙和IV值
- 使用解密者对象来初始化一个密文数据流(CryptoStreamd对象)。该数据流还需要知道你要解密什么数据,并需要一个从中读取已加密数据的源数据流
- 使用密文数据流来读取已解密数据(可以使用StreamReader.ReadToEnd方法来获取字符串型结果)
在这个例子里,使用DES,不过在StringEncryptor类中的代码可以替换成前面介绍的任何算法。
实现StringEncryptor类
现在编写一个页面测试上面的类是否正确:
页面前台:
后台代码:
运行一下,可以看到如我们所愿
结:这个可以用来处理顾客的信用卡一类的信息,加密后存入数据库,或者从数据库中解密。如果要在internet上传输,还要使用非对称加密算法加密,必须使用安全连接