You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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私钥对比,确认两者完全一致。
  • 打印密钥模长验证:
    RSAPrivateKey rsaPriv = (RSAPrivateKey) privateKey;
    System.out.println("私钥模长(字节):" + rsaPriv.getModulus().bitLength() / 8);
    
    如果输出不是256,说明私钥加载失败,检查十六进制转字节数组的代码(建议用可靠工具类,避免自行实现转码逻辑)。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:28:08