美文网首页
对称加密算法之四

对称加密算法之四

作者: 喏喏2021 | 来源:发表于2021-12-09 14:04 被阅读0次

    1. 相关概念

    • 加密和解密的密钥是一样的
    • 加解密速度较快,可以在数据较大时使用
    • 一定要保证密钥的安全
    • 加密过程:密文 = 运算过程(原文,密钥,工作模式,填充模式)
    • 加密参数:密钥、工作模式、填充模式
      1. 不同算法的密钥长度不一样,长度越长,安全性越高
      2. 工作模式,也就是加密运算的过程,比如有ECB(电子密码本模式)、CBC(密码分组链接)、CFB(密文反馈模式)、OFB(输出反馈模式)等
      3. 填充模式,运算过程中出现位数不足时,如何进行补全

    2. 常见算法

    • DES 因为密钥较短,极易被破解,一般极少使用
    • 3DES 基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高
    • AES 高级加密标准,是下一代加密算法标准,速度快,安全极别高,推荐使用

    3. 代码示例

    上面提到,工作模式不同,运算的过程也是不一样的,当然代码实现也是不一样的,下面分别介绍

    1. ECB模式
    import java.security.SecureRandom;
    import java.util.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    String content = "abc"; //原文
    String encryptKey = "1234567890ABCDEF";  //16字节,128位密钥
    
    //加密
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); //设置算法、工作模式、填充模式
    SecretKey key = new SecretKeySpec(encryptKey.getBytes(),"AES");
    cipher.init(Cipher.ENCRYPT_MODE, key); //加密模式
    byte[] encryptBytes = cipher.doFinal(content.getBytes("UTF-8")); //得到加密的信息
    System.out.println("encrypt data:" + Base64.getEncoder().encodeToString(encryptBytes));
    //WRsSrNWboZEAWOh27H9ziw==
    
    //解密
    Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKey key1 = new SecretKeySpec(encryptKey.getBytes(),"AES");
    cipher1.init(Cipher.DECRYPT_MODE, key1); //解密信息
    byte[] decryptBytes1 = cipher1.doFinal(encryptBytes); //得到原文
    System.out.println("decrypt data:" + new String(decryptBytes1,"UTF-8"));
    //abc
    
    1. CBC模式
    import java.security.SecureRandom;
    import java.util.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    String content = "abc";
    String encryptKey = "1234567890ABCDEF"; 
    
    //加密
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKey key = new SecretKeySpec(encryptKey.getBytes(),"AES");
    //生成16字节的iv参数,提高安全性
    SecureRandom sr = SecureRandom.getInstanceStrong();
    byte[] iv = sr.generateSeed(16);
    IvParameterSpec ivps = new IvParameterSpec(iv);
    cipher.init(Cipher.ENCRYPT_MODE, key, ivps);
    byte[] encryptBytes = cipher.doFinal(content.getBytes("UTF-8"));
    System.out.println("encrypt data:" + Base64.getEncoder().encodeToString(encryptBytes));
    //2+3Ju+DF4gwd1bDqs3UrhQ==
    //注:因为有随机码的存在,所以每次生成的结果也不是相同的,较安全
    
    //解密
    Cipher cipher1 = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKey key1 = new SecretKeySpec(encryptKey.getBytes(),"AES");
    cipher1.init(Cipher.DECRYPT_MODE, key1,ivps);
    byte[] decryptBytes1 = cipher1.doFinal(encryptBytes);
    System.out.println("decrypt data:" + new String(decryptBytes1,"UTF-8"));
    //abc
    

    上面iv参数因为是随机产生的,本身不需要保密,可以跟着密文一起返回,解密时可以提取出来备用

    相关文章

      网友评论

          本文标题:对称加密算法之四

          本文链接:https://www.haomeiwen.com/subject/pgsffrtx.html