分享

数字签名与数字证书技术简介(一)

 dinghxoebpinvw 2018-05-31

数字签名、数字证书等技术,是现代信息安全的核心技术,可谓使用面十分广泛。其基本理论本身并不复杂,本文希望通过深入浅出的介绍,能够让大家有一些基本了解。

 

对称加密、非对称加密

让我们通过一个例子开始:我们的主角分别是Alice和Bob。现在假设Alice要给Bob发送一份文件,文件内容非常机密。Alice不希望文件在发送的过程中被人截取而泄密。

这个时候,自然想到的方法就是对文件进行加密。当然除了加密外,我们还需要让Bob能够解密。就像Alice对文件上了锁,为了让Bob能够解开,则Bob必须有钥匙来对文件解锁。在信息安全或密码学中,我们将这种钥匙称为密钥。密钥一般分为两种,对称密钥非对称密钥

 

对称密钥很容易理解,如同Alice用一把钥匙将文件上锁,而Bob使用相同的钥匙就可以将文件解锁,即加密使用的密钥与解密使用的密钥是相同的。目前的对称密钥算法有DES3DESAES等,而密钥则一般是一串固定长度的字符。

如下,BobAlice事先已经约定,将使用DES算法,并且已经约定好使用的密钥。于是Alice使用这份密钥对文件进行了加密,并发送给BobBob使用相同的密钥对文件解密即可:




对称密钥算法的安全性还是非常有保障的。拿DES算法举例,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间。而3DES(3次DES操作)、AES算法安全性则更高。由此可见,使用对称密钥对文件进行了加密,基本上不用太担心文件可能泄密。

 

目前大部分的开发语言都有对应的数字加密模块,例如JAVA的JCE模块就可以调用简单的实现加解密。以下是一份JAVA代码例子:


  1. package com.test.chiper;  
  2.   
  3. import javax.crypto.Cipher;  
  4. import javax.crypto.spec.SecretKeySpec;  
  5.   
  6. import sun.misc.BASE64Decoder;  
  7. import sun.misc.BASE64Encoder;  
  8.   
  9. public class TestChiper {  
  10.     private static final BASE64Encoder base64En = new sun.misc.BASE64Encoder();  
  11.     private static final BASE64Decoder base64De = new sun.misc.BASE64Decoder();  
  12.     private static String AESKey="1234567890123456";  
  13.       
  14.     public static String encrypt(String mText) throws Exception {  
  15.         SecretKeySpec secrekeysp = new SecretKeySpec(  
  16.                 AESKey.getBytes(),"AES");  
  17.         java.security.Key key = (java.security.Key) secrekeysp;  
  18.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
  19.         cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, key);  
  20.         byte[] b = cipher.doFinal(mText.getBytes());  
  21.         return base64En.encode(b);  
  22.     }  
  23.     public static String decrypt(String mText) throws Exception {  
  24.         SecretKeySpec secrekeysp = new SecretKeySpec(  
  25.                 AESKey.getBytes(),"AES");  
  26.         java.security.Key key = (java.security.Key) secrekeysp;  
  27.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
  28.         cipher.init(javax.crypto.Cipher.DECRYPT_MODE, key);  
  29.         byte[] b = cipher.doFinal(base64De.decodeBuffer(mText));  
  30.         return new String(b);  
  31.     }  
  32.   }  

前文提到的对称密钥算法,已经基本满足了Alice对于文件机密性的要求。然而还是存在两个问题:

1、AliceBob彼此之间必须约定将使用的密钥,而这个约定的过程本身就可能存在泄密的风险;

2、如果除了Alice以外,还有JessicaEvaMary100位女士也需要向Bob发送文件。那么,Bob可能需要有100次约定密钥的过程。

由此可见,无论是安全性还是可用性上,对称密钥都是存在问题的。而两个问题则是必须解决的。

 

1976年,美国斯坦福大学的研究生Diffie和教授Hellman发表一个基于非对称密钥加密的想法,这个想法开创了密码学的变革。他们的想法其实非常简单,将密钥分为公钥(publicKey私钥(privateKey两种。公钥加密的内容,使用私钥可以解开;而私钥加密的内容,公钥可以解开。然而,单独的知道公钥或私钥,却没有办法推出另一份密钥。

 

继续我们的例子:仍然是Alice需要与Bob发送一份绝密文件。在此之前,Bob生成了一对密钥:公钥和私钥。Bob将公钥发布在了一个公共的密钥库中,而私钥则不对外公开,仅Bob本人持有。如下图所示,Alice从公钥库中取出Bob的公钥,对文件进行加密,再发送给Bob。而Bob通过自己持有的私钥,即可将文件解密:



通过非对称密钥,Bob只是将公钥公布,并没有和Alice约定密钥。仅仅知道公钥是没有办法推出私钥的,因此不用担心私钥泄密的问题。另一反面,如果有jessica也想向Bob发送文件,仅需要从公钥库中取到Bob的公钥即可,也不需要更多的密钥。

 

非对称密钥算法很有效的解决了安全性和可用性的问题,非对称密钥算法又称作“公开密钥加密算法”,我们常说的PKIPublic Key Infrastructure)则是建立在此技术之上的安全基础体系。目前使用最为广泛的非对称密钥为RSA算法,该算法是由三位算法发明者的姓氏开头字母命名而来。

由于非对称加密算法的复杂度更高,因此非对称加密的速度远没有对称加密算法快,甚至可能比对称加密慢上1000倍。

后续文章将介绍非对称密钥算法的典型场景:数字签名





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多