Rsa 工具类,公钥私钥生成,加解密
包含分段加密和分段解密工具类:
/**
* Rsa 工具类,公钥私钥生成,加解密
*
* @author : YZD
* @date : 2020-12-9 22:59
*/
public class MyRsaUtils {
/**
* 测试加密内容
*/
public static final String SRC = "测试加密内容";
/**
* 公钥
*/
public static final String PUBLICKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCuF6cl/Il6Npp7KxcaQyfepfnOs14Rs4klLrKKu0CJhsTv+VuYFOH37YV9eoKzG10xX99Zn/TIRIndDUNlOB6HbbMH046r4Ip7/XEr0XWfO+jAk8fQ9BTnLFBy3DtOqndpluqmzXuXVLpxd5lhu9zJgzGY2Ts016iY6p6Gda2OQIDAQAB";
/**
* 私钥
*/
public static final String PRIVATEKEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIK4XpyX8iXo2mnsrFxpDJ96l+c6zXhGziSUusoq7QImGxO/5W5gU4ffthX16grMbXTFf31mf9MhEid0NQ2U4HodtswfTjqvginv9cSvRdZ876MCTx9D0FOcsUHLcO06qd2mW6qbNe5dUunF3mWG73MmDMZjZOzTXqJjqnoZ1rY5AgMBAAECgYAkFJGAtWvPzOKkRAAbDZ+/UQ4mc5OM9DYn4Klh7dE3O59Tpy7DdXD42uWeUB8GVgCML4sN6MG1W7ZwD2IpWoNOq4w8xah6y7B2YhyPXEqSJsIpWiZNlEWiwZbGoqBFN1261Pyy5dhfaspFKbH+qbEanx+ezv7UvzFwg5uUzS2lgQJBANENPTJa4QoMpj/GBBtl2tD7yFLtbMvykgk/7pF6FyF3RDNr+QQD/Ay/H74IVRCow0oWn1b05BXzGiiaWQZGhjECQQCgE7W0SAuCZngz374wIYBxg3SdW0aetgtnsMfV0wFL1czh2qakqgnuu6u+y1FTgeGhJDDVTjpiutTSbyCgf8aJAkBbbHPH8tCZ6YBHQZ0IMloorQQlqCm9Y58UJn555q/49cTAzEaByBBRrr/+BnzVJUkKvKwAhma9ZqyY9y9ZvDvxAkBhdb6SRa7kNLkIdDfaG/uUoQF18KWdaZ6mAeaZE7/dSQ1VkQcWiARGGnLlVeps2k3iCyPEKr23cKK0gD4wGbtpAkBtzQ7qjrfOm0zLRUJOt7D0EcDIR9IaRtk3n4XSoJ94rJDHv/Toe7pwMfWsPFdnLesx5iZ6J5I8U196qjvY13t5";
/**
* 算法
*/
public static final String ALGORITHM = "RSA";
/**
* 一次解密的长度
*/
private static final int MAX_DECRYPT_BLOCK = 128;
/**
* 一次加密的长度
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
public static void main(String[] args) throws Exception {
System.out.println("\n");
// 分段加密 解密
String byPublicKeySplit1 = encryptByPrivateKeySplit(MyRsaUtils.PRIVATEKEY, " ");
String byPublicKeySplit2 = decryptByPublicKeySplit(MyRsaUtils.PUBLICKEY, byPublicKeySplit1);
System.out.println("\n");
RsaKeyPair keyPair = generateKeyPair();
System.out.println("公钥:" + keyPair.getPublicKey());
System.out.println("私钥:" + keyPair.getPrivateKey());
System.out.println("\n");
test1(keyPair);
System.out.println("\n");
test2(keyPair);
System.out.println("\n");
}
/**
* 公钥加密 私钥解密
*/
private static void test1(RsaKeyPair keyPair) throws Exception {
System.out.println("***************** 公钥加密私钥解密开始 *****************");
String text1 = encryptByPublicKey(keyPair.getPublicKey(), MyRsaUtils.SRC);
String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1);
System.out.println("加密前:" + MyRsaUtils.SRC);
System.out.println("加密后:" + text1);
System.out.println("解密后:" + text2);
if (MyRsaUtils.SRC.equals(text2)) {
System.out.println("解密字符串和原始字符串一致,解密成功");
} else {
System.out.println("解密字符串和原始字符串不一致,解密失败");
}
System.out.println("***************** 公钥加密私钥解密结束 *****************");
}
/**
* 私钥加密 公钥解密
*
* @throws Exception /
*/
private static void test2(RsaKeyPair keyPair) throws Exception {
System.out.println("***************** 私钥加密公钥解密开始 *****************");
String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), MyRsaUtils.SRC);
String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1);
System.out.println("加密前:" + MyRsaUtils.SRC);
System.out.println("加密后:" + text1);
System.out.println("解密后:" + text2);
if (MyRsaUtils.SRC.equals(text2)) {
System.out.println("解密字符串和原始字符串一致,解密成功");
} else {
System.out.println("解密字符串和原始字符串不一致,解密失败");
}
System.out.println("***************** 私钥加密公钥解密结束 *****************");
}
/**
* 公钥解密
*
* @param publicKeyText 公钥
* @param text 待解密的信息
* @return /
* @throws Exception /
*/
public static String decryptByPublicKey(String publicKeyText, String text) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
/**
* 分段 公钥解密
*
* @param publicKeyText 公钥
* @param data 待解密的信息
* @return /
* @throws Exception /
*/
public static String decryptByPublicKeySplit(String publicKeyText, String data) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decodeBase64 = Base64.decodeBase64(data);
//得到报文密文的长度
int inputLen = decodeBase64.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(decodeBase64, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(decodeBase64, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
//解密后的数据
byte[] byteArray = out.toByteArray();
out.close();
return new String(byteArray);
}
/**
* 私钥加密
*
* @param privateKeyText 私钥
* @param text 待加密的信息
* @return /
* @throws Exception /
*/
public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
/**
* 分段 私钥 加密
*
* @param privateKeyText 私钥
* @param data 待加密的信息
* @return /
* @throws Exception /
*/
public static String encryptByPrivateKeySplit(String privateKeyText, String data) throws Exception {
// 加密时超过117字节就报错。为此采用分段加密的办法来加密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedData = data.getBytes();
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密 doFinal
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] byteArray = out.toByteArray();
out.close();
return Base64.encodeBase64String(byteArray);
}
/**
* 私钥解密
*
* @param privateKeyText 私钥
* @param text 待解密的文本
* @return /
* @throws Exception /
*/
public static String decryptByPrivateKey(String privateKeyText, String text) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
/**
* 公钥加密
*
* @param publicKeyText 公钥
* @param text 待加密的文本
* @return /
*/
public static String encryptByPublicKey(String publicKeyText, String text) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
/**
* 构建RSA密钥对
*
* @return /
* @throws NoSuchAlgorithmException /
*/
public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
return new RsaKeyPair(publicKeyString, privateKeyString);
}
/**
* RSA密钥对对象
*/
public static class RsaKeyPair {
private final String publicKey;
private final String privateKey;
public RsaKeyPair(String publicKey, String privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
}
public String getPublicKey() {
return publicKey;
}
public String getPrivateKey() {
return privateKey;
}
}
}
还没有评论,来说两句吧...