一、RSA密钥生成
// 创建KeyPairGenerator对象,指定算法为RSA
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 初始化KeyPairGenerator,指定密钥长度
keyPairGenerator.initialize(2048); // 2048位,也可以是1024位
// 生成密钥对
KeyPair keyPair = keyPairGenerator.genKeyPair(); // 和generateKeyPair()一样
// 获取公钥
PublicKey publicKey = keyPair.getPublic();
// 获取私钥,直接强转为RSAPrivateKey
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 打印公钥
System.out.println("公钥Base64字符串:" + Base64.encodeBase64String(publicKey.getEncoded()));
// 打印私钥
System.out.println("私钥Base64字符串:" + Base64.encodeBase64String(privateKey.getEncoded()));
公钥Base64字符串:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvsRd6KXbFcBpH0wE2qdkiCsgsi5HEXS2CtV+4bRJb/8+krE+49Bks[省略中间一些字符]q0SspMIaGLKF6KGj3+qykfEpjWUDNqFccOiCXzM88FAmFFzOBErkOToMYCSHsAlZz+pvgQ/uDIGq+c/PGNbmlJpxZzeTyQ0ZNU+BuEzYXQfsTpzg0uLLIm95R+PKKwIDAQAB
私钥Base64字符串:MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+xF3opdsVwGkfTATap2SIKyCyLkcRdLYK1X7htElv/z6SsT7j0GSzUZGMlhOZpqqh9+cArRTvorWa+HIoMraa8cEp8dQvEEe7U+/B1G1J97cs[省略中间一些字符]Tfy8soy3NgCSe100iuYWP+Tkjzl5lQuLwHq09Tjte8Ol26pqDNgAalL3elsCnRrphFKnuqj1u20FH8mjblrJvkQMGZJNUU5RhI4hul6klECdJBFZLTXMsiR9AIskUm1P0zm4VO1veupqvnT5XwK1Nxpfw=
二、RSA密钥长度
// 创建KeyPairGenerator对象,指定算法为RSA
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 初始化KeyPairGenerator,指定密钥长度
keyPairGenerator.initialize(2048); // 2048位,也可以是1024位
// 生成密钥对
KeyPair keyPair = keyPairGenerator.genKeyPair(); // 和generateKeyPair()一样
// 获取公钥
PublicKey publicKey = keyPair.getPublic();
// 打印公钥信息
System.out.println("公钥字节长度: " + publicKey.getEncoded().length+"字节");
System.out.println("公钥字节位数: " + publicKey.getEncoded().length * 8 + "位");
System.out.println("公钥Base64字符串:" + Base64.encodeBase64String(publicKey.getEncoded()));
System.out.println("公钥Base64字符串长度:" + Base64.encodeBase64String(publicKey.getEncoded()).length()+"字符");
// 强转成子类对象RSAPublicKey
RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
System.out.println("公钥模数位数:"+rsaPublicKey.getModulus().bitLength()+"位");
System.out.println("公钥指数位数:"+rsaPublicKey.getPublicExponent().bitLength()+"位");
// 获取私钥,直接强转为RSAPrivateKey
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 打印私钥信息
System.out.println("私钥字节长度:" +privateKey.getEncoded().length+"字节");
System.out.println("私钥字节位数: " + privateKey.getEncoded().length * 8 + "位");
System.out.println("私钥Base64字符串:" + Base64.encodeBase64String(privateKey.getEncoded()));
System.out.println("私钥Base64字符串长度:" + Base64.encodeBase64String(privateKey.getEncoded()).length()+"字符");
System.out.println("私钥模数位数:"+privateKey.getModulus().bitLength()+"位");
System.out.println("私钥指数位数:"+privateKey.getPrivateExponent().bitLength()+"位");
输出结果如下:
公钥字节长度: 294字节
公钥字节位数: 2352位
公钥Base64字符串:MIIBIjANBgkqhkiG9w0BAQEFAAOC......plmeL68OXSSFHt0RGXQIDAQAB
公钥Base64字符串长度:392字符
公钥模数位数:2048位
公钥指数位数:17位
私钥字节长度:1218字节
私钥字节位数: 9744位
私钥Base64字符串:MIIEvgIBADANBgkqhkiG9w0BAQE......G1I9XtVxKWHyWpiCg5j4l
私钥Base64字符串长度:1624字符
私钥模数位数:2048位
私钥指数位数:2046位
结论:所以RSA生成时指定的长度,指的是模数位数,而不是密钥显示出来的字节或字符长度。