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

使用Bouncy Castle重构SPHINCS+公钥时参数不匹配异常原因咨询

SPHINCS+公钥重构抛出IllegalArgumentException的原因及解决方法

问题描述

生成SPHINCS+密钥对后,将公钥编码并尝试重构公钥时,抛出IllegalArgumentException,提示“public key encoding does not match parameters”。

代码示例

package cdss;

import java.io.IOException;
import java.security.SecureRandom;
import org.bouncycastle.pqc.crypto.sphincsplus.SPHINCSPlusKeyGenerationParameters;
import org.bouncycastle.pqc.crypto.sphincsplus.SPHINCSPlusKeyPairGenerator;
import org.bouncycastle.pqc.crypto.sphincsplus.SPHINCSPlusParameters;
import org.bouncycastle.pqc.crypto.sphincsplus.SPHINCSPlusPublicKeyParameters;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;

public class Sphincs3 {

    public static void main(String[] args) throws IOException {
        // Generate a SPHINCS+ key pair
        
        SPHINCSPlusKeyPairGenerator keyGen = new SPHINCSPlusKeyPairGenerator();
        SecureRandom random = new SecureRandom();
        SPHINCSPlusKeyGenerationParameters params = new SPHINCSPlusKeyGenerationParameters(random,
                SPHINCSPlusParameters.sha2_128s_simple);
        keyGen.init(params);
        AsymmetricCipherKeyPair pair = keyGen.generateKeyPair();
        SPHINCSPlusPublicKeyParameters publicKeyParams = (SPHINCSPlusPublicKeyParameters) pair.getPublic();
        
        byte[] publicKeyBytes = publicKeyParams.getEncoded();

        SPHINCSPlusPublicKeyParameters pasd = new SPHINCSPlusPublicKeyParameters(SPHINCSPlusParameters.sha2_128s_simple, 
                publicKeyBytes);

    }
}

异常信息

Exception in thread "main" java.lang.IllegalArgumentException: public key encoding does not match parameters
at org.bouncycastle.pqc.crypto.sphincsplus.SPHINCSPlusPublicKeyParameters.(SPHINCSPlusPublicKeyParameters.java:17)
at cdss.Sphincs3.main(Sphincs3.java:26)

原因分析

BouncyCastle中SPHINCSPlusPublicKeyParameters.getEncoded()返回的字节数组已经包含了SPHINCS+的参数标识信息。手动指定参数重构公钥时,构造方法会对比传入的参数与编码字节中解析出的参数,两者验证不匹配就会触发该异常。

解决方法

重构公钥时,使用仅接收编码字节数组的构造方法,让构造方法自动从编码中解析参数:

修改后的关键代码:

byte[] publicKeyBytes = publicKeyParams.getEncoded();

// 去掉手动指定的参数,直接传入编码字节数组
SPHINCSPlusPublicKeyParameters pasd = new SPHINCSPlusPublicKeyParameters(publicKeyBytes);

构造方法会自动解析编码中的参数信息,避免参数不匹配的冲突。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:14:56