AES-128-CBC加密模式

  • Post author:
  • Post category:其他


使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同! 工具类:



public class AesEncryptNopaddingUtil {

  //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同!
  private static String KEY = "ArvinIsSoGentrye";
  private static String IV = "ArvinVeryHandsom";


  /**
   * 加密方法
   * @param data  要加密的数据
   * @param key 加密key
   * @param iv 加密iv
   * @return 加密的结果
   * @throws Exception
   */
  public static String encrypt(String data, String key, String iv) throws Exception {
      try {

          Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"
          int blockSize = cipher.getBlockSize();

          byte[] dataBytes = data.getBytes();
          int plaintextLength = dataBytes.length;
          if (plaintextLength % blockSize != 0) {
              plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
          }

          byte[] plaintext = new byte[plaintextLength];
          System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

          SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
          IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

          cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
          byte[] encrypted = cipher.doFinal(plaintext);

          return new Base64().encodeToString(encrypted);

      } catch (Exception e) {
          e.printStackTrace();
          return null;
      }
  }

  /**
   * 解密方法
   * @param data 要解密的数据
   * @param key  解密key
   * @param iv 解密iv
   * @return 解密的结果
   * @throws Exception
   */
  public static String desEncrypt(String data, String key, String iv) throws Exception {
      try {
          byte[] encrypted1 = new Base64().decode(data);

          Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
          SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
          IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

          cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

          byte[] original = cipher.doFinal(encrypted1);
          String originalString = new String(original);
          return originalString;
      } catch (Exception e) {
          e.printStackTrace();
          return null;
      }
  }

  /**
   * 使用默认的key和iv加密
   * @param data
   * @return
   * @throws Exception
   */
  public static String encrypt(String data) throws Exception {
      return encrypt(data, KEY, IV);
  }

  /**
   * 使用默认的key和iv解密
   * @param data
   * @return
   * @throws Exception
   */
  public static String desEncrypt(String data) throws Exception {
      return desEncrypt(data, KEY, IV);
  }



  /**
   * 测试方法
   */
  public static void main(String args[]) throws Exception {

      String test = "Hello";
      String data = null;
      String key = "ArvinIsSoGentrye";
      String iv = "ArvinVeryHandsom";

      data = encrypt(test, key, iv);

      System.out.println(data);
      System.out.println(desEncrypt(data, key, iv));
      System.out.println(desEncrypt("9NayJ6DeDNxIgUKQHkmR4w==", key, iv));

  }
}

在HTML中使用

<!-- 下载jar包 -->
	<script type="text/javascript" src="js/core.js"></script>
	<script type="text/javascript" src="js/lib-typedarrays.js"></script>
	<script type="text/javascript" src="js/aes.js"></script>
	<script type="text/javascript">
			CryptoJS.pad.ZeroPadding={pad:function(a,c){var b=4*c;a.clamp();a.sigBytes+=b-(a.sigBytes%b||b)},unpad:function(a){for(var c=a.words,b=a.sigBytes-1;!(c[b>>>2]>>>24-8*(b%4)&255);)b--;a.sigBytes=b+1}};
	</script>
	<script type="text/javascript">
		 function encryptNoPadding(data) {
	     var key  = CryptoJS.enc.Utf8.parse('ArvinIsSoGentrye');
	     var iv   = CryptoJS.enc.Utf8.parse('ArvinVeryHandsom');
	     return CryptoJS.AES.encrypt(data, key, {iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding}).toString();
	 }
		 var payPwd=psd1+psd2+psd3+psd4+psd5+psd6
		  payPwd = encryptNoPadding(payPwd);
		 console.log("payPwd:"+payPwd);

转载于:https://my.oschina.net/u/3727427/blog/2990913