RSA 介紹
RSA 算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對密鑰(公鑰和私鑰),使用其中一個加密,則需要用另一個才能解密。
實現
1.生成密鑰對
/**
* 隨機生成RSA密鑰對
*
* @param keyLength 密鑰長度,範圍:512~2048
* 一般1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keyLength) {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);
kpg.initialize(keyLength);
return kpg.genKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
2.使用公鑰對數據進行加密
/**
* 使用公鑰對數據進行加密
*
* @param publicKeys 公鑰
* @param data 數據
* @return
*/
public static String encrypt(String publicKeys, byte[] data) {
X509EncodedKeySpec pubX509 = null;
PublicKey publicKey = null;
byte[] bytes = new byte[0];
try {
pubX509 = new X509EncodedKeySpec(hexToString(publicKeys));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(pubX509);
// 加密數據
Cipher cp = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cp.init(Cipher.ENCRYPT_MODE, publicKey);
bytes = cp.doFinal(data);
} catch (Exception e) {
}
String string = byteArrayToHexString(bytes);
return string;
}
3.用公鑰對字符串進行加密
/**
* 用公鑰對字符串進行加密
*
* @param data 原文
*/
public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
// 得到公鑰
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
KeyFactory kf = KeyFactory.getInstance(RSA);
PublicKey keyPublic = kf.generatePublic(keySpec);
// 加密數據
Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return cp.doFinal(data);
}
4.用私鑰對字符串進行加密
/**
* 私鑰加密
*
* @param data 待加密數據
* @param privateKey 密鑰
* @return byte[] 加密數據
*/
public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKey) throws Exception {
// 得到私鑰
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
KeyFactory kf = KeyFactory.getInstance(RSA);
PrivateKey keyPrivate = kf.generatePrivate(keySpec);
// 數據加密
Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, keyPrivate);
return cipher.doFinal(data);
}
5.用公鑰對字符串進行解密
/**
* 公鑰解密
*
* @param data 待解密數據
* @param publicKey 密鑰
* @return byte[] 解密數據
*/
public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
// 得到公鑰
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
KeyFactory kf = KeyFactory.getInstance(RSA);
PublicKey keyPublic = kf.generatePublic(keySpec);
// 數據解密
Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, keyPublic);
return cipher.doFinal(data);
}
6.用私鑰進行解密
/**
* 使用私鑰進行解密
*/
public static byte[] decryptByPrivateKey(String encrypted, String privateKey) throws Exception {
// 得到私鑰
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(hexToString(privateKey));
KeyFactory kf = KeyFactory.getInstance(RSA);
PrivateKey keyPrivate = kf.generatePrivate(keySpec);
// 解密數據
Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
cp.init(Cipher.DECRYPT_MODE, keyPrivate);
byte[] arr = cp.doFinal(hexToString(encrypted));
return arr;
}