RSA加密工具類(非對稱加密算法)



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);













免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM