RSA公钥加签验签

    技术2023-10-06  90

    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; }

    }

    Processed: 0.017, SQL: 9