Java 实现非对称加密
import javax.crypto.Cipher;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class DecodeString {
public static final String PRIVATE_KEY = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAqBcj+PiAnJqiMO7k" +
"JmvL/HWRUL02ejt8sw+c7UmLGmdnKiGSFKpRuNUEVrTT/QY2FDvCWYhm59o3J5ZN" +
"RT2glQIDAQABAkB3rppPYGj6mGOZYc8SyDgi1ncUPNT4LTj5qck7btzbe9MGBE6Y" +
"pOje5+ivBYZefka3UGWMgHQHC3ygJe2StVr1AiEA1Tt/hAOVrOx7SEfx6p3ixGed" +
"cNvKvt7g9qdgLvy2QQ8CIQDJzc6/STN9UMKFsLpKbUtucJED4n0IPMP46gOgFmb8" +
"GwIgMlY0WQa7m7HLvJl3S2pwMOtA6HaKWxqkQrXqZ80yfRMCIEbsjyIJXxBG5ubH" +
"kuF/gghBhaXg3uKbQKDl1fpYhT9LAiA3+gHzPlcqZrHTN/1EycNI05gmIBrnAV6i" +
"yUwHVC6ZKg==";
public static final String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKgXI/j4gJyaojDu5CZry/x1kVC9Nno7" +
"fLMPnO1JixpnZyohkhSqUbjVBFa00/0GNhQ7wlmIZufaNyeWTUU9oJUCAwEAAQ==";
/**
* 解密<br>
* 用私钥解密
*/
public static String decryptByPrivateKey(String data) throws Exception {
String base64 = decodeBase64URLSafe(data);
Base64.Decoder decoder = Base64.getDecoder();
byte[] base64Decoder = decoder.decode(base64);
return new String(decryptByPrivateKey(base64Decoder));
}
/**
* 解密<br>
* 用私钥解密
*/
public static byte[] decryptByPrivateKey(byte[] data) throws Exception {
// 对密钥解密
Base64.Decoder decoder = Base64.getDecoder();
byte[] keyBytes = decoder.decode(PRIVATE_KEY);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 公钥加密
*/
public static String encryptByPublicKey(String encoderStr) throws Exception {
Base64.Decoder decoder = Base64.getDecoder();
byte[] keyBytes = decoder.decode(PUBLIC_KEY);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key key = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] publicKeyEncode = cipher.doFinal(encoderStr.getBytes());
Base64.Encoder encoder = Base64.getEncoder();
String encodeStr = encoder.encodeToString(publicKeyEncode);
return encodeBase64URLSafe(encodeStr);
}
/**
* Base64加密对url安全
*
* @param string 明文
* @return 密文
*/
public static String encodeBase64URLSafe(String string) {
return string.replace("+", "-").replace("/", "_").replace("=", ",");
}
/**
* Base64解密对url安全
*
* @param string 密文
* @return 明文
*/
public static String decodeBase64URLSafe(String string) {
String base64 = string.replace("-", "+").replace("_", "/").replace(",", "=");
return base64;
}
}