数字签名与数字证书技术简单介绍(一)
数字签名、数字证书等技术,是现代信息安全的核心技术,可谓使用面十分广泛。
其基本理论本身并不复杂,本文希望通过深入浅出的介绍,可以让大家有一些基本了解。
对称加密、非对称加密
让我们通过一个样例開始:我们的主角各自是Alice和Bob。如今如果Alice要给Bob发送一份文件,文件内容很机密。Alice不希望文件在发送的过程中被人截取而泄密。
这个时候。自然想到的方法就是对文件进行加密。
当然除了加密外,我们还须要让Bob可以解密。就像Alice对文件上了锁,为了让Bob可以解开。则Bob必须有钥匙来对文件解锁。在信息安全或password学中。我们将这样的钥匙称为密钥。密钥一般分为两种,对称密钥与非对称密钥:
对称密钥非常easy理解,如同Alice用一把钥匙将文件上锁。而Bob使用同样的钥匙就能够将文件解锁,即加密使用的密钥与解密使用的密钥是同样的。
眼下的对称密钥算法有DES、3DES、AES等。而密钥则通常是一串固定长度的字符。
例如以下,Bob和Alice事先已经约定,将使用DES算法,而且已经约定好使用的密钥。于是Alice使用这份密钥对文件进行了加密,并发送给Bob。Bob使用同样的密钥对文件解密就可以:
对称密钥算法的安全性还是很有保障的。拿DES算法举例,到眼下为止。除了用穷举搜索法对DES算法进行攻击外。还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着假设一台计算机的速度是每一秒钟检測一百万个密钥。则它搜索完所有密钥就须要将近2285年的时间。而3DES(3次DES操作)、AES算法的安全性则更高。由此可见,使用对称密钥对文件进行了加密,基本上不用太操心文件可能泄密。
眼下大部分的开发语言都有相应的数字加密模块。比如JAVA的JCE模块就能够调用简单的实现加解密。下面是一份JAVA代码样例:
package com.test.chiper; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class TestChiper { private static final BASE64Encoder base64En = new sun.misc.BASE64Encoder(); private static final BASE64Decoder base64De = new sun.misc.BASE64Decoder(); private static String AESKey="1234567890123456"; public static String encrypt(String mText) throws Exception { SecretKeySpec secrekeysp = new SecretKeySpec( AESKey.getBytes(),"AES"); java.security.Key key = (java.security.Key) secrekeysp; Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, key); byte[] b = cipher.doFinal(mText.getBytes()); return base64En.encode(b); } public static String decrypt(String mText) throws Exception { SecretKeySpec secrekeysp = new SecretKeySpec( AESKey.getBytes(),"AES"); java.security.Key key = (java.security.Key) secrekeysp; Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(javax.crypto.Cipher.DECRYPT_MODE, key); byte[] b = cipher.doFinal(base64De.decodeBuffer(mText)); return new String(b); } }
前文提到的对称密钥算法,已经基本满足了Alice对于文件机密性的要求。
然而还是存在两个问题:
1、Alice与Bob彼此之间必须约定将使用的密钥。而这个约定的过程本身就可能存在泄密的风险;
2、假设除了Alice以外,还有Jessica、Eva、Mary等100位女士也须要向Bob发送文件。那么,Bob可能须要有100次约定密钥的过程。
由此可见,不管是安全性还是可用性上,对称密钥都是存在问题的。而两个问题则是必须解决的。
1976年,美国斯坦福大学的研究生Diffie和教授Hellman发表一个基于非对称密钥加密的想法,这个想法开创了password学的变革。
他们的想法事实上很easy,将密钥分为公钥(publicKey)和私钥(privateKey)两种。
公钥加密的内容,使用私钥能够解开。而私钥加密的内容,公钥能够解开。然而。单独的知道公钥或私钥,却没有办法推出还有一份密钥。
继续我们的样例:仍然是Alice须要与Bob发送一份绝密文件。在此之前。Bob生成了一对密钥:公钥和私钥。
Bob将公钥公布在了一个公共的密钥库中,而私钥则不正确外公开。仅Bob本人持有。例如以下图所看到的,Alice从公钥库中取出Bob的公钥。对文件进行加密。再发送给Bob。而Bob通过自己持有的私钥,就可以将文件解密:
通过非对称密钥,Bob不过将公钥发布。并没有和Alice约定密钥。
只知道公钥是没有办法推出私钥的,因此不用操心私钥泄密的问题。还有一反面,假设有jessica也想向Bob发送文件,仅须要从公钥库中取到Bob的公钥就可以,也不须要很多其它的密钥。
非对称密钥算法非常有效的攻克了安全性和可用性的问题,非对称密钥算法又称作“公开密钥加密算法”。我们常说的PKI(Public Key Infrastructure)则是建立在此技术之上的安全基础体系。
眼下使用最为广泛的非对称密钥为RSA算法,该算法是由三位算法发明者的姓氏开头字母命名而来。
因为非对称加密算法的复杂度更高,因此非对称加密的速度远没有对称加密算法快,甚至可能比对称加密慢上1000倍。
兴许文章将介绍非对称密钥算法的典型场景:数字签名