AES加密

xiaoxiao2021-02-28  49

在线加密地址:点击打开链接

//编码方式 public static final String bm = "UTF-8"; /** * 功能说明: AES加密/CFB8 * @param data 待加密字符串 * @param vector 向量 * @param passwd 密钥 * @return */ public static String encryptCFB8(String data,String passwd) { try { /***生成密钥***/ SecretKeySpec key = new SecretKeySpec(passwd.getBytes(), "AES"); /***AES/CFB8/NOPADDING模式***/ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); /***加密***/ cipher.init(Cipher.ENCRYPT_MODE, key); //加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式 byte[] encryptedData = cipher.doFinal(data.getBytes(bm)); return new BASE64Encoder().encode(encryptedData); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 功能说明: AES解密/CFB8 * @param data 待解密字符串 * @param vector 向量 * @param passwd 密钥 * @return */ public static String decryptCFB8(String data,String passwd) { try { byte[] byteMi = new BASE64Decoder().decodeBuffer(data); SecretKeySpec key = new SecretKeySpec(passwd.getBytes(),"AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); cipher.init(Cipher.DECRYPT_MODE, key); byte[] decryptedData = cipher.doFinal(byteMi); return new String(decryptedData, bm); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 功能说明: 随机生成16位的密钥 * @return */ public static String createPasswdRandom(){ String passWd = getRandomStr(16); return passWd; } /** * 功能说明:生成指定长度的随机数,不足位数前补0 * @param l * @return */ public static String getRandomStr(int l){ int ranL = 19; if(l < ranL){ ranL = l; } String maxL = formatStr(String.valueOf(ranL),ranL); Long maxI = Long.parseLong(maxL); long s = (long)(maxI*Math.random()); String result = String.format("%0" + l + "d", s); return result; } /** * 功能说明: 不足位数右补0 * @param str * @param maxL * @return */ public static String formatStr(String str,int maxL){ int l = str.length(); if(maxL > l){ for(int i=0;i<maxL-l;i++){ str = str + "0"; } } return str; } /** * 测试 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String content = "201801023536111222"; String passwd = "1234567890123456"; System.out.println(passwd); // 加密 System.out.println("加密前:" + content); String encryptResult = encryptCFB8(content,passwd); System.out.println("加密后:" + new String(encryptResult)); // 解密 String decryptResult = decryptCFB8(encryptResult,passwd); System.out.println("解密后:" + new String(decryptResult)); }

对称加密:加解密都是用的一个秘钥。AES,DES,3DES

非对称加密:一个私有秘钥,一个共有秘钥。一个加密,必须用另外一个解密。RSA  ,DSA

不要向量:

 

//编码方式 public static final String bm = "UTF-8"; /** * 功能说明: AES加密/CFB8 * @param data 待加密字符串 * @param vector 向量 * @param passwd 密钥 * @return */ public static String encryptCFB8(String data,String passwd) { try { /***生成密钥***/ SecretKeySpec key = new SecretKeySpec(passwd.getBytes(), "AES"); /***AES/CFB8/NOPADDING模式***/ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); /***加密***/ cipher.init(Cipher.ENCRYPT_MODE, key); //加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式 byte[] encryptedData = cipher.doFinal(data.getBytes(bm)); return new BASE64Encoder().encode(encryptedData); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 功能说明: AES解密/CFB8 * @param data 待解密字符串 * @param vector 向量 * @param passwd 密钥 * @return */ public static String decryptCFB8(String data,String passwd) { try { byte[] byteMi = new BASE64Decoder().decodeBuffer(data); SecretKeySpec key = new SecretKeySpec(passwd.getBytes(),"AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); cipher.init(Cipher.DECRYPT_MODE, key); byte[] decryptedData = cipher.doFinal(byteMi); return new String(decryptedData, bm); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 功能说明: 随机生成16位的密钥 * @return */ public static String createPasswdRandom(){ String passWd = getRandomStr(16); return passWd; } /** * 功能说明:生成指定长度的随机数,不足位数前补0 * @param l * @return */ public static String getRandomStr(int l){ int ranL = 19; if(l < ranL){ ranL = l; } String maxL = formatStr(String.valueOf(ranL),ranL); Long maxI = Long.parseLong(maxL); long s = (long)(maxI*Math.random()); String result = String.format("%0" + l + "d", s); return result; } /** * 功能说明: 不足位数右补0 * @param str * @param maxL * @return */ public static String formatStr(String str,int maxL){ int l = str.length(); if(maxL > l){ for(int i=0;i<maxL-l;i++){ str = str + "0"; } } return str; } /** * 测试 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String content = "201801023536111222"; String passwd = "1234567890123456"; System.out.println(passwd); // 加密 System.out.println("加密前:" + content); String encryptResult = encryptCFB8(content,passwd); System.out.println("加密后:" + new String(encryptResult)); // 解密 String decryptResult = decryptCFB8(encryptResult,passwd); System.out.println("解密后:" + new String(decryptResult)); }

         

String s = "我的中国新+?&"; byte[] bytes = s.getBytes(); String s1 = new String(Hex.encodeHex(bytes)); System.out.println(s1); byte[] bytes1 = Hex.decodeHex(s1.toCharArray()); System.out.println(new String(bytes1));

这里的Aes加密解密方法使用Hex进行了编码解码

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 package com.baidu.wallet.bdwallet.utils; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; public class Test {     private static final String AES= "AES" ;     private static final String UTF8= "UTF-8" ;      /**      * AES加密      * @param content      * @param pkey      * @return      * @throws DecoderException      */      private static byte [] encrypt(String content, String pkey) throws DecoderException {        try {          String private_key=pkey;          byte [] encodeFormat= null ;          try {            //秘钥 Hex解码为什么秘钥要进行解码,因为秘钥是某个秘钥明文进行了Hex编码后的值,所以在使用的时候要进行解码            encodeFormat = Hex.decodeHex(private_key.toCharArray());          } catch (DecoderException e) {            e.printStackTrace();          }          SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);          // Cipher对象实际完成加密操作          Cipher cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );          // 加密内容进行编码          byte [] byteContent = content.getBytes(UTF8);          // 用密匙初始化Cipher对象          cipher.init(Cipher.ENCRYPT_MODE, key);          // 正式执行加密操作          byte [] result = cipher.doFinal(byteContent);          return result;        } catch (NoSuchAlgorithmException e) {          e.printStackTrace();        } catch (NoSuchPaddingException e) {          e.printStackTrace();        } catch (InvalidKeyException e) {          e.printStackTrace();        } catch (UnsupportedEncodingException e) {          e.printStackTrace();        } catch (IllegalBlockSizeException e) {          e.printStackTrace();        } catch (BadPaddingException e) {          e.printStackTrace();        }        return null ;      }      /**       * AES解密       * @param contents       * @param password       * @return       * @throws DecoderException       */      private static byte [] decrypt(String contents, String password) throws DecoderException {        try {          //密文使用Hex解码          byte []content = Hex.decodeHex(contents.toCharArray());          //秘钥 Hex解码为什么秘钥要进行解码,因为秘钥是某个秘钥明文进行了Hex编码后的值,所以在使用的时候要进行解码          byte [] encodeFormat = Hex.decodeHex(password.toCharArray());          SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);          // Cipher对象实际完成加密操作          Cipher cipher = Cipher.getInstance(AES);          // 用密匙初始化Cipher对象          cipher.init(Cipher.DECRYPT_MODE, key);          // 正式执行解密操作          byte [] result = cipher.doFinal(content);          return result;        } catch (NoSuchAlgorithmException e) {          e.printStackTrace();        } catch (NoSuchPaddingException e) {          e.printStackTrace();        } catch (InvalidKeyException e) {          e.printStackTrace();        } catch (IllegalBlockSizeException e) {          e.printStackTrace();        } catch (BadPaddingException e) {          e.printStackTrace();        }        return null ;      }      /**       * Aes加密       * @param context 明文       * @param private_key 秘钥       * @return       * @throws DecoderException       */      public static String encryption(String context,String private_key) throws DecoderException{        //加密后的明文也就变成了密文        byte [] encryptResult = encrypt(context, private_key);        //密码文Hex编码        String encryptResultStr = Hex.encodeHexString(encryptResult);        return encryptResultStr;      }      /**      * Aes解密      * @param context 密文      * @param private_key 秘钥      * @return      * @throws DecoderException      * @throws UnsupportedEncodingException      */      public static String decryption(String context,String private_key) throws DecoderException, UnsupportedEncodingException{       //这里的密文解密前先进行了Hex解码        byte [] decryptResult = decrypt(context, private_key);        String result = new String(decryptResult, UTF8);        return result;      }      public static void main(String[] args) throws UnsupportedEncodingException, DecoderException {        //加密内容        String content = "123456787654321" ;        //AES加密解密秘钥        String password = "这个值一般都是给定的,双发都知道" ;        // 加密        System.out.println( "加密前:" + content);        // 调用加密方法        String encryptResultStr = encryption(content, password);        System.out.println( "加密后:" + encryptResultStr);        // 调用解密方法        String result = decryption(encryptResultStr, password);        // 解密内容进行解码        System.out.println( "解密后:" + result);      } }
转载请注明原文地址: https://www.6miu.com/read-2622425.html

最新回复(0)