RSA公钥加签验签

package up.cpc.gw.test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import up.cpc.gw.entity.CommonException;
import up.cpc.gw.utils.SignatureUtil;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

import static up.cpc.gw.utils.SignatureUtil.rsaCheckContent;

public class TestDemo {

public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(TestDemo.class);


    //用于获取已方私钥
    String upSecretPrivatekey = "";
    String upDesKey = "Wnl3Z0Y3SmhiSTM3eDhNTw==";
    //用于获取已方公钥钥进行验签
    String spPublicKey = "";
    //服务商加密解密私钥
    String rsa_private_key_2048_pkcs8 = "";
    //服务商加签验签公钥
    String rsa_public_key_2048_pkcs8 = "";
    //服务商用于加密 已方用于解密 秘钥
    String spDeskey = "UVXVr6bpSgT8h9g0KKhjFwYm";
    //将报文明文通过spDeskey进行加密
     String content = "";
    //时间戳和随机字符串
    String timestamp = "1507709906";
    String nonce = "kYjzVBB8Y0ZFabxSWbWovY3uYSQ2p";
    //报文明文
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("code", "u2fdjfi1");
    jsonObject.put("scope", "AC");
    String jsonString = jsonObject.toJSONString();
    String srcStr = jsonString;
    //报文敏明文装入map中
    Map<String, String> respBodyMap = new HashMap<String, String>();
    respBodyMap.put("code", "u2fdjfi1");
    respBodyMap.put("scope", "AC");
    //拼接字符串
String toSignContent = timestamp + "\n" + nonce_str + "\n" +  jsonString+ "\n";

// String toSignContent = timestamp + “\n” + nonce + “\n” + JSON.toJSONString(respBodyMap) + “\n”;
String toSignContent = “123”;
//使用spDeskey加密字符串
// String encodeStr = encode3Des(spDeskey, srcStr);
//rsa_private_key_2048_pkcs8加密字符串
// String encodeStr = encode3Des(rsa_private_key_2048_pkcs8, srcStr);
//解密
Map<String, Object> contentMap = new HashMap<>();
try {
contentMap = JSON.parseObject(SignatureUtil.decode3Des(upDesKey, content));
} catch (Exception e) {
}

    //加签
    String respSignature = null;
    String RsaPrivateKey = SignatureUtil.decode3Des(upDesKey, upSecretPrivatekey);
    RsaPrivateKey="";
    try {
        respSignature = SignatureUtil.rsa256Sign(toSignContent, RsaPrivateKey, "SHA256WithRSA", "UTF-8");

// respSignature = SignatureUtil.rsa256Sign(toSignContent, RsaPrivateKey, “RSA”, “UTF-8”);

    } catch (Exception e) {
        respBodyMap.put("respCd", "01");
        respBodyMap.put("respMsg", "校企签名失败");

    }
    logger.info("签名---------------------"+respSignature);
    //验签

boolean sign = false;
try {
sign = SignatureUtil.rsa256CheckContent(toSignContent, respSignature, spPublicKey, “UTF-8”);
// sign = SignatureUtil.rsa256Sign(toSignContent, spPublicKey, “SHA256WithRSA”, “UTF-8”);
} catch (CommonException e) {
logger.info("=身份认证验签,不通过 commonException=");
} catch (Exception e) {
logger.info("=身份验证验签,不通过 Exception=");
}
}

public static String decode3Des(String key, String desStr) {
    Base64 base64 = new Base64();
    byte[] keybyte = hex(key);
    byte[] src = base64.decode(desStr);
    try {
        SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
        Cipher c1 = Cipher.getInstance("DESede");
        c1.init(2, deskey);
        byte[] pwd = c1.doFinal(src);
        return new String(pwd);
    } catch (NoSuchAlgorithmException var8) {
        var8.printStackTrace();
    } catch (NoSuchPaddingException var9) {
        var9.printStackTrace();
    } catch (Exception var10) {
        var10.printStackTrace();
    }

    return null;
}

public static byte[] hex(String key) {
    String f = DigestUtils.md5Hex(key);
    byte[] bkeys = (new String(f)).getBytes();
    byte[] enk = new byte[24];
    for (int i = 0; i < 24; ++i) {
        enk[i] = bkeys[i];
    }
    return enk;
}

/**
 * 加密
 *
 * @param key
 * @param srcStr
 * @return
 */
public static String encode3Des(String key, String srcStr) {
    byte[] keybyte = hex(key);
    byte[] src = srcStr.getBytes();
    try {
        //生成密钥
        SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
        //加密
        Cipher c1 = Cipher.getInstance("DESede");
        c1.init(Cipher.ENCRYPT_MODE, deskey);

        String pwd = Base64.encodeBase64String(c1.doFinal(src));

// return c1.doFinal(src);//在单一方面的加密或解密
return pwd;
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (Exception e3) {
e3.printStackTrace();
}
return null;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值