package com.acquirer.test;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.security.SignatureException;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import com.acquirer.common.util.Base64Helper;
import com.acquirer.common.util.DateUtil;
import com.acquirer.common.util.NumberStringUtil;
import com.acquirer.common.util.RsaUtil;
import com.acquirer.common.util.SignatureUtil;
import com.google.gson.Gson;
public class RsaTest {
public static final String modulus = "8B6D8CAE9C9494FC1AE3C90E5869111447FA19F66F62D904787C973862D08B0056CA891ECA0CA7CF5D38407BA7AF8FC9A83624CDC46B9A47B0FEBAD0FC730D80C7C1CA1088731D758C6D26A3A2DF7BD7634EEA107B6D752609A16C9C671758A853135214425C58B0DD25779DFB070B08817F0828C72BEF11A5D7F998D0F81D49";
public static final String exponent = "4782B76DF3372DB6A3E00285CE088D4EF69FAAE33F3BD68CB9734568111E5EBC9CC7224EDD58625533BD9F2D0CD3398F372C15F24774DCDB3A475BEFC61B08682A941F8B170B82944FB3CEBBD12E37190853271B88018F55A30E788CA2EF944BB0DDB3BA7D08426D0825A040AF3D082DDCA238EAC5445D372891AE6AF11D7FB5";
public static String privatekeybase64 = "MIIBOQIBADANBgkqhkiG9w0BAQEFAASCASMwggEfAgEAAoGCAKhqPyOvuSDDKPNF+bxO0+fPvjTz\nREqmfjucqtvakR9xDUJ9KWTiaqOf8riA0yx8LMLwtx7wYKf7WIMhQflERhprdbq/PvJyKgzvG0/V\nfAIQeU28cRko79Ar1O59LhcWl216R/U2IcXYdA5zuGhDu1K3WcRKM4aUc6vvdfghv238jwIBAAKB\nggCborP+sqGOmUv6pSwIzYAetWi9XiViOjGRfVKYIgAC4mKykx/xzxtlYqbXwpVkgsyKyhEwUkvA\ncRJ2/AEP7fwq5KW74a0rEw/8SP3MmrOz/pLotmP0X52/excR6jZkMdxQQN2jbVyK1BTidoO+zBJO\nr8Sb2mOEjEgvHTChqtzF3YECAQACAQACAQACAQACAQA=";
public static String publickeybase64 = "MIGgMA0GCSqGSIb3DQEBAQUAA4GOADCBigKBggCoaj8jr7kgwyjzRfm8TtPnz74080RKpn47nKrb\n2pEfcQ1CfSlk4mqjn/K4gNMsfCzC8Lce8GCn+1iDIUH5REYaa3W6vz7ycioM7xtP1XwCEHlNvHEZ\nKO/QK9TufS4XFpdtekf1NiHF2HQOc7hoQ7tSt1nESjOGlHOr73X4Ib9t/I8CAwEAAQ==";
// public static final String modulus = "8B6D8CAE9C9494FC1AE3C90E5869111447FA19F66F62D904787C973862D08B0056CA891ECA0CA7CF5D38407BA7AF8FC9A83624CDC46B9A47B0FEBAD0FC730D80C7C1CA1088731D758C6D26A3A2DF7BD7634EEA107B6D752609A16C9C671758A853135214425C58B0DD25779DFB070B08817F0828C72BEF11A5D7F998D0F81D49";
// public static final String exponent = "4782B76DF3372DB6A3E00285CE088D4EF69FAAE33F3BD68CB9734568111E5EBC9CC7224EDD58625533BD9F2D0CD3398F372C15F24774DCDB3A475BEFC61B08682A941F8B170B82944FB3CEBBD12E37190853271B88018F55A30E788CA2EF944BB0DDB3BA7D08426D0825A040AF3D082DDCA238EAC5445D372891AE6AF11D7FB5";
/**将生成的java公私钥转成.net要的xml格式
*
* @param encodedPrivkey
* @return
*/
private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivkey) {
try {
StringBuffer buff = new StringBuffer(1024);
PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec(
encodedPrivkey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
.generatePrivate(pvkKeySpec);
buff.append("<RSAKeyValue>");
buff.append("<Modulus>"
+ Base64Helper.encode(removeMSZero(pvkKey.getModulus().toByteArray()))
+ "</Modulus>");
buff.append("<Exponent>"
+ Base64Helper.encode(removeMSZero(pvkKey.getPublicExponent()
.toByteArray())) + "</Exponent>");
buff.append("<P>"
+ Base64Helper.encode(removeMSZero(pvkKey.getPrimeP().toByteArray()))
+ "</P>");
buff.append("<Q>"
+ Base64Helper.encode(removeMSZero(pvkKey.getPrimeQ().toByteArray()))
+ "</Q>");
buff.append("<DP>"
+ Base64Helper.encode(removeMSZero(pvkKey.getPrimeExponentP()
.toByteArray())) + "</DP>");
buff.append("<DQ>"
+ Base64Helper.encode(removeMSZero(pvkKey.getPrimeExponentQ()
.toByteArray())) + "</DQ>");
buff.append("<InverseQ>"
+ Base64Helper.encode(removeMSZero(pvkKey.getCrtCoefficient()
.toByteArray())) + "</InverseQ>");
buff.append("<D>"
+ Base64Helper.encode(removeMSZero(pvkKey.getPrivateExponent()
.toByteArray())) + "</D>");
buff.append("</RSAKeyValue>");
return buff.toString().replaceAll("[ \t\n\r]", "");
} catch (Exception e) {
System.err.println(e);
return null;
}
}
/**将生成的java公私钥转成.net要的xml格式
*
* @param encodedPrivkey
* @return
*/
private static String getRSAPublicKeyAsNetFormat(byte[] encodedPublicKey) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey pukKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(encodedPublicKey));
StringBuffer buff = new StringBuffer(1024);
buff.append("<RSAKeyValue>");
buff.append("<Modulus>"
+ Base64Helper.encode(removeMSZero(pukKey.getModulus().toByteArray()))
+ "</Modulus>");
buff.append("<Exponent>"
+ Base64Helper.encode(removeMSZero(pukKey.getPublicExponent().toByteArray())) + "</Exponent>");
buff.append("</RSAKeyValue>");
return buff.toString().replaceAll("[ \t\n\r]", "");
} catch (Exception e) {
System.err.println(e);
return null;
}
}
public static void main(String[] args) {
try {
// RSAPrivateKey privateKey = RsaUtil.loadPrivateKey(modulus, exponent, 16);
//
//生成asp所用的公私钥文件
// javastr2asp();
//加密
Gson gson = new Gson();
HashMap<String, Object> map=new HashMap<String,Object>();
map.put("instid", "10000001");
map.put("mchntid", "jieshun001");
map.put("psn", "C0001");
map.put("txntime", "20170207212244");
map.put("txncode", "monthmealdown");
map.put("seqid", "50000000000000000");
// map.put("oprtype", "1");
String jsonStr;
jsonStr = gson.toJson(map);
System.out.println(jsonStr);
// Map<String, Object> keymap = getPublicKey();
// RSAPrivateKey prikey = (RSAPrivateKey) keymap.get("PRIVATE_KEY");
// RSAPublicKey pubkey = (RSAPublicKey) keymap.get("PUBLIC_KEY");
// RSAPrivateKey prikey = getRSAPrivateKeyBybase64(privatekeybase64);
// RSAPublicKey pubkey = getRSAPublidKeyBybase64(publickeybase64);
// String signstr = privateKeyEncrypt(jsonStr,prikey);
// String jsonStr = "123456";
String signstr ="4C1B4A04A7B3F19F10A75183C1B8562EDC3FEF7EA46AC303C3392DE6BED8A3146CB9C557449A22D727C20B784ED7429848E056DEB95986153267BA1117B09A514CFB1A03A40EB5EB0AF12EE1E463C31BA7873BAA64B4DFEE509BEE07A1C344294DF8EFEB89747D43934A2A81F94DD503BF957E33ACFB12356D5EE90865194CA2";
RSAPublicKey pubkey = RsaUtil.loadPublicKey(modulus, "10001", 16);
System.out.println(signVerified("",jsonStr,signstr,pubkey ));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void javastr2asp() {
RSAPrivateKey privatekey = getRSAPrivateKeyBybase64(privatekeybase64);
RSAPublicKey publickey = getRSAPublidKeyBybase64(publickeybase64);
System.out.println("it is ok");
String privatestrxml = getRSAPrivateKeyAsNetFormat(privatekey.getEncoded());
String publickeystrxml = getRSAPublicKeyAsNetFormat(publickey.getEncoded());
System.out.println("publickeystrxml="+publickeystrxml);
System.out.println("privatestrxml="+privatestrxml);
}
/**
* 除0操作
* @param data
* @return
*/
private static byte[] removeMSZero(byte[] data) {
byte[] data1;
int len = data.length;
if (data[0] == 0) {
data1 = new byte[data.length - 1];
System.arraycopy(data, 1, data1, 0, len - 1);
} else
data1 = data;
return data1;
}
/**
* 将生成的证书密钥的base64字符串转换成公钥,私钥文件
* @param base64s
* @return
*/
public static RSAPublicKey getRSAPublidKeyBybase64(String base64s) {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64Helper.decode(base64s));
RSAPublicKey publicKey = null;
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
publicKey = (RSAPublicKey)keyFactory.generatePublic(keySpec);
} catch (InvalidKeySpecException var4) {
System.out.println("base64编码=" + base64s + "转RSA公钥失败"+var4);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return publicKey;
}
/**
* 将生成的证书密钥的base64字符串转换成公钥,私钥文件
* @param base64s
* @return
*/
public static RSAPrivateKey getRSAPrivateKeyBybase64(String base64s) {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64Helper.decode(base64s));
RSAPrivateKey privateKey = null;
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
privateKey = (RSAPrivateKey)keyFactory.generatePrivate(keySpec);
} catch (InvalidKeySpecException var4) {
System.out.println("base64编码=" + base64s + "转RSA私钥失败"+var4 );
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return privateKey;
}
/**
* 利用生成的私钥加密
*/
public static String privateKeyEncrypt(String jsonStr,RSAPrivateKey privatekey){
String strhex = null;
Signature sig;
try {
sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(privatekey);
byte [] plainText = jsonStr.getBytes();
sig.update(plainText);
byte[] signature=sig.sign();
strhex = NumberStringUtil.bytesToHexString(signature);
System.out.println(Base64Helper.encode(signature));
System.out.println(strhex);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return strhex;
}
/**
* 根据公钥验签
*/
public synchronized static boolean signVerified(String signAlgor, String jsonstr,
String signData,RSAPublicKey publicKey) {
byte[] plainText = jsonstr.getBytes();
byte[] sign = NumberStringUtil.hexStringToBytes(signData);
String temp = NumberStringUtil.bytesToHexString(sign);
System.out.println(temp);
Boolean signVerify = false;
try {
Signature signature=Signature.getInstance("SHA1WithRSA");
signature.initVerify(publicKey);
signature.update(plainText);
signVerify = signature.verify(sign);
} catch (Exception e) {
}
return signVerify;
}
/**
* 生成公钥私钥
* @return
* @throws Exception
*/
public static Map<String, Object> getPublicKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
String privatestrxml = getRSAPrivateKeyAsNetFormat(privateKey.getEncoded());
String publickeystrxml = getRSAPublicKeyAsNetFormat(publicKey.getEncoded());
System.out.println(privatestrxml);
System.out.println(publickeystrxml);
Map<String,Object> keyMap = new HashMap<String, Object>();
keyMap.put("PUBLIC_KEY", publicKey);
keyMap.put("PRIVATE_KEY", privateKey);
return keyMap;
}
public static boolean signVerified1(String signAlgor, byte[] plainText,
byte[] signData, String modulus, String exponent) {
RSAPublicKey publicKey;
Boolean signVerify = null;
try {
publicKey = RsaUtil.loadPublicKey(modulus, exponent, 16);
signVerify = SignatureUtil.signVerified(plainText, signData, publicKey, signAlgor);
} catch (Exception e) {
}
return signVerify;
}
}
开发中遇到和.net平台对接,用到了sha1withrsa算法进行,签名,验签,上面的方法没有起到效果,最终大神的通过将java中的jar包转成.net的dll文件,使用java的签名验签方法得以实现。