使用Google Wycheproof测试向量调试RSA-OAEP解密报错问题
排查RSA-OAEP解密"Data must not be longer than 256 bytes"错误的步骤
1. 确认密文长度是否合规
2048位RSA的密文长度必须严格等于256字节(2048/8),这是RSA加密的基本规则。你需要:
- 检查从测试向量读取的十六进制密文转成字节数组后的长度,确保是256字节。如果长度不符,大概率是十六进制字符串处理出错(比如包含空格、换行符,或转码逻辑错误)。
- 注意Wycheproof测试向量包含无效测试案例(如密文长度错误、格式非法的案例),这类案例本身就会触发异常,先确认你测试的是标记为有效的案例。
2. 验证私钥加载正确性
私钥加载错误可能导致Java识别的密钥长度并非2048位,进而限制密文长度:
- 将加载后的私钥导出为字节数组再转十六进制,和测试向量里的PKCS8私钥对比,确认两者完全一致。
- 打印密钥模长验证:
如果输出不是256,说明私钥加载失败,检查十六进制转字节数组的代码(建议用可靠工具类,避免自行实现转码逻辑)。RSAPrivateKey rsaPriv = (RSAPrivateKey) privateKey; System.out.println("私钥模长(字节):" + rsaPriv.getModulus().bitLength() / 8);
3. 确保解密算法参数匹配
Wycheproof测试向量采用的是RSA-OAEP with SHA-256 and MGF1-SHA256,Java中RSA/ECB/OAEPWithSHA-256AndMGF1Padding的算法字符串是正确的,但可以显式指定参数避免环境默认值干扰:
OAEPParameterSpec oaepParams = new OAEPParameterSpec( "SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT); Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey, oaepParams);
4. 检查十六进制转字节数组的逻辑
错误的转码是常见诱因:
- 禁止用
String.getBytes()处理十六进制字符串,这会按字符集转码导致字节长度错误。 - 推荐使用成熟工具类:
// Apache Commons Codec byte[] cipherBytes = Hex.decodeHex(cipherHexString.toCharArray()); // Java 17+ 原生API byte[] cipherBytes = HexFormat.of().parseHex(cipherHexString);
内容的提问来源于stack exchange,提问作者Anand Barnwal
相关产品推荐
相关产品推荐

