Java中KeyPairGenerator密钥大小计算及512字节密钥报错问题
为啥你的RSA密钥初始化会报"Invalid key sizes"?
嘿,我来帮你理清这个关键的概念混淆问题!
你提到的公式 最大字节数=密钥长度(比特)/8-11,这是PKCS1Padding模式下RSA加密能处理的最大明文字节数,可不是用来设置RSA密钥本身长度的呀!
你代码里的核心错误
你的代码 kpg.initialize(4096/8-11) 计算后得到的是 501——也就是说你试图生成一个501比特的RSA密钥,但RSA密钥长度有严格的规范:
- 必须是符合算法要求的整数,业界通用的合法取值是1024、2048、4096、8192比特(这些都是经过安全验证的标准长度,通常是2的幂)
- 501比特既不是标准长度,还远低于当前安全要求的最低标准(现在至少推荐2048比特起步),所以KeyPairGenerator直接抛出了
Invalid key sizes错误。
正确的做法
如果你想实现“能加密501字节明文”的需求,对应的RSA密钥长度应该是4096比特(因为4096/8 -11 = 501),所以初始化代码要写成这样:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // 直接传入密钥长度的比特数:4096 kpg.initialize(4096);
用这个代码生成的密钥,后续搭配RSA/ECB/PKCS1Padding模式时,就能正常处理最大501字节的明文了。
额外小提醒
你说用8192/8-11时正常?这大概率是你写错了——如果真传入1013比特,同样会报错。应该是你实际用的是8192作为初始化参数,才成功生成了8192比特的密钥,对应最大明文长度正好是1013字节~
内容的提问来源于stack exchange,提问作者Davood




