經過OpenSSL生成公私鑰文件(若是沒有OpenSSL工具建議下載Cmder工具自帶OpenSSL指令)java
一、生成RSA密鑰的方法 服務器
genrsa -out private-rsa.key 2048工具
二、獲取客戶端公鑰文件加密
openssl req -new -x509 -key private-rsa.key -days 750 -out public-rsa.cercode
三、獲取服務器私鑰文件blog
openssl pkcs12 -export -name zhangsan -in public-rsa.cer -inkey private-rsa.key -out user-rsa.pfxip
四、獲取密鑰文件的5元組數據ssl
openssl rsa -in private-rsa.key -noout -textci
Java實現私鑰簽名、公鑰驗籤、私鑰加密數據、公鑰解密數據字符串
import javax.crypto.Cipher; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; public class Sha1withRSAUtil { private static final String publicKeyFileName = System.getProperty("user.dir") + File.separator + "pubkey.cer"; private static final String privateKeyFileName = System.getProperty("user.dir") + File.separator + "private.pfx"; private static final String pfxPassword = "123";//私鑰文件獲取時設置的密鑰 private static String aliasName = "003";//alias名稱 /** * 簽名 * * @return 簽名後通過base64處理的字符串 * @throws Exception */ public static String sign(String str) { String base64Sign = ""; InputStream fis = null; try { fis = new FileInputStream(privateKeyFileName); KeyStore keyStore = KeyStore.getInstance("PKCS12"); char[] pscs = pfxPassword.toCharArray(); keyStore.load(fis, pscs); PrivateKey priKey = (PrivateKey) (keyStore.getKey(aliasName, pscs)); // 簽名 Signature sign = Signature.getInstance("SHA1withRSA"); sign.initSign(priKey); byte[] bysData = str.getBytes("UTF-8"); sign.update(bysData); byte[] signByte = sign.sign(); BASE64Encoder encoder = new BASE64Encoder(); base64Sign = encoder.encode(signByte); } catch (Exception e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } return base64Sign; } /** * 數據驗證 * * @param signStr 加密後的數據 * @param verStr 原始字符 * @return */ public static boolean verify(String signStr, String verStr) throws Exception { boolean verfy = false; InputStream fis = null; try { fis = new FileInputStream(publicKeyFileName); CertificateFactory cf = CertificateFactory.getInstance("x509"); Certificate cerCert = cf.generateCertificate(fis); PublicKey pubKey = cerCert.getPublicKey(); BASE64Decoder decoder = new BASE64Decoder(); byte[] signed = decoder.decodeBuffer(signStr); Signature sign = Signature.getInstance("SHA1withRSA"); sign.initVerify(pubKey); sign.update(verStr.getBytes("UTF-8")); verfy = sign.verify(signed); } catch (Exception e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } return verfy; } /** * 經過公鑰文件進行加密數據 * * @return 加密後通過base64處理的字符串 */ public static String encrypt(String source) throws Exception { InputStream fis = null; try { fis = new FileInputStream(publicKeyFileName); CertificateFactory cf = CertificateFactory.getInstance("x509"); Certificate cerCert = cf.generateCertificate(fis); PublicKey pubKey = cerCert.getPublicKey(); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] sbt = source.getBytes(); byte[] epByte = cipher.doFinal(sbt); BASE64Encoder encoder = new BASE64Encoder(); String epStr = encoder.encode(epByte); return epStr; } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 經過私鑰文件進行解密數據 * * @return 解密後的明文字符串 */ public static String decode(String source) throws Exception { BASE64Decoder b64d = new BASE64Decoder(); byte[] keyByte = b64d.decodeBuffer(source); InputStream fis = null; try { fis = new FileInputStream(privateKeyFileName); KeyStore keyStore = KeyStore.getInstance("PKCS12"); char[] pscs = pfxPassword.toCharArray(); keyStore.load(fis, pscs); PrivateKey priKey = (PrivateKey) (keyStore.getKey(aliasName, pscs)); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); byte[] epByte = cipher.doFinal(keyByte); return new String(epByte, "UTF-8"); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
使用方法
import com.util.rsa.Sha1withRSAUtil; public class Main { public static void main(String[] args) { String data = "name123456789"; String signData = Sha1withRSAUtil.sign(data); System.out.println(signData); try { boolean flag = Sha1withRSAUtil.verify(signData, data); System.out.println(flag); String eData = Sha1withRSAUtil.encrypt(data); System.out.println(eData); String dData = Sha1withRSAUtil.decode(eData); System.out.println(dData); } catch (Exception e) { e.printStackTrace(); } } }