`

微信小程序解密数据(encryptData)

阅读更多

 

 /**
 * 对公众平台发送给公众账号的消息加解密示例代码.
 * 
 * @copyright Copyright (c) 1998-2014 Tencent Inc.
 */


import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * 提供基于PKCS7算法的加解密接口.
 */
class PKCS7Encoder {
	static Charset CHARSET = Charset.forName("utf-8");
	static int BLOCK_SIZE = 32;

	/**
	 * 获得对明文进行补位填充的字节.
	 * 
	 * @param count 需要进行填充补位操作的明文字节个数
	 * @return 补齐用的字节数组
	 */
	static byte[] encode(int count) {
		// 计算需要填充的位数
		int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
		if (amountToPad == 0) {
			amountToPad = BLOCK_SIZE;
		}
		// 获得补位所用的字符
		char padChr = chr(amountToPad);
		String tmp = new String();
		for (int index = 0; index < amountToPad; index++) {
			tmp += padChr;
		}
		return tmp.getBytes(CHARSET);
	}

	/**
	 * 删除解密后明文的补位字符
	 * 
	 * @param decrypted 解密后的明文
	 * @return 删除补位字符后的明文
	 */
	static byte[] decode(byte[] decrypted) {
		int pad = (int) decrypted[decrypted.length - 1];
		if (pad < 1 || pad > 32) {
			pad = 0;
		}
		return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
	}

	/**
	 * 将数字转化成ASCII码对应的字符,用于对明文进行补码
	 * 
	 * @param a 需要转化的数字
	 * @return 转化得到的字符
	 */
	static char chr(int a) {
		byte target = (byte) (a & 0xFF);
		return (char) target;
	}

}

 

 

 

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

import sun.misc.BASE64Decoder;
import com.alibaba.fastjson.JSONObject;

/**
 * 对微信小程序用户加密数据的解密示例代码.
 * 
 * @ClassName WXBizDataCrypt
 * @Description TODO(这里用一句话描述这个类的作用)
 * @author tf
 * @Date 2016年11月19日 下午2:56:36
 * @version 1.0.0
 */
@SuppressWarnings("restriction")
public class WXBizDataCrypt {
	/*
	 * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。
	 */
	private static WXBizDataCrypt instance = null;

	private WXBizDataCrypt() {

	}

	public static WXBizDataCrypt getInstance() {
		if (instance == null)
			instance = new WXBizDataCrypt();
		return instance;
	}

	/**
	 * 对于官方加密数据(encryptData)解密说明如下: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的
	 * openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(
	 * encryptedData )进行对称解密。 解密算法如下: 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
	 * 对称解密的目标密文为 Base64_Decode(encryptedData), 对称解密秘钥 aeskey =
	 * Base64_Decode(session_key), aeskey 是16字节 对称解密算法初始向量 iv 会在数据接口中返回。
	 * 
	 * @Description (TODO这里用一句话描述这个方法的作用)
	 * @param encryptedData
	 *            加密内容
	 * @param sessionKey
	 *            小程序登录sessionKey
	 * @param iv
	 *            解密算法初始向量 iv 会在数据接口中返回。
	 * @param encodingFormat
	 *            编码格式默认UTF-8
	 * @return 返回解密后的字符串
	 * @throws Exception
	 */
	public String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception {
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
			BASE64Decoder base64Decoder = new BASE64Decoder();
			byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData);
			byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey);
			byte[] _iv = base64Decoder.decodeBuffer(iv);
			SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES");
			IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv);
			cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
			byte[] original = cipher.doFinal(_encryptedData);
			byte[] bytes = PKCS7Encoder.decode(original);
			String originalString = new String(bytes, "UTF-8");
			return originalString;
		} catch (Exception ex) {
			return null;
		}
	}

	public static void main(String[] args) throws Exception {
		// 需要加密的字串
		// String appid = "wx4f4bc4dec97d474b";
		String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";

		String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM" + "QmRzooG2xrDcvSnxIMXFufNstNGTyaGS"
				+ "9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+" + "3hVbJSRgv+4lGOETKUQz6OYStslQ142d"
				+ "NCuabNPGBzlooOmB231qMM85d2/fV6Ch" + "evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6"
				+ "/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw" + "u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn"
				+ "/Hz7saL8xz+W//FRAUid1OksQaQx4CMs" + "8LOddcQhULW4ucetDf96JcR3g0gfRK4P"
				+ "C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB" + "6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns"
				+ "/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd" + "lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV"
				+ "oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG" + "20f0a04COwfneQAGGwd5oa+T8yO5hzuy" + "Db/XcxxmK01EpqOyuxINew==";

		String iv = "r7BXXKkLb8qrSNn05n0qiA==";
		String deString = WXBizDataCrypt.getInstance().decrypt(encryptedData, sessionKey, iv, "utf-8");
		JSONObject jsonObject = JSONObject.parseObject(deString);
		System.out.println(jsonObject);
	}
}

 

 

运行后的结果如下:

{"watermark":{"timestamp":1477314187,"appid":"wx4f4bc4dec97d474b"},"nickName":"Band","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0","province":"Guangdong","unionId":"ocMvos6NjeKLIBqg5Mr9QjxrP1FA","gender":1,"language":"zh_CN","country":"CN","city":"Guangzhou","openId":"oGZUI0egBJY1zhBYw2KhdUfwVJJE"}

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics