Java 的AES和DES加密

Java 加密:

基本的单向加密算法:

  • BASE64 : 严格上属于编码格式
  • MD5 : Message Digest algorithm 5 ,信息摘要算法
  • SHA : Secure Hash Algorithm ,安全散列算法
  • HMAC : 散列消息鉴别码
    复杂的对称加密、非对称加密算法:
  • DES : Data Encryption Standard ,数据加密算法
  • PBE :Password-based-encryption ,基于密码验证
  • DSA :Digital Signature Algorithm ,数字签名

  • 一、单向加密算法:
  1. MD5:广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值。
  2. ==SHA ==: 数字签名等密码学应用中重要的工具。
    单向加密的用途主要是为了校验数据在传输过程中是否被修改。

二、BASE64加密:

  1. ==BASE64 ==:BASE64(双向的)内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
    常见的有:邮件、http加密
    主要是BASE64Encoder、BASE64Decoder两个类。
    base加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

三、对称加密:

  1. DES :
    DES算法的三个参数有:key、Data、Mode。其中key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密和解密的数据。Mode是DES的工作方式,即解密或加密。
    DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。

  2. AES:
    AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据

    代码栗子如下:

    /**
    * 2019-05-31 by wx AES加密解密demo
    * */
    public class AESTest {
       /*
        * 加密
        * 1.构造密钥生成器
        * 2.根据ecnodeRules规则初始化密钥生成器
        * 3.产生密钥
        * 4.创建和初始化密码器
        * 5.内容加密
        * 6.返回字符串
        */
       public static String encrypt(String pwd ,String content){
    
           try {
               //创建AES的key生产者
               KeyGenerator kgen = KeyGenerator.getInstance("AES");
               //利用密码作为随机数初始化出128位的key生产者
               //加密没关闭,SecureRandom是生成安全随机数序列,pwd.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有pwd就行
               kgen.init(128,new SecureRandom(pwd.getBytes()));
              //
               SecretKey secretKey = kgen.generateKey();//根据密码生成一个密钥
               byte [] enCodeFormat = secretKey.getEncoded();//返回将基本格式的密钥,如果此密钥不支持编码,则返回null
               //转化为AES专用密钥
               SecretKeySpec key = new SecretKeySpec(enCodeFormat,"AES");
              //创建密码器
               Cipher cipher = Cipher.getInstance("AES");
               //初始化为加密模式的密码器
               cipher.init(Cipher.ENCRYPT_MODE,key);
               //获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
               byte[] byteContent = content.getBytes("utf-8");
    
               //加密
               byte[] result =cipher.doFinal(byteContent);
              //将加密后的数据转为字符串
               String s = new String (new BASE64Encoder().encode(result));
    
               return s;
           }catch (NoSuchPaddingException e) {
               e.printStackTrace();
           }
           catch (NoSuchAlgorithmException e) {
               e.printStackTrace();
           }catch (UnsupportedEncodingException e) {
               e.printStackTrace();
           }catch (InvalidKeyException e) {
               e.printStackTrace();
           }catch (IllegalBlockSizeException e) {
               e.printStackTrace();
           } catch (BadPaddingException e) {
               e.printStackTrace();
           }
           return null;
       }
       /*
        * 解密
        * 解密过程:
        * 1.同加密1-4步
        * 2.将加密后的字符串反纺成byte[]数组
        * 3.将加密内容解密
        */
       public static String deencrty(String pwd,String content){
           try {
               //1.构成密钥生成器,指定AES算法,不区分大小写
               KeyGenerator kgen = KeyGenerator.getInstance("AES");
               //2.根据pwd初始化密钥生成器
               //生成一个128位的随机源,根据传入的字节数组
               kgen.init(128,new SecureRandom(pwd.getBytes()));
               //3.产生原始对称密钥
               SecretKey ori_key =kgen.generateKey();
               //4.获得原始对称密钥的字节数组
               byte[] raw =ori_key.getEncoded();
               //5.根据字节数组生成AES密钥
               SecretKey key =new SecretKeySpec(raw ,"AES");
               //6.根据指定算法AES自成密码器
               Cipher cipher = Cipher.getInstance("AES");
               //7. 初始化密码器,第一个参数为加密模式,第二个为使用的key
               cipher.init(Cipher.DECRYPT_MODE,key);
               //8.将加密并编码后的内容解码成字节数组
               byte[] byte_content = new BASE64Decoder().decodeBuffer(content);
               //解密
               byte[] result = cipher.doFinal(byte_content);
               String re = new String (result,"utf-8");
               return re;
    
           } catch (NoSuchAlgorithmException e) {
               e.printStackTrace();
           }catch (NoSuchPaddingException e) {
               e.printStackTrace();
           }catch (InvalidKeyException e) {
               e.printStackTrace();
           }catch (IOException e) {
               e.printStackTrace();
           }catch (IllegalBlockSizeException e) {
               e.printStackTrace();
           } catch (BadPaddingException e) {
               e.printStackTrace();
           }
           return null;
       }
       public static void main (String[] args){
           Scanner scanner = new Scanner(System.in);
           //加密
           System.out.println("使用AES 对称加密,请输入加密的规则:");
           String key = scanner.next();
           System.out.println("请输入要加密的内容:");
           String content = scanner.next();
           String re = encrypt(key,content);
           System.out.println("根据输入的key加密后的密文:"+ re);
    
           //解密
           System.out.println("使用AES对称解密,请输入加密的密钥:与加密时的密钥一致");
           key = scanner.next();
           System.out.println("请输入要解密的密文:");
           content = scanner.next();
          String le=  deencrty(key,content);
           System.out.println("根据输入的密钥key解密后的明文是:"+le);
       }
    

你可能感兴趣的:(Java,基础知识)