import com.jfinal.log.Log;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
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;
/**
* RSA安全編碼組件
*/
public abstract class ToolRSA {
private static final Log log = Log.getLog(ToolRSA.class);
/**
* 非對稱加密密鑰算法
*/
public static final String KEY_ALGORITHM = "RSA";
/**
* 公鑰
*/
private static final String PUBLIC_KEY = "RSAPublicKey";
/**
* 私鑰
*/
private static final String PRIVATE_KEY = "RSAPrivateKey";
/**
* RSA密鑰長度 默認1024位, 密鑰長度必須是64的倍數, 范圍在512至65536位之間。
*/
private static final int KEY_SIZE = 512;
/**
* 私鑰解密
*
* @param data 待解密數據
* @param key 私鑰
* @return byte[] 解密數據
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {
// 取得私鑰
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 生成私鑰
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 對數據解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 公鑰解密
*
* @param data 待解密數據
* @param key 公鑰
* @return byte[] 解密數據
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {
// 取得公鑰
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 生成公鑰
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
// 對數據解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* 公鑰加密
*
* @param data 待加密數據
* @param key 公鑰
* @return byte[] 加密數據
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {
// 取得公鑰
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
// 對數據加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* 私鑰加密
*
* @param data 待加密數據
* @param key 私鑰
* @return byte[] 加密數據
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {
// 取得私鑰
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 生成私鑰
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 對數據加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 取得私鑰
*
* @param keyMap 密鑰Map
* @return byte[] 私鑰
* @throws Exception
*/
public static byte[] getPrivateKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return key.getEncoded();
}
/**
* 取得公鑰
*
* @param keyMap 密鑰Map
* @return byte[] 公鑰
* @throws Exception
*/
public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return key.getEncoded();
}
/**
* 初始化密鑰
*
* @return Map 密鑰Map
* @throws Exception
*/
public static Map<String, Object> initKey() throws Exception {
// 實例化密鑰對生成器
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
// 初始化密鑰對生成器
keyPairGen.initialize(KEY_SIZE);
// 生成密鑰對
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公鑰
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私鑰
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 封裝密鑰
Map<String, Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
//獲得base64加密的公鑰字符串
public static String getPublicKeyStr(Map<String, Object> keyMap) throws Exception {
//獲得map中的公鑰對象 轉為key對象
Key key = (Key) keyMap.get(PUBLIC_KEY);
//編碼返回字符串
return Base64.encodeBase64String(key.getEncoded());
}
//獲得base64加密的私鑰字符串
public static String getPrivateKeyStr(Map<String, Object> keyMap) throws Exception {
//獲得map中的私鑰對象 轉為key對象
Key key = (Key) keyMap.get(PRIVATE_KEY);
//編碼返回字符串
return Base64.encodeBase64String(key.getEncoded());
}
//還原byte數組的公鑰
public static byte[] getPublicKeyByte(String publicKeyStr) {
return Base64.decodeBase64(publicKeyStr);
}
//還原byte數組的私鑰
public static byte[] getPrivateKeyByte(String privateKeyStr) {
return Base64.decodeBase64(privateKeyStr);
}
public static void main(String[] args) {
try {
String dataStr = "今天天氣很好";
Map<String, Object> keyMap = initKey();//初始化公鑰和私鑰
byte[] publicKey = getPublicKey(keyMap);
byte[] privateKey = getPrivateKey(keyMap);
//利用base64生成String字符串的公鑰和私鑰
String publicKeyStr = Base64.encodeBase64String(publicKey);//生成字符串公鑰
byte[] publicKey2 = Base64.decodeBase64(publicKeyStr);//base64還原了公鑰publicKey
String privateKeyStr = Base64.encodeBase64String(privateKey);//生成字符串私鑰
byte[] privateKey2 = Base64.decodeBase64(privateKeyStr);//base64還原了私鑰privateKey
String gStr = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALni7Ge9AHPZKSIAaMmB5dh/3852ZyKWPQIe0VRU3xnymOI7+3XX3tXMMiH7xOYLG7YucaEPm9gUJYS8PFhOGU8CAwEAAQ==";
String pStr = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAueLsZ70Ac9kpIgBoyYHl2H/fznZnIpY9Ah7RVFTfGfKY4jv7ddfe1cwyIfvE5gsbti5xoQ+b2BQlhLw8WE4ZTwIDAQABAkEAl/U4+wkXwJyrMn+RKgHFqrnGdNp4L18QGpak20LSaztwDRUgDhYzGh6HEDhQNB+UG5v+RV2ZYCPuQvUlUjWImQIhAOxoXBGTbw8MbylCur7jOu/N0kEa8TfwDixLShWw64ozAiEAyUqztCQtaT8ZUd9DAl4oOJVucEoLwr5TdRH14RCoUHUCIFakbNHYOgTG5tq1ZSHev9PxmBRaXnvE1DzxnwZSIBE3AiEAvkGVSRdItMmnLPNRatOEQLc9A3V5WEB8sZKgTHJqJGECIHP5aL2buJBVbBMgn8f5wD11TPBKW1ZU9XZrCjGM0Hiw";
byte[] beforData = encryptByPublicKey(dataStr.getBytes(), publicKey);
log.info(new String(beforData));
byte[] afterData = decryptByPrivateKey(beforData, privateKey);
log.info(new String(afterData));
} catch (Exception e) {
e.printStackTrace();
}
}
private void test() {
try {
String password = "k4UUA7/bME/EgFUdNE+syvPX88rm2uFJonOP+7ekqbW0Vrz7lUA2zpw3wP+yKlPgc9xGXJKorBvYQ4F8n6EwXw==";//前台傳入
String username = "IxpcxKe9D6w6aeNVwQAYtL6btjueTK44fmIt4yCq+Rlc3VxxvJLEKI814LkhvQTalduSKr3NMSAn5Wdl7hUc1Q==";//前台傳入
String privateKeyStr = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAueLsZ70Ac9kpIgBoyYHl2H/fznZnIpY9Ah7RVFTfGfKY4jv7ddfe1cwyIfvE5gsbti5xoQ+b2BQlhLw8WE4ZTwIDAQABAkEAl/U4+wkXwJyrMn+RKgHFqrnGdNp4L18QGpak20LSaztwDRUgDhYzGh6HEDhQNB+UG5v+RV2ZYCPuQvUlUjWImQIhAOxoXBGTbw8MbylCur7jOu/N0kEa8TfwDixLShWw64ozAiEAyUqztCQtaT8ZUd9DAl4oOJVucEoLwr5TdRH14RCoUHUCIFakbNHYOgTG5tq1ZSHev9PxmBRaXnvE1DzxnwZSIBE3AiEAvkGVSRdItMmnLPNRatOEQLc9A3V5WEB8sZKgTHJqJGECIHP5aL2buJBVbBMgn8f5wD11TPBKW1ZU9XZrCjGM0Hiw";
byte[] privateKey = Base64.decodeBase64(privateKeyStr);//base64還原了私鑰privateKey
byte[] password2 = decryptByPrivateKey(Base64.decodeBase64(password), privateKey);
log.info(new String(password2));//fxgk@321
byte[] username2 = decryptByPrivateKey(Base64.decodeBase64(username), privateKey);
log.info(new String(username2));//P31170774
} catch (Exception e) {
e.printStackTrace();
}
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
前端加密如要引入
jsencrypt.min.js
下載地址:http://travistidwell.com/jsencrypt/
該文件在解壓后的bin目錄下;
var username = $("#username").val();
var password = $("#password").val();
// 密鑰加密
var publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALni7Ge9AHPZKSIAaMmB5dh/3852ZyKWPQIe0VRU3xnymOI7+3XX3tXMMiH7xOYLG7YucaEPm9gUJYS8PFhOGU8CAwEAAQ==";
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
password = encrypt.encrypt(password);
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
username = encrypt.encrypt(username);