zoukankan      html  css  js  c++  java
  • aes加解密

    小程序开发时常用aes解密 解密微信信息获取手机号  昵称
    package com.chiefclouds.crm1664.utils;

    import org.apache.tomcat.util.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.io.UnsupportedEncodingException;
    import java.security.*;
    import java.security.spec.InvalidParameterSpecException;

    /**
    * AES-128-CBC 加密方式
    * 注:
    * AES-128-CBC可以自己定义“密钥”和“偏移量“。
    * AES-128是jdk自动生成的“密钥”。
    */
    public class AesCbcUtil {

    private static Logger logger = LoggerFactory.getLogger(AesCbcUtil.class);

    static{
    try{
    Security.addProvider(new BouncyCastleProvider());
    }catch(Exception e){
    e.printStackTrace();
    }
    }

    /**
    * AES解密
    *
    * @param data //密文,被加密的数据
    * @param key //秘钥
    * @param iv //偏移量
    * @param encodingFormat //解密后的结果需要进行的编码
    * @return
    * @throws Exception
    */
    public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
    // initialize();
    //被加密的数据
    byte[] dataByte = new Base64().decode(data);
    //加密秘钥
    byte[] keyByte = new Base64().decode(key);
    //偏移量
    byte[] ivByte = new Base64().decode(iv);

    try {
    // Provider BC = new BouncyCastleProvider();
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");

    SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");

    AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
    parameters.init(new IvParameterSpec(ivByte));

    cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
    byte[] resultByte = cipher.doFinal(dataByte);
    if (null != resultByte && resultByte.length > 0) {
    String result = new String(resultByte, encodingFormat);
    return result;
    }
    return null;
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    } catch (NoSuchPaddingException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    } catch (InvalidParameterSpecException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    } catch (InvalidKeyException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    } catch (InvalidAlgorithmParameterException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    } catch (IllegalBlockSizeException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    } catch (BadPaddingException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    logger.error(e.getMessage(), e);
    }

    return null;
    }

    }
    使用:
    String result = AesCbcUtil.decrypt(loginInfo.getEncryptedData(), loginInfo.getSessionKey(), loginInfo.getIv(), "UTF-8");
    JSONObject json = JSONObject.parseObject(result);
    System.err.println("解密信息= " + json);



  • 相关阅读:
    Flume入门与进阶
    git如何忽略已经加入版本控制的文件
    Redis常用命令
    如何在宝塔面板上添加创建一个定时任务
    PHP代码篇(九)PHP接口开发如何使用JWT进行验证身份
    七. Go并发编程--sync.Once
    六. Go并发编程--WaitGroup
    5. Go 并发编程--sync/atomic
    4. Go并发编程--Mutex/RWMutex
    docker内服务访问宿主机服务
  • 原文地址:https://www.cnblogs.com/yxj808/p/14597036.html
Copyright © 2011-2022 走看看