JavaCard中RSAPrivateKey.setModulus抛CryptoException.ILLEGAL_VALUE问题排查
问题分析与解决方案
1. 明确RSAPrivateKey.setModulus的长度单位
setModulus方法的第三个参数长度单位是字节——你传入512触发IndexOutOfBoundsException,正是因为数组仅64字节(对应512比特),按比特传参超出了数组范围,这直接验证了单位为字节的结论。
2. ILLEGAL_VALUE异常的核心原因
你将32字节模数前置补零到64字节的操作存在错误:
JavaCard的RSA密钥要求模数是无符号大整数,且最高有效位必须为1(即字节数组不能以连续0开头)。前置补零后,模数的实际有效长度仅为256比特,但你用KeyBuilder创建的是512比特的RSAPrivateKey,卡片会判定模数长度与密钥长度不匹配,从而抛出ILLEGAL_VALUE异常。
3. 正确的解决方案
根据你的需求,有两种可行方向:
- 方向一:适配512比特密钥
若必须使用512比特的RSAPrivateKey,需将原32字节模数放在字节数组的高字节位(数组前32位),在低字节位(数组末尾)补零至64字节。这样模数的最高有效位仍为原数的最高位(非零),实际有效长度为512比特,与密钥长度匹配。 - 方向二:使用匹配模数长度的密钥
直接创建与原模数长度一致的RSAPrivateKey:原模数为32字节(256比特),用KeyBuilder.LENGTH_RSA_256作为长度参数创建密钥,无需补零,直接传入原32字节模数,setModulus的长度参数设为32即可。
4. 额外注意事项
JCMathLib的MAX_EXP_LENGTH是针对特定密钥长度的配置,若调整密钥长度,需同步确认该配置是否适配,避免后续运算出现其他异常。
内容的提问来源于stack exchange,提问作者Tuija Palovuori
相关产品推荐
相关产品推荐

