RSA签名加密工具类

it2022-05-05  207

package com.ykx.transfer.contorller; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import net.sf.json.JSONObject; public class RSADemo { public static final String ALGORITHM = "RSA"; public static final String SIGNATURE_ALGORITHM="MD5withRSA"; private static String publickey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDazJE8JgkL4hXA5pJwuBu9skcCrA6cQBGws3G0rmIp/K51sqGVCradW8ait03/5/sUKoHDF2tu89dcuhTYBxgidMDmyBlAznU8WRt9FrgCtlhq4evcq+ZeUAPyXtvBMU18gNJq0EctJbszjTBkGvHuEuJes5lPs3nT+eHG1edwfQIDAQAB"; private static String privatekey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANrMkTwmCQviFcDmknC4G72yRwKsDpxAEbCzcbSuYin8rnWyoZUKtp1bxqK3Tf/n+xQqgcMXa27z11y6FNgHGCJ0wObIGUDOdTxZG30WuAK2WGrh69yr5l5QA/Je28ExTXyA0mrQRy0luzONMGQa8e4S4l6zmU+zedP54cbV53B9AgMBAAECgYA/FCby3kxRXrbCzDZ/xLRKtjD+tjfoGBiBhtpLKtMmI7DwQbWP0GzhZOoZUxtroaejIrYSVpgkfqwiEYuc1D7Cd8N8ucXxG+UJE/lJoI9mlou5UAvEhJpjiWgKJDKkuRai3BfTBWDTCvDFrODPPeFaOGkIFgEFb+q2HoGOHjoOwQJBAPHlBHUz2M93Us2TKisTX+YrpZkyhEL6Z/U6EBcdVBhbnM9VFFT8g+qxQoFhsxg6xQe6I7vveRTR1cBDEqGzUkkCQQDnjsg1+RFdPRfJ4Z55KjdeP5Q2M3iLMGlPOSgcKKPXE7GI3A8rRY+STHXOgP+PWVESRGEG4LhyREwJHjGzRCyVAkEAq++kLoaOylC/W34KUBnyZVGK4IymtFD2ybjerP9cwf+EQ17vF8VxIsWiRwKh4UwMtoRZWAFMqD7KV2GVgbhLeQJAHEw1qWrjtVpG8vPwkuwW0hzA9xK5M4FaDUV14mMRCrKsaoZCEE6y6fUQHIllMdZ/ctUKanXB9KzmAeM/vaGiNQJAGk7xrqDAETApzZhwWmSxNzOJhVcOvo9URXwbwiuD/H5jsxCXMbIog5t0uiGhDN4Aqv5JeGODgGXbWcS598J8/A=="; public void Test() throws Exception {} public static PublicKey getPublicKey(String key) throws Exception { X509EncodedKeySpec keySpec = new X509EncodedKeySpec( Base64.decodeBase64(key)); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(keySpec); return publicKey; } public static PrivateKey getPrivateKey(String key) throws NoSuchAlgorithmException, InvalidKeySpecException { PKCS8EncodedKeySpec privatekeySpec = new PKCS8EncodedKeySpec( Base64.decodeBase64(key)); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePrivate(privatekeySpec); } public static byte[] encrypt(String text, PublicKey key) { byte[] cipherText = null; try { final Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, key); cipherText = cipher.doFinal(text.getBytes()); } catch (Exception e) { e.printStackTrace(); } return cipherText; } /** * RSA算法使用公钥校验数字签名 * * @param data 参与签名的明文字符串 * @param key RSA公钥字符串 * @param sign RSA签名得到的经过Base64编码的字符串 * @return true--验签通过,false--验签未通过 */ public static boolean buildRSAverifyByPublicKey(String data, String key, String sign) { try { //通过X509编码的Key指令获得公钥对象 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(java.util.Base64.getDecoder().decode(key)); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initVerify(publicKey); signature.update(data.getBytes("utf-8")); return signature.verify(java.util.Base64.getDecoder().decode(sign)); } catch (Exception e) { throw new RuntimeException("验签字符串[" + data + "]时遇到异常", e); } } public static void main(String[] args) throws Exception{ HttpPost post = new HttpPost("http://127.0.0.1:8081/transfer/placeorder"); //获取securityKey PublicKey publicKey = getPublicKey(publickey); PrivateKey privateKey = getPrivateKey(privatekey); //拼装查询条件xxx=xxx&yyy=yyy&zzz=zzz String param = "startStationCode=8001qj&pathPoint=綦江"; //签名 Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM); sig.initSign(privateKey); sig.update(param.getBytes()); byte[] sign = sig.sign(); String signature = Base64.encodeBase64String(sign); //加密 byte[] encrypt = encrypt(param, publicKey); String encodeBase64String = Base64.encodeBase64String(encrypt); //拼装json格式请求参数 JSONObject json = new JSONObject(); json.put("data", encodeBase64String); json.put("signature",signature); StringEntity entity = new StringEntity(json.toString(),"UTF-8"); //设置content编码及类型 entity.setContentEncoding("UTF-8"); entity.setContentType("application/json"); post.setEntity(entity); //模拟http post请求发送信息 HttpClient client = HttpClients.createDefault(); HttpResponse response = client.execute(post); System.out.println(response.getStatusLine().getStatusCode()); if(response.getStatusLine().getStatusCode() ==200){ HttpEntity entity_r = response.getEntity(); String personal = EntityUtils.toString(entity_r); System.out.println(personal); } } }

 


最新回复(0)