import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RsaUtils {
private static final int DEFAULT_KEY_SIZE = 2048;
private static final String ALGORITHM_RSA = "RSA";
/**
* 从文件中读取公钥
*
* @param fileName 公钥保存路径,相对于classpath
* @return 公钥对象
* @throws Exception
*/
public static PublicKey getPublicKey(String fileName) throws Exception {
byte[] bytes = readFile(fileName);
return getPublicKey(bytes);
}
/**
* 从文件中读取密钥
*
* @param fileName 私钥保存路径,相对于classpath
* @return 私钥对象
* @throws Exception
*/
public static PrivateKey getPrivateKey(String fileName) throws Exception {
byte[] bytes = readFile(fileName);
return getPrivateKey(bytes);
}
/**
* 获取公钥
*
* @param bytes 公钥的字节数组
* @return
* @throws Exception
*/
private static PublicKey getPublicKey(byte[] bytes) throws Exception {
bytes = Base64.getDecoder().decode(bytes);
X509EncodedKeySpec spec = new X509EncodedKeySpec(bytes);
KeyFactory factory = KeyFactory.getInstance(ALGORITHM_RSA);
return factory.generatePublic(spec);
}
/**
* 获取密钥
*
* @param bytes 私钥的字节数组
* @return
* @throws Exception
*/
private static PrivateKey getPrivateKey(byte[] bytes) throws NoSuchAlgorithmException, InvalidKeySpecException {
bytes = Base64.getDecoder().decode(bytes);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(bytes);
KeyFactory factory = KeyFactory.getInstance(ALGORITHM_RSA);
return factory.generatePrivate(spec);
}
/**
* 根据密文,生成rsa公钥和私钥,并写入文件
*
* @param publicKeyFileName 公钥文件路径
* @param privateKeyFileName 私钥文件路径
* @param secret 生成密钥的密文
*/
public static void generateKey(String publicKeyFileName, String privateKeyFileName, String secret, int keySize) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_RSA);
SecureRandom secureRandom = new SecureRandom(secret.getBytes());
keyPairGenerator.initialize(Math.max(keySize, DEFAULT_KEY_SIZE), secureRandom);
KeyPair keyPair = keyPairGenerator.genKeyPair();
// 获取公钥并写文件
byte[] publicKeyBytes = keyPair.getPublic().getEncoded();
publicKeyBytes = Base64.getEncoder().encode(publicKeyBytes);
writeFile(publicKeyFileName, publicKeyBytes);
// 获取私钥并写文件
byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();
privateKeyBytes = Base64.getEncoder().encode(privateKeyBytes);
writeFile(privateKeyFileName, privateKeyBytes);
}
private static byte[] readFile(String fileName) throws Exception {
return Files.readAllBytes(new File(fileName).toPath());
}
private static void writeFile(String destPath, byte[] bytes) throws IOException {
File dest = new File(destPath);
if (!dest.exists()) {
dest.createNewFile();
}
Files.write(dest.toPath(), bytes);
}
public static void main(String[] args) throws Exception {
String privateKeyFile = "D:\\var\\temp\\id_key_rsa";
String publicKeyFile = "D:\\var\\temp\\id_key_rsa.pub";
RsaUtils.generateKey(publicKeyFile, privateKeyFile, "test123", 2048);
}
}
RSA公私钥生成工具类
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- RSA前端生成公私钥对、私钥签名、公钥验签,前端打杂多年,第一次需要搞到这个鬼东西,一开始我内心有一百个拒绝拒绝拒...
- 将公司的所有服务器设置为密钥登录 1:首先生成所有服务器的公私钥 2:COPY 公钥到对于服务器 3:登录服务器设...
- 先简单介绍一下RSA。 加密、解密:使用公钥对数据进行加密,通过私钥对加密后的数据解密。 加签、解签:使用私钥对数...
- 生成私钥 *.pem文件放在当前文件夹下 ![_GS7UPKMJ25D9XF_O]J)RLS.png](http...