• 大小: 8KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2023-02-06
  • 语言: 其他
  • 标签: java  wechat  

资源简介

该工具类主要用于微信公众号消息的加解密,我自己的博客也用到了https://blog.csdn.net/goodbye_youth/article/details/80653132

资源截图

代码片段和文件信息

import org.apache.commons.codec.binary.base64;

import java.util.Arrays;
import java.util.Random;

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

/**
 * @title: WXPublicUtils.java
 * @Description: 提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串)
 * @Author: xj
 */
/**
 * 

     * 
  1. 第三方回复加密消息给公众平台

  2.  * 
  3. 第三方收到公众平台发送的消息,验证消息的安全性,并对消息进行解密。

  4.  * 

 * 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案
 * 

     * 
  1. 在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
     *      http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

  2.  * 
  3. 下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt

  4.  * 
  5. 如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件

  6.  * 
  7. 如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

  8.  * 

 */
public class WXPublicUtils {

    private static base64 base64 = new base64();

    // 生成4个字节的网络字节序
    private static byte[] getNetworkBytesOrder(int sourceNumber) {
        byte[] orderBytes = new byte[4];
        orderBytes[3] = (byte) (sourceNumber & 0xFF);
        orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF);
        orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF);
        orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF);
        return orderBytes;
    }

    // 还原4个字节的网络字节序
    private static int recoverNetworkBytesOrder(byte[] orderBytes) {
        int sourceNumber = 0;
        for (int i = 0; i < 4; i++) {
            sourceNumber <<= 8;
            sourceNumber |= orderBytes[i] & 0xff;
        }
        return sourceNumber;
    }

    // 随机生成16位字符串
    public static String getRandomStr() {
        String base = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789“;
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 16; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }

    /**
     * 对明文进行加密.
     *
     * @param randomStr 随机字符串
     * @param text 需要加密的明文
     * @return 加密后base64编码的字符串
     * @throws AesException aes加密失败
     */
    public static String encrypt(String randomStr String text) throws AesException {
        ByteGroup byteCollector = new ByteGroup();
        byte[] randomStrBytes = randomStr.getBytes(WXConstants.CHARSET);
        byte[] textBytes = text.getBytes(WXConstants.CHARSET);
        byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);
        byte[] appidBytes = WXConstants.APPID.getBytes(WXConstants.CHARSET);

        // randomStr + networkBytesOrder + text + appid
        byteCollector.addBytes(randomStrBytes);
        byteCollector.addBytes(networkBytesOrder);
        byteCollector.addBytes(textBytes);
        byteCollector.addBytes(appidBytes);

        // ... + pad: 使用自定义的填充方式对明文进行补位填充
        byte[] padBytes =

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-06-11 17:14  aes\
     文件        1723  2018-06-11 17:17  aes\AesException.java
     文件         627  2018-06-11 17:18  aes\ByteGroup.java
     文件        1479  2018-06-11 17:18  aes\PKCS7Encoder.java
     文件        2958  2018-06-11 17:18  aes\SHA1.java
     文件        2016  2018-06-11 17:19  aes\xmlParse.java
     文件       11061  2018-06-11 17:20  WXPublicUtils.java

评论

共有 条评论