My Understanding of Cryptography

如果按照普通教科书的编排顺序,一个密码学能够写成百上千页还阐述不清楚,一个 RSA 算法的流程就能讲几十页了。以我们上学期使用的《密码学基础》这本书为例,从古典密码,棋盘密码,移位密码,代换密码到分组密码 DES,AES,再到序列密码;接着是 Hash 函数,公钥密码,数字签名,密钥管理,最后是计算复杂性。想必大家看着这里已经不高兴继续往下看了。既然题目叫 My Understanding of Cryptography,就要跟大家分享下我对密码学的看法。
就我的理解(比较狭隘),密码学就是围绕公钥密码体系(也叫不对称密码体系)来展开研究与应用的。
 
什么是公钥密码体系?我们先来看看我们平时是怎么加密的。
公钥密码体系又叫做不对称密码,既然有不对称,那肯定有对称了,没错,它就是对称密码。我们平时用的 rar 加密就是使用的 AES 对称密码加的密。什么是对称加密?很简单,jasey 要将信息 A 加密,于是使用 rar 的加密功能,输入了一串密码,接着将加密的文件给 kiki,为了解开这份文件,她必须在 rar 中使用跟 jasey 一模一样的密码解密才可以。双方使用相同的密钥(在此先理解为你平常输入的密码吧)对数据进行加密解密,这就是对称加密,而二者共享的那个密钥就称为对称密钥。常用的对称加密算法有 RC4,DES,AES 等。
 
这里面有个问题,jasey 如何将密钥安全的交给 kiki 了,如果这把密钥在传输过程中泄露了,那么加密的内容就毫无保密性可言了。
于是就有了接下来要说的非对称加密,也叫公钥加密。什么意思了?jasey 给 kiki 发送文件 A,kiki 通过某种方式生成一对密钥,一个叫公钥,一个叫私钥,她把公钥发送给 jasey,于是 jasey 就拿 kiki 生成的这把公钥将 A 加密发给 kiki,接着 kiki 用只有她一个人会有的私钥来解密重新得到 A。简单的说就是发送方使用接受方产生的公钥加密文件,接受方使用私钥来解密文件最终得到明文。这里要保证私钥不能泄露。  

然而,非对称加密算法的加密速度普遍较慢。我这里下了个 600M 的 Debian ISO,使用上篇文章讲的 gpg 加密方式进行非对称加密:

# time gpg -e -r panda -o debian.gpg debian-6.0.1a-amd64-CD-1.iso

real    1m18.766s
user    1m10.816s
sys     0m2.302s

可以看到,耗时 1m18s,像现在的男同学下个片子动辄上 G 的,显然是等不及的。当然,非对称的加密强度要远远的高于对称的强度。

所以在实际应用中,往往不直接对文件进行非对称加密。我们使用对称加密来加密数据,再使用非对称加密来加密公钥。过程像下面这样:
jasey 生成一个对称密钥;使用该密钥来加密要传送的数据 A;用 kiki 给他的公钥来加密对称密钥;将加密后的消息跟加密后的密钥一起传送给 kiki。使用对称密钥加密后的信息跟非对称密钥加密后的密钥称又称为数字信封(很形象吧)。
而 kiki 收到 jasey 传给他的加密消息和加密密钥后,先用她的私钥解开加密的对称密钥,再使用解密后的对称密钥解开密文。


 
这里又出现一个问题了(有需求才有相应的技术产生么),如何保证这条加密的信息一定是由 jasey 发出的了?这时候就要使用数字签名技术的。

数字签名说到底还是以公钥密码体系为核心的一套技术。既然是非对称的,就会有加密速度普遍较慢的问题。这里先引入一个概念:Hash。

Hash(哈希,散列),通俗的讲就是将不论包含多少信息的文件最终变成一个固定长度文件的算法。这个 hash 有什么特点,请猛击这里。正是因为上述的这些特点,使他可以用来比较两个文件的异同:哈希值相同,原文件一定相同;哈希值不同,原文件一定不同(通常情况下)。

常见的 Hash 函数有 MD5,SHA1。留心的同学可能已经发现了,我上段话中在括号里面加了个“通常情况下”,但是万一异常了?我们看下面这段 wiki 上的话:

MD5(Message-Digest Algorithm 5),是计算机广泛使用的哈希算法之一。
MD5 较老,散列长度通常为 128 位元。2004 年,王小云证明 MD5 数字签名算法可以产生碰撞。什么是碰撞了?简单理解起来就是输入两个不同值,经过 MD5 出来后得到的最终结果确是相同的。2008 年,科研人员通过 MD5 碰撞成功生成了伪造的 SSL 证书,这使得在 https 协议中服务器可以伪造一些根 CA 的签名!

显然,我们现在已经能找到这样的 X,Y, X != Y,但是 MD5(X) == MD5(Y) 了,也就是说发生了碰撞。

虽然已经证实了,但是 Hash 发生碰撞的机会十分的小,所以大家目前没有必要惊慌。

接下来我们就借助 Hash 和非对称加密来实现一次数字签名:jasey 将要发送的信息 A 做一个 Hash(摘要);接着用自己的私钥来加密这个摘要,即签名;将得到的签名跟原始消息发送给 kiki。kiki 收到后首先用 jasey 的公钥来解密,得到 jasey 产生的摘要;接着将原始的信息进行一次摘要;比较两次摘要的结果,若相同则表示该消息确实是由 jasey 发出的。这样就实现了身份的认证(防抵赖)以及消息的完整性(摘要)。


 
现在我们可以发现加密实现了信息的保密性,而签名实现了消息的完整性以及身份的验证。
上面的这句话就我个人的理解应该算是现代密码学的核心了。

签名的应用场景很广,在现实的应用中,经常能看到这样的身影:很多开源软件的下载页面都会有 MD5 验证或者 gpg 的签名(上篇已经叙述了如何使用);通过 Email 广播时,先签名,防止卡他人假冒广播者;再如大家经常看到的 HTTPS,POP3s,网银证书等等(https 问题将在接下来的文章中涉及)。

上述的情况,其实已经不单单是一个简单的签名了,诸如 HTTPS 这样的协议是融合了加密的。

下面我们就描述一个比较完善的数据传输过程,先签名后加密(刚开始接触理解起来可能有点困难,没关系,多读几遍,自然就理解了):

jasey 将待发送的消息做摘要,用自己产生的私钥加密摘要做签名;使用对称密钥加密原始消息和签名得到消息密文;用 kiki 的公钥加密对称密钥;将加密后的对称密钥跟消息密文传送给 kiki。
kiki 收到后,首先用自己的私钥解密 jasey 生成的对称密钥;接着用对称密钥解密得到消息明文和数字签名;计算原始消息的摘要;用 jasey 的公钥解密签名;比较两份摘要。


 
总结:
签名:使用摘要与非对称加密相结合
加密:对称加密和非对称加密相结合
 
理解上面说的两句话差不多就理解现代密码学的核心了。
这篇博客更侧重于实际应用,并没有解释 DSA,MD5 等算法的内部具体构造,有兴趣的可以 google 一下。上篇博客总结了 GPG 使用方法,下面会带来 OpenSSL 这个神器的使用以及 CA 的相关知识。
 
以上只是本人对密码学的一点点理解,如果有写的不正确或者理解偏差的地方,希望大家指出 :-)
  • http://brightway.be Mucid

    听说碰撞后,米国马上将hash升到128位。

    用openssh自己签了个证书加密dabr……

    • http://jaseywang.info jaseywang

      128 的貌似都算是比较短的了。。。

  • http://www.zypatroon.com zypatroon

    好孩纸, 你写了个我能看懂的了~

    • http://jaseywang.info jaseywang

      妹子啊,哥为了这篇博客单单画图就花了一个下午了。。。下面更精彩~

  • http://www.freetstar.com freetstar

    大爷来赏脸来了^_^

  • http://glacjay.is-a-geek.org/blog/ GlacJAY

    下面就要讲证书系统了吧。

    • http://jaseywang.info jaseywang

      捂脸 ><