java的RSA加密
阿新 • • 發佈:2019-01-24
package com.jetsum.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * RSA演算法,實現資料的加密解密。 * @author ShaoJiang * */ public class RSAUtil { private static Cipher cipher; static{ try { cipher = Cipher.getInstance("RSA"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } } /** * 生成金鑰對 * @param filePath 生成金鑰的路徑 * @return */ public static Map<String,String> generateKeyPair(String filePath){ try { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // 金鑰位數 keyPairGen.initialize(1024); // 金鑰對 KeyPair keyPair = keyPairGen.generateKeyPair(); // 公鑰 PublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 私鑰 PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); //得到公鑰字串 String publicKeyString = getKeyString(publicKey); //得到私鑰字串 String privateKeyString = getKeyString(privateKey); //將金鑰對寫入到檔案 FileWriter pubfw = new FileWriter(filePath+"/publicKey.keystore"); FileWriter prifw = new FileWriter(filePath+"/privateKey.keystore"); BufferedWriter pubbw = new BufferedWriter(pubfw); BufferedWriter pribw = new BufferedWriter(prifw); pubbw.write(publicKeyString); pribw.write(privateKeyString); pubbw.flush(); pubbw.close(); pubfw.close(); pribw.flush(); pribw.close(); prifw.close(); //將生成的金鑰對返回 Map<String,String> map = new HashMap<String,String>(); map.put("publicKey",publicKeyString); map.put("privateKey",privateKeyString); return map; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 得到公鑰 * * @param key * 金鑰字串(經過base64編碼) * @throws Exception */ public static PublicKey getPublicKey(String key) throws Exception { byte[] keyBytes; keyBytes = (new BASE64Decoder()).decodeBuffer(key); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(keySpec); return publicKey; } /** * 得到私鑰 * * @param key * 金鑰字串(經過base64編碼) * @throws Exception */ public static PrivateKey getPrivateKey(String key) throws Exception { byte[] keyBytes; keyBytes = (new BASE64Decoder()).decodeBuffer(key); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } /** * 得到金鑰字串(經過base64編碼) * * @return */ public static String getKeyString(Key key) throws Exception { byte[] keyBytes = key.getEncoded(); String s = (new BASE64Encoder()).encode(keyBytes); return s; } /** * 使用公鑰對明文進行加密,返回BASE64編碼的字串 * @param publicKey * @param plainText * @return */ public static String encrypt(PublicKey publicKey,String plainText){ try { cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] enBytes = cipher.doFinal(plainText.getBytes()); return (new BASE64Encoder()).encode(enBytes); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; } /** * 使用keystore對明文進行加密 * @param publicKeystore 公鑰檔案路徑 * @param plainText 明文 * @return */ public static String encrypt(String publicKeystore,String plainText){ try { FileReader fr = new FileReader(publicKeystore); BufferedReader br = new BufferedReader(fr); String publicKeyString=""; String str; while((str=br.readLine())!=null){ publicKeyString+=str; } br.close(); fr.close(); cipher.init(Cipher.ENCRYPT_MODE,getPublicKey(publicKeyString)); byte[] enBytes = cipher.doFinal(plainText.getBytes()); return (new BASE64Encoder()).encode(enBytes); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 使用私鑰對明文密文進行解密 * @param privateKey * @param enStr * @return */ public static String decrypt(PrivateKey privateKey,String enStr){ try { cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] deBytes = cipher.doFinal((new BASE64Decoder()).decodeBuffer(enStr)); return new String(deBytes); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * 使用keystore對密文進行解密 * @param privateKeystore 私鑰路徑 * @param enStr 密文 * @return */ public static String decrypt(String privateKeystore,String enStr){ try { FileReader fr = new FileReader(privateKeystore); BufferedReader br = new BufferedReader(fr); String privateKeyString=""; String str; while((str=br.readLine())!=null){ privateKeyString+=str; } br.close(); fr.close(); cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKeyString)); byte[] deBytes = cipher.doFinal((new BASE64Decoder()).decodeBuffer(enStr)); return new String(deBytes); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } }