zoukankan      html  css  js  c++  java
  • Java 对称加密DES、3DES、AES 算法

    Java 对称加密DES、3DES、AES 算法

    一、对称加密算法

    采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。(by 百度百科)

    1、常用算法

    在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。

    2、算法特征
    • 1、加密方和解密方使用同一个密钥;
    • 2、加密解密的速度比较快,适合数据比较长时的使用;
    • 3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦;
    3、加密工具
    • 1、openssl,它使用了libcrypto加密库、libssl库即TLS/SSL协议的实现库等。TLS/SSL是基于会话的、实现了身份认证、数据机密性和会话完整性的TLS/SSL库。openssl官网。
    • 2、gpg
    4、优缺点

    对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

    对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的独一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

    5、加解密通信模型

    如下图

    image

    二、常用单向加密算法及实现代码

    1、DES(Data Encryption Standard)

    数据加密标准,速度较快,适用于加密大量数据的场合;

    特点:密钥偏短(56位)、生命周期短(避免被破解);

    Java实现:

    1)生成密钥
    KeyGenerator keyGen = KeyGenerator.getInstance("DES");//密钥生成器
    keyGen.init(56);//初始化密钥生成器
    SecretKey secretKey = keyGen.generateKey();//生成密钥
    byte[] key = secretKey.getEncoded();//密钥字节数组
    
    2)加密
    SecretKey secretKey = new SecretKeySpec(key, "DES");//恢复密钥
    Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作类
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,加密模式
    byte[] cipherByte = cipher.doFinal(data);//加密data
    
    3)解密
    SecretKey secretKey = new SecretKeySpec(key, "DES");//恢复密钥
    Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作类
    cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式
    byte[] cipherByte = cipher.doFinal(data);//解密data
    
    2、3DES(Triple DES)

    基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;

    缺点:处理速度较慢、密钥计算时间较长、加密效率不高

    Java实现:

    1)生成密钥
    KeyGenerator keyGen = KeyGenerator.getInstance("DESede");//密钥生成器
    keyGen.init(168); //可指定密钥长度为112或168,默认为168  
    SecretKey secretKey = keyGen.generateKey();//生成密钥
    byte[] key = secretKey.getEncoded();//密钥字节数组
    
    2)3DES加密
    SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢复密钥
    Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作类
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,解密模式
    byte[] cipherByte = cipher.doFinal(data);//加密data
    
    3)3DES解密
    SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢复密钥
    Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作类
    cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式
    byte[] cipherByte = cipher.doFinal(data);//解密data
    
    3、AES(Advanced Encryption Standard)

    高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;

    特点:密钥建立时间短、灵敏性好、内存需求低、安全性高

    1)生成密钥
    KeyGenerator keyGen = KeyGenerator.getInstance("AES");//密钥生成器
    keygen.init(128); //默认128,获得无政策权限后可为192或256
    SecretKey secretKey = keyGen.generateKey();//生成密钥
    byte[] key = secretKey.getEncoded();//密钥字节数组
    
    2)AES加密
    SecretKey secretKey = new SecretKeySpec(key, "AES");//恢复密钥
    Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作类
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,解密模式
    byte[] cipherByte = cipher.doFinal(data);//加密data
    
    3)AES解密
    SecretKey secretKey = new SecretKeySpec(key, "AES");//恢复密钥
    Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作类
    cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式
    byte[] cipherByte = cipher.doFinal(data);//解密data
    
    

    注意:

    • 1、秘钥key的长度,不能随便一个String
    • 2、生成出的密文存在乱码,这是正常现象,解决方法再将密文进行base64编码,解密时先base64解码

    三、使用Hutool工具类

    Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。Hutool最初是我项目中“util”包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集。

    官网地址

    绝不重复造轮子,使用Hutool-crypto。

    加密分为三种:

    • 对称加密(symmetric),例如:AES、DES等
    • 非对称加密(asymmetric),例如:RSA、DSA等
    • 摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等

    hutool-crypto针对这三种加密类型分别封装,并提供常用的大部分加密算法。

    1、添加POM依赖
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>4.6.3</version>
    </dependency>
    
    2、DES加密示例
    package cn.pconline;
    
    import cn.hutool.crypto.SecureUtil;
    
    public class Test {
        public static void main(String[] args) {
            // DES 加密示例
            String cookieKey = "HutoolHutoolHutoolHutool";
            String value = "Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。";
    
            //加密
            byte[] desValue1 = SecureUtil.desede(cookieKey.getBytes()).encrypt(value.getBytes());
            System.out.println(new String(desValue1));
            //解密
            System.out.println(SecureUtil.desede(cookieKey.getBytes()).decryptStr(desValue1));
            
            //加密
            //自带base64编码方法
            String desValue2 = SecureUtil.desede(cookieKey.getBytes()).encryptBase64(value.getBytes());
            System.out.println(desValue2);
            //解密
            System.out.println(SecureUtil.desede(cookieKey.getBytes()).decryptStr(desValue2));
    		/* 
    		hluTqr/nDL/QTxWo4d47yWLjSFqY/WS14Muv9XrPp6V/1j/pcqIF8XIeGod8woyrNxkWCQgEH7Iw5xFiV77bhgent8Mj4i7EgwIvH8J1D3aRLFBseqv7WgKHUdPJNMmD/zG+BAR0xijKFQkXQg5AlvIYNiWNQI1umCMMeKtA4P6Gsmg8WBAioJYD23WLYmfRJlJ7LHnf0cKAfHPF0YytE/kXnugoTrJ2
    		Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。
    		*/
        }
    }
    
    

    原文链接:

    http://blog.csdn.net/smartbetter/article/details/54017759


    PS: 9月10日,今天马云正式宣布,辞任阿里巴巴董事局主席。江湖再见~~

  • 相关阅读:
    模仿商品分类点击效果
    Element MenuNav刷新后点击菜单保留选中状态
    element后端管理布局
    Element NavMenu动态生成导航菜单
    谁的速度快!谁背锅(技术解析)
    “非科班自学”复盘两个月时间在年底成功拿下了字节、阿里offer,入职了字节!
    用了这么久,你真的明白 HttpClient的实现原理了吗?
    求你了,不要再在对外接口中使用枚举类型了
    Docker 实战总结(非常全面),收藏了!
    Service层和Dao层真的有必要每个类都加上接口吗?
  • 原文地址:https://www.cnblogs.com/cnsyear/p/12732133.html
Copyright © 2011-2022 走看看