银联支付接口使用rsa 数据加密。明文rsa密钥生成工具都是16进制的字符串,加密结果和对方给的小工具加密的结果不一样

原文及更多文章请见个人博客:
1.现在版本的支付宝wap支付需要到支付宝后台获取一个token,该字段是加密返回的,需要调用RSA类进行解密 2.银联APP支付是直接给sdk包,然后调用sdk包做tn获取的,内部调用是个黑盒,开发是看不到的
1.在不调用银联APP SDK进行初始化的情况下,支付宝WAP支付整体流程都是正确的,token能拿到,也能正常解密 2.在进行一次银联支付后,即银联SDK初始化后,支付宝WAP支付开始一直报错,现象为token加密字符串能获取,但是解密一直是乱码
查看银联SDK后,发现在其CertUtil中有个init()静态方法,其调用方法中,有以下两行坑爹代码:
Security.insertProviderAt(new BouncyCastleProvider(), 1);
Security.addProvider(new BouncyCastleProvider());
这两行代码是什么意思呢? 在Security全局上下文环境,将BouncyCastleProvider这个算法类,直接变成默认算法类 导致了什么结果呢? 当你调用支付宝提供的RSA类的时候,默认的算法类从JDK自带的SUN RSA,变成了这个BouncyCastleProvider提供的RSA算法,直接导致和支付宝的加密算法不匹配,于是报错乱码。
修改RSA类如下,手动指定算法的provider类
package com.wonders.
public class RSA {
public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
* RSA验签名检查
待签名数据
* ali_public_key 支付宝公钥
* input_charset
public static boolean verify(String content, String sign, String ali_public_key, String input_charset) {
Provider provider = Security.getProvider("SunRsaSign");
KeyFactory keyFactory = KeyFactory.getInstance("RSA", provider);
byte[] encodedKey = Base64.decode(ali_public_key);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS, provider);
signature.initVerify(pubKey);
signature.update(content.getBytes(input_charset));
boolean bverify = signature.verify(Base64.decode(sign));
} catch (Exception e) {
e.printStackTrace();
return false;
* private_key
* input_charset 编码格式
* 解密后的字符串
public static String decrypt(String content, String private_key, String input_charset) throws Exception {
System.out.println("alipay decrypt content..." + content);
System.out.println("alipay decrypt key..." + private_key);
PrivateKey prikey = getPrivateKey(private_key);
Provider provider = Security.getProvider("SunJCE");
Cipher cipher = Cipher.getInstance("RSA", provider);
cipher.init(Cipher.DECRYPT_MODE, prikey);
InputStream ins = new ByteArrayInputStream(Base64.decode(content));
ByteArrayOutputStream writer = new ByteArrayOutputStream();
byte[] buf = new byte[128];
while ((bufl = ins.read(buf)) != -1) {
byte[] block = null;
if (buf.length == bufl) {
block = new byte[bufl];
for (int i = 0; i & i++) {
block[i] = buf[i];
writer.write(cipher.doFinal(block));
return new String(writer.toByteArray(), input_charset);
* 得到私钥 * * key * 密钥字符串(经过base64编码) * Exception
public static PrivateKey getPrivateKey(String key) throws Exception {
byte[] keyB
keyBytes = Base64.decode(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
Provider provider = Security.getProvider("SunRsaSign");
KeyFactory keyFactory = KeyFactory.getInstance("RSA", provider);
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateK
最后吐槽一下银联的SDK,拜托大哥你以后代码写的不要那么暴力,稍微低调点OK?这么修改全局参数,直接会导致工程中其它加解密类全部趴窝
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1449次
排名:千里之外
原创:20篇私钥加密 md5withRSA解决办法 - ASP.NET当前位置:& &&&私钥加密 md5withRSA解决办法私钥加密 md5withRSA解决办法&&网友分享于:&&浏览:542次私钥加密 md5withRSA第一个问题 怎么获取私钥并进行 md5withRSA
加密要加密的字符串 如:123456abc为啥我获取到的私钥.ToString()是 System.Security.Cryptography.RSACryptoServiceProvider这个类型的小白确实不懂 &证书是.pfx格式的有做过相关的没?求思路 求代码话说java的例子大大的有 就是C#的找了N久没发现Bouncy Castle这个是英文的鸭梨山大------解决方案--------------------System.Security.Cryptography.RSACryptoServiceProvider这东西可以直接用来加密。点一下。
------解决方案--------------------
------解决方案--------------------探讨这个是银联推荐 md5withRSA 问了下谷哥 http://www.bouncycastle.org/csharp/ 有一个 英文不给力o(︶︿︶)o 唉现在要用私钥进行签名 不懂 加密学昨天下午才接触到 今天还要搞定 SSL 还要部署环境 当然这个也不懂
------解决方案--------------------
探讨这个是银联推荐 md5withRSA 问了下谷哥 http://www.bouncycastle.org/csharp/ 有一个 英文不给力o(︶︿︶)o 唉现在要用私钥进行签名 不懂 加密学昨天下午才接触到 今天还要搞定 SSL 还要部署环境 当然这个也不懂
------解决方案--------------------下面代码 你复制过来用吧。需要稍微修改一下。最好自己做dllhttp://jasondct./blog/static//
------解决方案--------------------
X509Certificate2 objx5092 = new X509Certificate2(@&C:\Users\Administrator\Desktop\ddddd.pfx&,&12345&);
System.Security.Cryptography.RSACryptoServiceProvider rsa = objx5092.PrivateKey as RSACryptoServiceP
byte[] data = Encoding.UTF8.GetBytes(&Today&);
byte[] hashvalue = rsa.SignData(data, &MD5&);
X509Certificate2 pub = new X509Certificate2(@&C:\Users\Administrator\Desktop\ppppp.cer&);
RSACryptoServiceProvider rsaPublic = pub.PublicKey.Key as RSACryptoServiceP
bool a = rsaPublic.VerifyData(data, &MD5&, hashvalue);
------解决方案--------------------
------解决方案--------------------
探讨引用:是webservice的地址类似https://host:port/servicename这样子的么?https://192.168.8.1:90/CardWebServiceProvider?wsdl我用的是这样子ssl 我google了多少 java版的啊 C#版的绝迹了 密钥库,证书库 这些到底怎么用啊 ...……
------解决方案--------------------
主要是这个:C# code
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ServerSSLCertificateValidation);
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 rsa 选择明文攻击 的文章

 

随机推荐