微信退款回调AES算法(AES-256-ECB)
解密步骤如下:
(1)对加密串A做base64解码,得到加密串B
(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )
(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-ext-jdk16</artifactId>
<version>1.45</version>
</dependency>
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.MessageDigest;
import java.security.Security;
import java.util.Base64; public class AESUtil { /**
* 密钥算法
*/
private static final String ALGORITHM = "AES";
/**
* 加解密算法/工作模式/填充方式
*/
private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding"; /**
* AES解密
*
* @param base64Data
* @return
* @throws Exception
*/
public static String decryptData(String base64Data,String lowMad5Key) throws Exception {
SecretKeySpec key = new SecretKeySpec(lowMad5Key.getBytes(), ALGORITHM);
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
cipher.init(Cipher.DECRYPT_MODE, key);
Base64.Decoder decoder = Base64.getDecoder();
String newData= new String(decoder.decode(base64Data), "ISO-8859-1");
return new String(cipher.doFinal(newData.getBytes("ISO-8859-1")), "utf-8");
}
public static String MD5(String data) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] array = md.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
byte[] var4 = array;
int var5 = array.length; for(int var6 = 0; var6 < var5; ++var6) {
byte item = var4[var6];
sb.append(Integer.toHexString(item & 255 | 256).substring(1, 3));
} return sb.toString().toUpperCase();
} public static void main(String[] args) throws Exception {
String a = "0KC5hoCVPyMaxOn5AfQpKjE1Z6Jm6PWI7uCnpCGZXy05YaqOuJXPeMwG6tMvcxwfJOe6u4vKyVZggcwmN0wI2y3CMYG6Z2uS4nluG1Aa/F5ctXurcNH9aGajo3D4Kx/J6hN7/p0IoInVl8gePBzjC5eRxC66ju2W+OaSOlDHT68yrkqeatfcYgjkYk6RGClMvKnl0mM6Nllwr9Bi6ca2vDNqA6TKIq52zu7o0/TBxRctpG4hnfssaQWhGQVMu50arWPyU+6f0aJ/GkJ21nJE/vD5NrjaKWxAOtRpHUWRkvOuUGsA2cx5snrZlRdtRNpAgs72RtoCGjp7IZx4mW88SdcIFG1DEgkzQe+IoVPWf3uAdS+ijbQ6xb7WFoHBrNzBJz84UZjN/tRIqA4qWv8ixIzQ4XUN7REBA4onBCeh/U7FckSuxmkIo8YcNDIrZoJs5KSuymQx6yxZ+Ik5TkGUP6KZZEhkICKy9nK6Tx/Nug2OgxKOhfCivIXe0hrbLd70IqWtypm4PDV8u6YB+uajtNrZY0r5166UZVFWYtn7eOj8OF2PqvWggsK82Mf+R2FykTH0p9NrnoR34h2eNrY4qtbi/J6MrJIGy54Ijuq9ywzV4CFSkJpqWyTezDOtPBJuD9qVNFVXavGYVpWEYGfxNwWYNJVlbNz9iXhWrKLdma4b6VYBJggQnkE53SLlXDuSt9o3BEPYkeWU1WTUhTLyZQosS527QbsigDaiM5Bn4C6Vp7un8Kz2A9j1VmAYV6SyxVivzTe83/2bU8WAORu8wCAfjCk9d9r0AeothIyiagZe9MAFBI9AiGEs5vnrmRgLRYHY7dg4DlpFzBKKucMGFLVLYu/olovrQ6cIfpqB2i7NArunn15Uu62MMhrAicZHUpp72OXT64u4VdOS15kiN8a8q7PjoP13r8IjaWQP9XR9ivAdThYDBbvJaGsCN8qduwa4ndwp7m/GG0c9V1SFo4nAlhI9RCAYkA+eoKIwtmROcgHZBXieOeNF/G3bIHmBAL5uPo2xZqyrvMpTice2lA==";
String ab = AESUtil.decryptData(a,AESUtil.MD5("4567qwer53321ty444rewq87656uyt").toLowerCase());
System.out.println(ab);
} 结果:
======================================== <root>
<out_refund_no><![CDATA[23003134]]></out_refund_no>
<out_trade_no><![CDATA[23003125]]></out_trade_no>
<refund_account><![CDATA[REFUND_SOURCE_RECHARGE_FUNDS]]></refund_account>
<refund_fee><![CDATA[10]]></refund_fee>
<refund_id><![CDATA[240000209102018121407497402648]]></refund_id>
<refund_recv_accout><![CDATA[支付用户零钱]]></refund_recv_accout>
<refund_request_source><![CDATA[API]]></refund_request_source>
<refund_status><![CDATA[SUCCESS]]></refund_status>
<settlement_refund_fee><![CDATA[10]]></settlement_refund_fee>
<settlement_total_fee><![CDATA[11]]></settlement_total_fee>
<success_time><![CDATA[2018-12-14 11:25:58]]></success_time>
<total_fee><![CDATA[11]]></total_fee>
<transaction_id><![CDATA[3200000234201812136388015826]]></transaction_id>
</root> 问题汇总:
Cannot find any provider supporting AES/ECB/PKCS7Padding
增加Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
javax.crypto.BadPaddingException: pad block corrupted
秘钥不正确
微信退款回调AES算法(AES-256-ECB)的更多相关文章
- Delphi与JAVA互加解密AES算法
搞了半天终于把这个对应的参数搞上了,话不多说,先干上代码: package com.bss.util; import java.io.UnsupportedEncodingException; imp ...
- AES算法简介
AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES ...
- AES算法,DES算法,RSA算法JAVA实现
1 AES算法 1.1 算法描述 1.1.1 设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...
- 密码学之DES/AES算法
本文示例代码详见:https://github.com/52fhy/crypt-demo DES DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算 ...
- #微码分享#AES算法的C++包装类
AES为Advanced Encryption Standard的缩写,中文名:高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替代DES.基于std:: ...
- 常见的加密和解密算法—AES
一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用 ...
- 【微信小程序】退款功能教程(含申请退款和退款回调)
1.一定要区分小程序和公众号的退款,唯一的区别就是 appid不一样,其他的都是一样的. 不废话,直接写代码了啊. 放大招!!! 然后,需要注意的:最好是把证书放在下面的php的同级或者下级. 证书的 ...
- 【复习】密码算法——AES
0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...
- 分组密码(四)AES算法① — 密码学复习(七)
介绍完S-PN型结构之后,下面介绍AES算法.由于内容比较多所以将其分为两篇来介绍,本篇主要讲AES的历史时间节点.产生背景.与DES的对比.算法框图(粗略)以及一些数学基础. 7.1 AES的历史时 ...
随机推荐
- windows 根据端口查看进行PID 并杀掉进程
1. 首先用netstat -ano | find “端口号”查出进程号 明明有端口号是17568和18892, 如何确定是17568呢 2. takslist 查询当前的进行 3. 如何杀死进程呢 ...
- 'telnet' 不是内部或外部命令,也不是可运行的程序
1.打开控制面板 2. 3. 4.这样就好可,重新打开cmd命令.
- Ctrl+Alt+Down/Up 按键冲突
I mapped Ctrl-Alt-Up/Down to open web-browser and email client but it didn't take effect. Ctrl-Alt-U ...
- JAVA程序设计的第一次作业
这是我第一次接触博客,刚开始用博客很生疏,感觉很麻烦,但是后来慢慢从老师那里了解到了许多博客可以带给我们的便利.通过博客,我们不仅可以记录自己从刚开始进入程序学习的懵懵懂懂到后来想要学,想深究,想探讨 ...
- spring cloud(五)熔断监控Hystrix Dashboard和Turbine
Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...
- 记一次简单的sql注入
什么是sql注入攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影 ...
- maven war项目完整配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- (1)vue点击图片预览(可旋转、翻转、缩放、上下切换、键盘操作)
今天做项目的时候,遇到了新需求,需要把点击图片放大的功能.学习了一下GitHub上的viewerjs插件 GitHub地址:https://github.com/fengyuanchen/viewer ...
- Linux内存管理(一)
Linux内存管理之一:基本概念篇 物理地址.线性地址(虚拟地址)和逻辑地址:阐述段式管理和页式管理基本概念:Linux操作系统内存管理和虚拟内存概念:为内核开发做一个基础铺垫. 内存是linux内核 ...
- NPOI 关于Excel的学习
1.传送门:http://blog.csdn.net/guo_lover/article/details/52399570