JAVA生成RSA密钥及密钥长度问题

一、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生成时指定的长度,指的是模数位数,而不是密钥显示出来的字节或字符长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣广泛的程序猿

有钱的捧个钱场,谢谢各位!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值