最近比较喜欢上CSDN论坛,碰到了很多网友关于密码学方面的问题,发现很多人对密码学的基础知识不够了解,会引起一些误解,甚至笑话。比如用MD5来加密,MD5如何解密等等之类的。我想既然大家都是搞软件的或者编程的,也应该有些计算机知识,这些基础知识还是要懂的。理解起来也应该比较容易,所以来通俗易懂的给大家讲一下。
1.密码学的作用与基本概念
首先说明密码学与加密解密不是一回事:密码学包括的范围很广,它是一个大的学科,包括密码协议、密码算法、散列算法、数字签名、数字水印以及密码分析等很多内容。而我们程序中用的加密与解密只是它的一个方面。
基本概念与模型也没必要多说,密码学所研究的内容:简单的说就是一个发送者,一个接受者之间,如何安全有效的传递信息的问题。下面说说大家经常用到的几个概念。
2.几个基本概念
数据加密是我们日常用得最多的,就是采用一种加密算法和特定的密钥来对重要的敏感信息进行保护,当需要时再进行解密。加密算法总的来说可以分为两类:
1) 对称加密算法。就是我们通常所说的DES,RC2,AES等,这些都是现在国际上用得比较多的,可是说是事实上的国际标准吧。它的加密密钥和解密密钥是相同的,密钥的长度根据不同的算法可以采用不同的长度,一般为128,192,256位。对称加密的速度快,但是密钥分发是一个困难问题(一般的较小的应用都不需要考虑这个问题)。一般的大量数据的加密多是采用对称加密算法的。.NET中有4种默认的对称加密算法。大家可以直接使用。
2) 非对称加密算法,也称公钥密码。比如我通常所说的RSA,公钥密码的特殊之处在于它的加密密钥和解密密钥是不相同的,一般人看来,这是件很神奇的事情。就是它的这个特性给密钥分发困难带来了绝佳的解决方案。比如,用对称密码加密明文,而用非对称密码加密对称密码的密钥,然后将密文进行传输即可,接受者,利用自己的私钥来解密非对称密码加密过的密文,即会得到对称加密的密钥,然后用来解密明文。非对称密码对于一般的应用来说也用得比较少,而且它的加解密速度慢,只适合加密少量的重要数据。它的密钥很长,大约800-2048位不等吧,具体要看所采用的大素数。
3) 散列函数。也就是通常所说的哈希函数,常用的就是MD5,SHA了。哈希函数的作用就是相当于“指纹”,它是不可逆的,可以没有密钥,也可以使用密钥。给定一任意的长度消息M,都可以产生固定长度的散列值m。散列函数必须满足的特性就是:计算M的散列值要快,反之则是相当困难的,且找到2个具有相同散列值的消息是困难的。一般用于防止篡改,比如很多大型的软件下载的时候,都会在网站公布文件的散列值,下载后就可以根据工具计算其散列值对比,看文件是否正确或者遭到修改。哈希完全不等于加密,很多时候开发人员都对用户表中的密码进行哈希后保存,实际上不叫做加密,只是相当于把密码的“特征指纹”保存下来,而对非法攻击者来说,在不知道真实的“密码”的情况下,得到有相同指纹的密码是极为困难的。