java MD5WithRSA 算法
首先我们来看Java中的 MD5withRSA 签名
JAVA private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import kh.pms.tools.StringUtil;
/**
* 签名验签及加密 1.对原文进行des加密。 2.des加密数据进行md5。 3.用我方私钥进行md5的签名。 4.用我方公钥对des加密数据进行加密
*
* @author chx
*
*/
public class MD5withRSA {
private static final String FLAG_RSA = "RSA";
private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
/**
* 我方私钥对象
*/
private PrivateKey myPrivateKeyObj;
/**
* 银行方公钥对象
*/
private PublicKey bankPublicKeyObj;
/**
* 获取签名
*
* @return
* @throws Exception
*/
public byte[] getSign(String str) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 签名的算法
signature.initSign(myPrivateKeyObj);
signature.update(str.getBytes());
return signature.sign();
}
/**
* 析构函数
*
* @param plain
* 待加解密原文
* @throws Exception
*/
public MD5withRSA() throws Exception {
myPrivateKeyObj = getPrivateKey(); //将此处的JianHangUtil.bankPublicKey更换为自己的公钥字符串(base64格式),后面的
bankPublicKeyObj = getPublicKey(JianHangUtil.bankPublicKey);
}
/**
* 通过预制公钥生成PublicKey
*
* @param pubKey
* @return
* @throws Exception
*/
private PublicKey getPublicKey(String key) throws Exception {
byte[] encoded = StringUtil.getBaseStrJie(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
KeyFactory factory = KeyFactory.getInstance(FLAG_RSA);
return factory.generatePublic(keySpec);
}
/**
* 将指定的字符串转换为私钥key
*
* @param priKey
* @return
* @throws Exception
*/
private PrivateKey getPrivateKey() throws Exception {
// 首先进行base64解码。
byte[] encoded = StringUtil.getBaseStrJie(JianHangUtil.myPrivateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory factory = KeyFactory.getInstance(FLAG_RSA);
return factory.generatePrivate(keySpec);
}
/**
* 验证签名
*
* @param data
* 原文
* @param mySign
* 签名
* @return
* @throws Exception
*/
public boolean yanZhengSign(byte[] data, byte[] mySign) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(bankPublicKeyObj);
signature.update(data);
return signature.verify(mySign);
}
加解密
package kh.pms.bank;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import kh.pms.tools.StringUtil;
/**
* 报文加解密工具(注意,本类所有方法均会进行base64解码)
*
* @author chx
*
*/
public class DESedeCoder {
/**
* 密钥算法
*/
private static String KEY_ALGORITHM = "DESede";
private static String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";
/**
* 加密(会对des和公钥进行base64解码)
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return byte[] 加密数据
* @throws Exception
*/
public byte[] encrypt(byte[] src) throws Exception {
DESedeKeySpec dks = new DESedeKeySpec(StringUtil.getBaseStrJie(JianHangUtil.desKey));
SecretKeyFactory keyFactory &