zoukankan      html  css  js  c++  java
  • 密码学概述

    一、密码学的起源与发展

    密码学英文名称为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算法的安全性依赖于大数的分解。

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

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

  • 相关阅读:
    Win2019 preview 版本的安装过程
    Windows 下 Docker 的简单学习使用过程之三 创建images 导出images
    Windows 下 Docker 的简单学习使用过程之二 Docker For windows
    Windows 下 Docker 的简单学习使用过程之一 dockertoolbox
    Helm 安装 nginx-ingress 的方法
    libc.so.6被删后导致系统无法使用的原因及解决方法
    centos6.x升级glibc-2.17
    jmx远程访问权限设置
    ngxtop
    nginx: [emerg] unknown directive "stub_status" in /usr/local/openresty/nginx/conf/conf.d/ngx_metric.conf:19
  • 原文地址:https://www.cnblogs.com/bianqi/p/12184078.html
Copyright © 2011-2022 走看看