RSA自用加解密,公钥私钥,密文测试(copy用)
import org.apache.commons.codec.binary.Base64;
import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
/**
* RSA 加密和解密
* RSA加密可以通过公钥加密私钥解密和私钥加密公钥解密两种方式
* TODO 一般为了数据安全性会使用公钥加密,私钥解密的方式进行加密
* @author LinCh
**/
public class RSACXUtil {
/** 分段最大加密长度 */
private static final int MAX_ENCRYPT_BLOCK = 117;
/** 分段最大解密长度 */
private static final int MAX_DECRYPT_BLOCK = 128;
/**
* 使用私钥进行解密
* @param privateKeyText 私钥秘钥文本
* @param cipherText 密文
* @return 明文
*/
public static String decryptByPrivateKey(String privateKeyText, String cipherText) throws Exception {
byte[] encPriKey = Base64.decodeBase64(privateKeyText);
PKCS8EncodedKeySpec encPriKeySpec = new PKCS8EncodedKeySpec(encPriKey);
return decrypt(KeyFactory.getInstance("RSA").generatePrivate(encPriKeySpec), cipherText);
}
/**
* 解密
* @param key 公钥
* @param cipherText 密文
* @return 明文
*/
private static String decrypt(Key key, String cipherText) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
if (cipherText == null || cipherText.length() == 0) {
return cipherText;
}
byte[] encryptedData = Base64.decodeBase64(cipherText);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return new String(decryptedData);
}
/**
* 根据公钥进行加密
* @param publicKeyText 公钥秘钥文本
* @param cipherText 明文
* @return 密文
*/
public static String encryptByPublicKey(String publicKeyText, String cipherText) throws Exception {
byte[] publicKeyBytes = Base64.decodeBase64(publicKeyText);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes);
return encrypt(KeyFactory.getInstance("RSA").generatePublic(x509KeySpec), cipherText);
}
/**
* 加密
* @param key 公钥
* @param plainText 明文
* @return 密文
*/
private static String encrypt(Key key, String plainText) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] data = plainText.getBytes("UTF-8");
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return Base64.encodeBase64String(encryptedData);
}
public static void main(String[] args) throws Exception {
// 运行测试
// 公钥
String MY_PUBLIC_KEY_STRING = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9vBlCW+Erzqflo6fKhJslqSWnLMx6MN7ud+Oon" +
"fkFx7qIpPlJq4hmwVFsueIfef4gCt7RwWjQZRl3piSY5Q0UjkXmTM27nETippF+sSFfsHeIDgM6Tn" +
"ZAZw3IXhK5AxPFa9IhSr/vh3wSu5yI7XO3ribKXpRBfZ57AnrKiwXZd7UwIDAQAB";
// 私钥
String MY_PRIVATE_KEY_STRING = "MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAL28GUJb4SvOp+Wjp8qEmyWpJacsn" +
"zHow3u5346h+QXHuoik+UmriGbBUWy54h95/iAK3tHBaNBlGXemJJjlDRSOReZMzbucROKmkX6xIn" +
"V+wd4gOAzpNkBnDcheErkDE8Vr0iFKv++HfBK7nIjtc7euJspelEF9nnsCesqLBdl3tTAgMBAAECn" +
"gYEAnBpGLfKqMAC24pjjVBwGCdZAxGp3UZEj2c+J3vcBoVtUz9oWtRmRSSIeYv2Hy+fhX1sFeeq9n" +
"Mo5SdfIBINvX5R2WWKrhZrC+qVHX8plTVDQ0DWGSzAboz8+mODQ9RI5o6rASPUJJHe4m8aRuD5XFn" +
"PjX9rjczos0kyaj3qU3VigECQQD82S6u6fgQcUAdFn6uL9Gn8LIaxyE+229qTBCEs5TIy8O7F9Ygn" +
"Mit1k26uU6qY2M7HOFv1Ij8qaV3EQvCbpDKbAkEAwBmGsiBF+Npudrg3jCar+QSa+zjo+76SkvAXn" +
"oPyM5i9k2WeT/NODym6qdbGVcq05f8TkHNBpDhEMsO/q4RnpqQJBAIbs7jhwqes8Q9ZB1r/kzKAtn" +
"lR0s/dSpDD9Q78+gdNjhw0TnZ2Au5XoMfpeQFg0SROWScZ/R8psTNvIwNm0XpdkCQQCyV0BooHO1n" +
"q7x/9ViEgeaIghEMCHKsPOnBBqs5Jx38GaXr/DA0uX2R8xnHuD1BwLYv+2+3nHjbuVJp9eK+Zps5n" +
"AkEAu+hFwglPRWApHnnNmhkKsU+toP8QLvmVHOdVuIC5RQ2a7vpLKx8RQ6rvjMqJ8f7MA6wMD+FGn" +
"tqOX+I3YrySnBA==";
// 加密密文
String text1 = RSACXUtil.encryptByPublicKey(MY_PUBLIC_KEY_STRING, new String("df7afab62f8f4f1a80f43894716ad7f8".getBytes("UTF-8")));
System.out.println(text1);
// 解密内容
String text2 = RSACXUtil.decryptByPrivateKey(MY_PRIVATE_KEY_STRING, text1);
System.out.println(java.net.URLDecoder.decode(text2, "utf-8"));
}
}
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码