本文主要是針對網上的常見RSA加密不能指定密鑰的坑....
RSA可通過這種方式生成密鑰:
/**
* 隨機生成公鑰和私鑰
*/
public static final String publicKeyString = "publicKeyString";
public static final String privateKeyString = "privateKeyString";
public static HashMap<String, String> getRandomKey() throws NoSuchAlgorithmException, InvalidKeySpecException{
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(1024);//生成大小 1024
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//獲取公鑰
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//獲取私鑰
HashMap<String, String> keyMap = new HashMap<String, String>();
keyMap.put(publicKeyString, Base64.encodeToString(publicKey.getEncoded(), Base64.DEFAULT));//獲取公鑰Base64編碼
keyMap.put(privateKeyString, Base64.encodeToString(privateKey.getEncoded(), Base64.DEFAULT));//獲取密鑰Base64編碼
return keyMap;
}
公鑰:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCa3+L0QRaExWO6m28pkLvp/c+XRQ/7ZM8DSJ+HAysytAimnn0ouDUFCy1jcLCQLgcaR9WVqBsPHigZJYwMo6/nd5upwP63BfvZoPnhgK216atkStUKDtmMS2TLnJptjtZcb0g8K+zsbTvYPpv3g+1N7rWgCD4zEtVm/LMyZ7NURwIDAQAB
私鑰:
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJrf4vRBFoTFY7qbbymQu+n9z5dFD/tkzwNIn4cDKzK0CKaefSi4NQULLWNwsJAuBxpH1ZWoGw8eKBkljAyjr+d3m6nA/rcF+9mg+eGArbXpq2RK1QoO2YxLZMucmm2O1lxvSDwr7OxtO9g+m/eD7U3utaAIPjMS1Wb8szJns1RHAgMBAAECgYAs4i+S2/4bslzpqrw3jpN3B7COxVwRXjDEYdqhtSBizFwpdYsOLvxmnsujovf4gO5cBm92tMZKxlGWoBQLYbDLbqpGrVnlX1StDKevuUxSf8Z5EVhQm589hdhG0XCaCJa2S9HiIXh66IZMJ6lbyPtMD1gWXSdfF2nfmuCDL8bVIQJBAOMzUzzMW2+l38iYVNOvtbB+bcN3mCOcr6uGO5fGTqUvcaTDfckDuIrNAJiTqEWh+BGvTQfXmrKOp0JNgcPwfbECQQCugZQvrYeGS6xTNy5WwVKd9LSKLUlSciCi+OCgAKy+9/PNFy0pocYx97xhviFpTbUDlct/WKQ6CbQxmc+i/hd3AkEA2s3UDMpWCJj7gkjJ8K/YT2gCt2tWtn0wZQS6IXnWxZiCXoXyfoM511qEh2w0cxMAP6/OhI3sKqfdhqn0HcpekQJBAJUX3rzRfP3Pf57lgXDb4TNVVD7OLFwFaD71di0eBnlurV0nlQ2Byyz75XZ5FGC85I/4lpHp8P4pNkw+hrlScEcCQF/iNadXt9QZWqutrGLC3nwyBBki5y6zPsYTG9N36UgrH2DyVqHe/pOzWv239akD2sAaCxgg77j2Y+vZCVtSyXI=
重點來了,獲取私鑰公鑰很簡單,重要的是怎么把這點字符串再設置進去~
/**
* 通過字符串生成私鑰
*/
public static PrivateKey getPrivateKey(String privateKeyData){
PrivateKey privateKey = null;
try {
byte[] decodeKey = Base64.decode(privateKeyData,Base64.DEFAULT); //將字符串Base64解碼
PKCS8EncodedKeySpec x509= new PKCS8EncodedKeySpec(decodeKey);//創建x509證書封裝類
KeyFactory keyFactory = KeyFactory.getInstance("RSA");//指定RSA
privateKey = keyFactory.generatePrivate(x509);//生成私鑰
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return privateKey;
}
/**
* 通過字符串生成公鑰
*/
public static PublicKey getPublicKey(String publicKeyData){
PublicKey publicKey = null;
try {
byte[] decodeKey = Base64.decode(publicKeyData, Base64.DEFAULT);
X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodeKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(x509);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return publicKey;
}
搞定,拿到了私鑰公鑰...你懂得 ,開始加密解密...
/**
* 加密
*/
public static byte[] encrypt(String data,Key key){
try {
//取公鑰
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解密
*/
public static byte[] decrypt(byte[] data,Key key){
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}