Rsa使用方法

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的签名验签方法得以实现。

 

 

 

转载于:https://my.oschina.net/fangMuboy/blog/833920

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值