这里以RSA非对称加密算法为例,公钥和私钥是用文章java数字签名中的工具类生成
package cn.cjc.sign;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
import javax.crypto.Cipher;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* RSA加密和解密
*
* @author chenjc
* @since 2017-06-25
*/
public class EncryptAndDecryptUtil {
//生成的公钥
private String pubKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9ZdB9JvyoO8EiDPomoO23Bqb4uUxqNRYwIe+Yr6iNgAAznhVPzcZbeiAF6CFuvX4fZhJaaPoiuK6on6zRaa7YVzbzAxcHIRC+oshXYiBDH4qRRDh2IE4iUclP4p9uAPjrJGkmfKPO4ZCj/JeDSxBmPv7oCz3bWvBXn44/APbC9wIDAQAB";
//生成的私钥
private String priKeyStr = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL1l0H0m/Kg7wSIM+iag7bcGpvi5TGo1FjAh75ivqI2AADOeFU/Nxlt6IAXoIW69fh9mElpo+iK4rqifrNFprthXNvMDFwchEL6iyFdiIEMfipFEOHYgTiJRyU/in24A+OskaSZ8o87hkKP8l4NLEGY+/ugLPdta8Fefjj8A9sL3AgMBAAECgYEAoqPJ048lK/qUMP9f2MgdGiyWOcQ1gIax1QdvTniZj1k50xmPR4Z3LZrD4Q6jlwsWQTRP0l+PXT2mjpr/tpzATQDDf5TH0ZOGzeadD57Pp0+lmEN/4OiTyhAz09ZsrDq39QVvzfAPLHuBAzduHU1eefiiyHYIz3yZ/I9I7+aAS1ECQQDjvEdGaQI80wWJEjwGFPDE/Tjfx1jo4ODd2ZumSbKM7PK7N3KG2vPsi4kkj1T6GXx9dNXIsqiAuIthALHGC+GDAkEA1OdzTYI4n8B+81w2JMwXmEtHOqfOvzBAsqNdeEb7Xgw1RKUcLL9vzSf5GThQQMWIqQ3UByqZ/I4X4HUxF1zifQJBAJWNqUjl4OBMvA/d96kOy2ax3E2ovgyA0WsfYoX7U9QULvsfWIiS9SjcIX3u2qE7Z3OD7HjWSq3tgyp6qEQkvT0CQHEIOFUML9fQsRWu/SfoGxbF0Jk5gjBLA+5TgUpcFRRHUviQ2DaBpG+9KyjSlvjsZrOqHcl4Oqy1G8QVM+z9aVkCQQDFxF26mh/H3I0ZMBZHLHL0/mBlkKEPcf0POwOFrw92579LkyLt0zX+gDmH6ANUewhEEutQf13KAIe4+8Yyu2QS";
//待加密数据
private String data = "你好,我是007!";
//已加密数据
private String encryptedData = "n2xoyZgsaT%2BI0Lw58SplaLltuuv%2B55gkmJrTSU2eduSm929V%2Bp1wRbIOstdCAv0OMBzCAZUFBLpBfjxCEG%2BNqw8eiLlNe046Uv4B1CGOh2j%2FJ9wzgxvSaAlA%2FoFtmZ%2Bq0%2BytdwnSU4ThNpoeBtrPVBEFCaZes90%2BnjvM%2FM7cL1s%3D";
/**
* 公钥加密
*/
@Test
public void encrypt() throws Exception {
KeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(pubKeyStr));
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey key = factory.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] bytes = cipher.doFinal(data.getBytes("utf-8"));//加密,使用UTF-8编码
String base64Encode = Base64.encodeBase64String(bytes);//将字节流数据编码成字符串,以方便传输
String urlEncode = URLEncoder.encode(base64Encode, "utf-8");//由于BASE64编码可能会产生“+”、“/”、“=”等符号,不利于HTTP传输,所以对BASE64编码再进行一次URL编码
System.out.println("encryptedData=" + urlEncode);
}
/**
* 私钥解密
*/
@Test
public void decrypt() throws Exception {
KeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(priKeyStr));
KeyFactory factory = KeyFactory.getInstance("RSA");
PrivateKey key = factory.generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, key);
String urlDecode = URLDecoder.decode(encryptedData, "utf-8");
byte[] base64Decode = Base64.decodeBase64(urlDecode);
byte[] bytes = cipher.doFinal(base64Decode);
String decryptedData = new String(bytes, "utf-8");//使用UTF-8编码
if (decryptedData.equals(data)) {
System.out.println("解密成功!");
} else {
System.out.println("解密失败!");
}
}
}