Java实现对称解密小程序用户信息(AES-128-CBC算法)

import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DecryptUtil {
	// 算法名称
	final String KEY_ALGORITHM = "AES";

	// 加解密算法/模式/填充方式
	final String algorithmStr = "AES/CBC/PKCS7Padding";
	//
	private Key key;
	private Cipher cipher;

	public void init(byte[] keyBytes) {

		// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
		int base = 16;
		if (keyBytes.length % base != 0) {
			int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
			byte[] temp = new byte[groups * base];
			Arrays.fill(temp, (byte) 0);
			System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
			keyBytes = temp;
		}
		// 初始化
		Security.addProvider(new BouncyCastleProvider());
		// 转化成JAVA的密钥格式
		key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
		try {
			// 初始化cipher
			cipher = Cipher.getInstance(algorithmStr);
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 解密方法
	 *
	 * @param encryptedData
	 *            要解密的字符串
	 * @param keyBytes
	 *            解密密钥
	 * @return
	 */
	public byte[] decrypt(String encryptedDataStr, String keyBytesStr, String ivStr) {
		byte[] encryptedText = null;
		byte[] encryptedData = null;
		byte[] sessionkey = null;
		byte[] iv = null;
		
		try {
			sessionkey = Base64.decodeBase64(keyBytesStr);
			encryptedData = Base64.decodeBase64(encryptedDataStr);
			iv = Base64.decodeBase64(ivStr);
			
			init(sessionkey);
			
			cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
			encryptedText = cipher.doFinal(encryptedData);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return encryptedText;
	}

}

外部只需要使用这个类中的解密方法就OK

decryptUtil = new DecryptUtil();
		byte[] data = decryptUtil.decrypt(encryptedData, keys, iv);
		String dataStr = null;
		try {
			dataStr = new String(data,"utf-8");
			// 根据解密算法自行解密(输入参数为appId,sessionKey,encryptedData,iv,返回一个jsonObj)
//			System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + dataStr);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


你可能感兴趣的:(Java实现对称解密小程序用户信息(AES-128-CBC算法))