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


    数字签名、数字证书等技术,是现代信息安全的核心技术,可谓使用面十分广泛。

    其基本理论本身并不复杂,本文希望通过深入浅出的介绍,可以让大家有一些基本了解。

     

    对称加密、非对称加密

    让我们通过一个样例開始:我们的主角各自是Alice和Bob。如今如果Alice要给Bob发送一份文件,文件内容很机密。Alice不希望文件在发送的过程中被人截取而泄密。

    这个时候。自然想到的方法就是对文件进行加密

    当然除了加密外,我们还须要让Bob可以解密。就像Alice对文件上了锁,为了让Bob可以解开。则Bob必须有钥匙来对文件解锁。在信息安全或password学中。我们将这样的钥匙称为密钥。密钥一般分为两种,对称密钥非对称密钥

     

    对称密钥非常easy理解,如同Alice用一把钥匙将文件上锁。而Bob使用同样的钥匙就能够将文件解锁,即加密使用的密钥与解密使用的密钥是同样的。

    眼下的对称密钥算法有DES3DESAES等。而密钥则通常是一串固定长度的字符。

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




    对称密钥算法的安全性还是很有保障的。拿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、AliceBob彼此之间必须约定将使用的密钥。而这个约定的过程本身就可能存在泄密的风险;

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

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

     

    1976年,美国斯坦福大学的研究生Diffie和教授Hellman发表一个基于非对称密钥加密的想法,这个想法开创了password学的变革。

    他们的想法事实上很easy,将密钥分为公钥(publicKey私钥(privateKey两种。

    公钥加密的内容,使用私钥能够解开。而私钥加密的内容,公钥能够解开。然而。单独的知道公钥或私钥,却没有办法推出还有一份密钥。

     

    继续我们的样例:仍然是Alice须要与Bob发送一份绝密文件。在此之前。Bob生成了一对密钥:公钥和私钥。

    Bob将公钥公布在了一个公共的密钥库中,而私钥则不正确外公开。仅Bob本人持有。例如以下图所看到的,Alice从公钥库中取出Bob的公钥。对文件进行加密。再发送给Bob。而Bob通过自己持有的私钥,就可以将文件解密:



    通过非对称密钥,Bob不过将公钥发布。并没有和Alice约定密钥。

    只知道公钥是没有办法推出私钥的,因此不用操心私钥泄密的问题。还有一反面,假设有jessica也想向Bob发送文件,仅须要从公钥库中取到Bob的公钥就可以,也不须要很多其它的密钥。

     

    非对称密钥算法非常有效的攻克了安全性和可用性的问题,非对称密钥算法又称作“公开密钥加密算法”。我们常说的PKIPublic Key Infrastructure)则是建立在此技术之上的安全基础体系。

    眼下使用最为广泛的非对称密钥为RSA算法,该算法是由三位算法发明者的姓氏开头字母命名而来。

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

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





  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1044:判断是否为两位数
    1043:整数大小比较
    1043:整数大小比较
    1043:整数大小比较
    排序算法 —— 插入排序
    排序算法 —— 插入排序
    排序算法 —— 插入排序
    C#中如何获取一个字体的宽度值(像素单位)
    visual studio 恢复默认界面
    visual studio 恢复默认界面
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6843836.html
Copyright © 2020-2023  润新知