ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java RSA非对称加密工具类(就这一篇就够了)

2022-06-19 00:31:23  阅读:331  来源: 互联网

标签:return String RSA 就够 Java static import public


RSA作为HTTPS协议中最为核心的加密/解密算法,其原理却很简单,很容易理解。RSA的密钥越长,就越难破解。目前被破解的最长RSA密钥是768位二进制。也就是说,长度超过768位的密钥,还无法破解(至少没有人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥及其安全。

package org.collect.test.rsa;

import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import java.io.IOException;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RSAUtil {

/**
* 获取RSA公私钥匙对
*/
private static KeyPair getKeyPair() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); //512、1024、2048
KeyPair keyPair = keyPairGenerator.generateKeyPair();
return keyPair;
}


/**
* 获取公钥(base64编码)
*/
private static String getPublicKey(KeyPair keyPair) {
PublicKey publicKey = keyPair.getPublic();
byte[] bytes = publicKey.getEncoded();
return Base64Tool.byteToBase64(bytes);
}


/**
* 获取私钥(Base64编码)
*/
private static String getPrivateKey(KeyPair keyPair) {
PrivateKey privateKey = keyPair.getPrivate();
byte[] bytes = privateKey.getEncoded();
return Base64Tool.byteToBase64(bytes);
}


public static String[] genKeyPair() throws Exception {
KeyPair keyPair = getKeyPair();
String[] keyPairArr = new String[2];
keyPairArr[0] = getPublicKey(keyPair);
keyPairArr[1] = getPrivateKey(keyPair);
return keyPairArr;
}


/**
* 将Base64编码后的公钥转换成PublicKey对象
*/
public static PublicKey string2PublicKey(String pubStr) throws Exception {
byte[] keyBytes = Base64Tool.base64ToByte(pubStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}

/**
* 将Base64编码后的私钥转换成PrivateKey对象
*/
public static PrivateKey string2PrivateKey(String priStr) throws Exception {
byte[] keyBytes = Base64Tool.base64ToByte(priStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}

/**
* 公钥加密
*/
public static String publicEncrypt(String content, String publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, RSAUtil.string2PublicKey(publicKey));
byte[] byteEncrypt = cipher.doFinal(content.getBytes("utf-8"));
String msg = Base64Tool.byteToBase64(byteEncrypt);
return msg;
}

/**
* 私钥解密
*/
public static String privateDecrypt(String contentBase64, String privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, RSAUtil.string2PrivateKey(privateKey));
byte[] bytesDecrypt = cipher.doFinal(Base64Tool.base64ToByte(contentBase64));
String msg = new String(bytesDecrypt, "utf-8");
return msg;
}


}
package org.collect.test.rsa;

import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.IOException;

public class Base64Tool {

/**
* 字节数组转Base64编码
*/
public static String byteToBase64(byte[] bytes) {
BASE64Encoder encoder = new BASE64Encoder();
// return encoder.encode(bytes);
return new String(Base64.encodeBase64(bytes));
}


/**
* Base64编码转字节数组
*/
public static byte[] base64ToByte(String base64Key) throws IOException {
BASE64Decoder base64Decoder = new BASE64Decoder();
// return base64Decoder.decodeBuffer(base64Key);
return Base64.decodeBase64(base64Key);
}



}
package org.collect.test.rsa;


public class TestRSA {



public static void main(String args[]) throws Exception {
String[] keyPairArr = RSAUtil.genKeyPair();
System.out.println("公钥: " + keyPairArr[0]);
System.out.println();

//
System.out.println("私钥: " + keyPairArr[1]);
System.out.println();

//
String string = "勇敢行sfsdf3择发生的方式5345353@#¥%……&*():“《》?@#$%^&()<>?:";

String msg = RSAUtil.publicEncrypt(string, keyPairArr[0]);
System.out.println("加密后内容: " + msg);
System.out.println();

//
String mms = RSAUtil.privateDecrypt(msg, keyPairArr[1]);
System.out.println("解密后内容: " + mms);
System.out.println();
}


}
————————————————
版权声明:本文为CSDN博主「火创始人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/QQ1375235976/article/details/119206439

标签:return,String,RSA,就够,Java,static,import,public
来源: https://www.cnblogs.com/javalinux/p/16389724.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有