1.获取perm 文件
接口 加密记得追加商户&key
使用接口文档 即可。
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_7
2。一定要先使用下面的转pkcs8,不然坑死老夫
PKCS#1 转 PKCS#8:
openssl rsa -RSAPublicKey_in -in <filename> -pubout
3. 拿到了PKCS#8
基本解决了加密问题。
参考: http://blog.csdn.net/chaiqunxing51/article/details/52116433
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// PrivateKey
// 切记先到Linx 下转成 PKCS8
PublicKey pub = getPubKey("H:\\workspace\\hmisbackend_hgys\\public.key", "RSA");
System.out.println("get key");
String str = "pptwc";
byte[] estr = encrypt(str.getBytes(), pub, "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING");
String cardNo=encodeBase64(estr);
System.out.println(cardNo);
}
public static byte[] encrypt(byte[] plainBytes, PublicKey publicKey, String cipherAlgorithm) throws Exception {
ByteArrayOutputStream outbuf = null;
try {
Cipher cipher = Cipher.getInstance(cipherAlgorithm);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBlock = cipher.doFinal(plainBytes);
return encryptedBlock;
} catch (Exception e) {
throw new Exception("ENCRYPT ERROR:", e);
} finally {
try {
if (outbuf != null) {
outbuf.close();
}
} catch (Exception e) {
outbuf = null;
throw new Exception("CLOSE ByteArrayOutputStream ERROR:", e);
}
}
}
public static PublicKey getPubKey(String publicKeyPath, String keyAlgorithm) {
PublicKey publicKey = null;
InputStream inputStream = null;
try {
inputStream = new FileInputStream(publicKeyPath);
publicKey = getPublicKey(inputStream, keyAlgorithm);
} catch (Exception e) {
System.out.println("加载公钥出错!");
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
System.out.println("加载公钥,关闭流时出错!");
}
}
}
return publicKey;
}
public static PublicKey getPublicKey(InputStream inputStream, String keyAlgorithm) throws Exception {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String readLine = null;
while ((readLine = br.readLine()) != null) {
if (readLine.charAt(0) == '-') {
continue;
} else {
sb.append(readLine);
sb.append('\r');
}
}
X509EncodedKeySpec pubX509 = new X509EncodedKeySpec(decodeBase64(sb.toString()));
KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);
PublicKey publicKey = keyFactory.generatePublic(pubX509);
return publicKey;
} catch (Exception e) {
throw new Exception("READ PUBLIC KEY ERROR:", e);
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
inputStream = null;
throw new Exception("INPUT STREAM CLOSE ERROR:", e);
}
}
}
// 一下面是base64的编码和解码
public static String encodeBase64(byte[] input) throws Exception {
Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
Method mainMethod = clazz.getMethod("encode", byte[].class);
mainMethod.setAccessible(true);
Object retObj = mainMethod.invoke(null, new Object[] { input });
return (String) retObj;
}
/***
* decode by Base64
*/
public static byte[] decodeBase64(String input) throws Exception {
Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
Method mainMethod = clazz.getMethod("decode", String.class);
mainMethod.setAccessible(true);
Object retObj = mainMethod.invoke(null, input);
return (byte[]) retObj;
}
分享到:
相关推荐
在企业微信支付到个人银行卡的过程中,涉及到的关键技术之一是公钥加密与数字签名,这确保了交易的安全性。本文将详细解析如何将PKCS#1格式的公钥转换为PKCS#8格式,以解决“公钥非法错误”的问题。 首先,理解公钥...
基于BigInteger类用java封装的PKCS#1 v2.1 全算法实现,模块与规范一一对应。包含 I2OSP OS2IP RSAEP RSADP RSASP1 RSAVP1 RSAES-OAEP RSAES-PKCS1_v1_5 RSASSA-PSS RSASSA-PKCS1-v1_5 以及 MGF SourceAlgrithm等...
微信企业付款到个人银行卡的Java实现是一个常见的支付接口调用任务,主要涉及到微信支付API的使用,以及公钥和私钥的加密解密操作。在这个过程中,开发者需要对微信支付平台的接口规范有深入理解,并熟悉Java的加密...
描述中提到的"按照ASN.1语法解析证书请求数据包",意味着我们需要理解ASN.1的编码规则来处理PKCS#10请求。ASN.1定义了一种层次结构的数据表示方式,可以将复杂的数据结构编码为二进制流,方便在网络上传输。在解析...
通过深入理解公钥加密标准、Java的密钥管理机制以及微信支付的API规范,开发者可以有效地解决在微信转账到银行卡过程中遇到的类似问题,从而确保金融交易的安全和可靠性。在这个过程中,熟悉并掌握相关的编程技术和...
"C# SHA256 PKCS#7 生成验名、验签源码 中行支付.rar"这个压缩包文件提供了使用C#编程语言实现SHA256哈希算法和PKCS#7标准来创建和验证签名的源代码。以下将详细解释这两个关键概念及其在金融支付中的应用。 1. SHA...
在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布[1],它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。...
PKCS #12 中文版 PKCS #12 是一種個人身份标识信息傳遞語法的标准,允许用户导入、导出并使用一套统一的个人身份标识信息。该标准描述了私钥、证书、各种形式的秘密值及其扩展。PKCS #12 的出现使得计算机、应用...
PKCS#11的使用场景非常广泛,例如智能卡、加密 token、Hardware Security Module (HSM) 等。PKCS#11提供了一个抽象层次来访问这些设备,使得开发者可以轻松地使用这些设备来实现加密和身份验证功能。 PKCS#11是一个...
PKCS(Public Key Cryptography Standards)是一系列由RSA安全公司制定的公开密钥加密标准,其中PKCS#1是关于RSA算法的具体实现规范。在这个场景中,我们主要关注的是PKCS#1 V1.5版的填充方式。 PKCS#1 V1.5填充是...
填充模式如PKCS#1 v1.5和OAEP(Optimal Asymmetric Encryption Padding)是重要的安全性增强机制。 6. **加密和解密方案** RSA加密通常涉及将明文数据通过幂运算模n转化为密文,而解密则用私钥进行逆运算。PKCS #1...
PKCS #11,全称为Public-Key Cryptography Standards #11,是由RSA安全公司发起的一套接口标准,用于实现加密令牌(如智能卡、硬件安全模块HSM等)与应用程序之间的交互。版本2.11是这个标准的一个更新,旨在提供...
提到PKCS,首先想到的是RSA的证书格式(类似,PKCS8,P12等),最近在和一家俄罗斯支付对接时,对方说加密成PKCS#7格式,当时就懵了,以为对方说错了,在这块卡了好几天,通过查资料,终于找到方法了。确实是PKCS#7...
### PKCS#11 v2.2:Cryptoki标准详解 #### 一、引言 PKCS#11,也称为Cryptoki标准,是公钥密码学标准集的一部分,由RSA实验室开发并发布。PKCS#11为密码模块定义了一个程序设计接口(API),这个API被命名为Cryptoki...
在C#中,我们可以利用System.Security.Cryptography命名空间下的类来实现PKCS #7签名和验签功能。 1. **理解PKCS #7签名** PKCS #7签名主要用于确保数据的完整性和来源的真实性。它通过哈希算法对原始数据进行处理...
越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。
另一个被广泛使用的方案是RSAES-PKCS1-v1_5,它是基于PKCS#1 v1.5标准的加密方案,同样包含加密和解密操作。 在签名方案方面,文档介绍了两种主要的签名方案RSASSA-PSS和RSASSA-PKCS1-v1_5。RSASSA-PSS是一种采用...
PKCS#11是RSA安全公司制定的一套标准,全称为Public Key Cryptography Standards #11,主要用于定义智能卡、硬件安全模块(HSM)和其他密码学设备与应用程序之间的接口。这个标准允许软件通过统一的API(应用程序...
PKCS#1规范是公钥密码学标准(Public-Key Cryptography Standards)之一,主要定义了基于RSA算法的公钥加密技术的基本格式。PKCS#1专注于RSA算法的数字签名和密钥生成,它详述了数字签名的计算方法,以及待签名数据...