密码学概述

一、密码学的起源与发展

密码学英文名称为Cryptography,密码学最为一门学科,是最近几十年开始迅速被人们重视和发展起来的。密码学往往与信息安全四个字精密的联系着。最早的密码学的”始祖”可以说是早在公元前几百年就已经出现了,当然,当时不会出现像现在这么复杂的安全体系。但是为了避免纯明文式的信息暴露,会有一个字符映射规则,本身的一个字符用另外一个字符代替,只有发送接收方都知道这样的规则,才能明白信息真正的含义,这在上世纪的战争时的信息传输时也被拿来经常使用。但是这样的安全策略是非常脆弱的,一旦规则被人破解掌握,也就意味着信息的完全暴露。

直到上世纪左右,随着计算机信息产业的飞速发展,密码学也逐渐演变为一门专有的学科,也发展起来了,从最简单的单向加密,到对称加密算法,SHA,RSA,数字签名等等算法的出现,密码学这门学科才变得越来越百花齐放了。但是魔高一尺,道高一丈,人们对于数据的安全性提出了越来越高的要求,这也促使着人们对于当前已有的加密算法的不断改进和发展。

二、密码学的常用标语

密钥:分为加密密钥和解密密钥

明文:没有进行加密,直接代表原文含义的信息

密文:经过明文加密操作,隐藏了原文代表的信息

加密:将明文转化为密文的过程

解密:将密文转化为明文的过程

密码算法:在加密和解密中会用到的算法操作。

三、现代密码学的常用算法

(1)、Base64算法。这个其实并不太算是加密算法系类的,他只是采用了一套规则,将明文中的字符进行了一个转码,在邮件的传输中用的比较多。这个算法的目的就是避免了明文的直接暴露。只要掌握了base64算法的转换规则,也是可以非常轻易的破解里面的明文的。

(2)、MD系列算法。俗称Message Digest,消息摘要算法系列,目的就是为了验证数据的完整性时使用的。他是一种单向加密算法。该系列算法从最早的MD2到现在用的最常见的Md5,经历了多个算法版本的演变。MD5的应用除了可以应用在一致性的验证上,还可以用在数字证书和安全访问认证中。后来为了克服MD系列算法后的位数不够的问题,就有了后来的SHA,安全哈希算法,同样是一种消息摘要的算法,也是单向加密算法。下面是一段java实现的MD5算法:

public static String GetMD5Code(String strObj) {
        String resultString = null;
        try {
            resultString = new String(strObj);
            MessageDigest md = MessageDigest.getInstance("MD5");
            // md.digest() 该函数返回值为存放哈希值结果的byte数组
            resultString = byteToString(md.digest(strObj.getBytes()));
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        return resultString;
    }


(3)、DES对称密钥加密算法。DES全程Data Encryption Standard,数据加密标准。DES比上面的MD系列算法在安全和使用的级别上又上升了一个层次。为什么叫做对称密钥加密算法,因为在加解密的过程中,共用了相同的key。也就是说,在加密的过程中我用这个key当做参数进行加密,然后我在解密的过程中还是用这个key做参数进行解密,所以这个key的安全性就显得非常重要。只能让发收双方保有这个keyDES算法整体上的安全性还是非常高的,后来,为了克服DES密钥空间小的问题,又出现了三重DES算法。下面是一段DES算法的java实现:

public byte[] desCrypto(byte[] datasource, String password) {            
                try{
                SecureRandom random = new SecureRandom();
                DESKeySpec desKey = new DESKeySpec(password.getBytes());
                //创建一个密匙工厂,然后用它把DESKeySpec转换成
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
                SecretKey securekey = keyFactory.generateSecret(desKey);
                //Cipher对象实际完成加密操作
                Cipher cipher = Cipher.getInstance("DES");
                //用密匙初始化Cipher对象
                cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
                //现在,获取数据并加密
                //正式执行加密操作
                return cipher.doFinal(datasource);
                }catch(Throwable e){
                        e.printStackTrace();
                }
                return null;
        }

对应的解密过程:

private byte[] decrypt(byte[] src, String password) throws Exception {
                // DES算法要求有一个可信任的随机数源
                SecureRandom random = new SecureRandom();
                // 创建一个DESKeySpec对象
                DESKeySpec desKey = new DESKeySpec(password.getBytes());
                // 创建一个密匙工厂
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
                // 将DESKeySpec对象转换成SecretKey对象
                SecretKey securekey = keyFactory.generateSecret(desKey);
                // Cipher对象实际完成解密操作
                Cipher cipher = Cipher.getInstance("DES");
                // 用密匙初始化Cipher对象
                cipher.init(Cipher.DECRYPT_MODE, securekey, random);
                // 真正开始解密操作
                return cipher.doFinal(src);
        }

(4)、RSA非对称加密算法。这个算法在当前也用的非常的广。RSA算法的名称得来比较有意思,因为他是由3个人研发出来的,所以就以那3个人的名字的首字母拼凑而成。RSA是目前为止最有效的公钥加密算法,可以抵挡住绝大部分的密码攻击。在RSA的算法原理中,他提供了一个公钥和私钥的机制,公钥是暴露的,私钥又各自双方保留。对应的加解密过程为,一方用公钥进行加密,另一方就用自己的私钥进行解密。反之也是如此。RSA算法的安全性依赖于大数的分解。

四、未来密码学的发展与前景

未来密码学还会在更多的方面发挥着更为重要的作用,而且密码学作为一门学科,将不会仅仅是在于加密,解密算法的研究上,在其中会有更细致的领域。包括一些安全协议的设计,或者说与数学知识相关的加密算法技术都会成为新的发展方向。密码学还存在着很多的创新点,但是同样的,密码学面临的挑战也是存在的,在安全领域所面临的挑战也同样会越来越大。

原文地址:https://www.cnblogs.com/bianqi/p/12184078.html