【问题标题】:Is there already an XMSS/XMSS^MT Provider for Java JCA (Java Cryptography Architecture)?是否已经有用于 Java JCA(Java 密码体系结构)的 XMSS/XMSS^MT 提供程序?
【发布时间】:2018-11-22 14:48:33
【问题描述】:

我想知道 Java 密码体系结构 (JCA) 中是否已经有用于后量子签名方案的提供程序,尤其是 XMSS^MT?

【问题讨论】:

  • thisthisthis等。接下来您可能会寻找第三方提供商。
  • 这个,这个,这个
  • 抱歉,可能是第三方提供商。检查 Bouncycastle,我记得有一所德国大学有一个后量子供应商.​​.....我会看看我能找到什么。
  • 德国人想到的是 flexiprovider,但我没有看到任何 XMSS 支持的证据。另一方面,Bouncycastle 支持 XMSS,因此您应该尝试一下。
  • 非常感谢!我找到了 BouncyCastlePQCProvider 虽然我似乎无法在 JCA 中正确实现它,您对此有经验吗?

标签: java cryptography post-quantum-cryptography


【解决方案1】:

这是一个从org.bouncycastle.pqc.jcajce.provider.test.XMSSMTTest 中的 Bouncycastle 源代码中逐字逐句摘录的示例。此代码在 Java 8 上运行。

import org.bouncycastle.pqc.jcajce.interfaces.StateAwareSignature;
import org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider;
import org.bouncycastle.pqc.jcajce.spec.XMSSMTParameterSpec;
import org.bouncycastle.util.Strings;

import java.security.*;

public class Main {

    private static void fail(boolean condition, String msg) {
        if (condition) {
            throw new RuntimeException(msg);
        }
    }

    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastlePQCProvider());
        byte[] msg = Strings.toByteArray("Cthulhu Fthagn --What a wonderful phrase!Cthulhu Fthagn --Say it and you're crazed!");
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("XMSSMT", "BCPQC");

        kpg.initialize(new XMSSMTParameterSpec(20, 10, XMSSMTParameterSpec.SHA256), new SecureRandom());

        KeyPair kp = kpg.generateKeyPair();

        Signature sig = Signature.getInstance("SHA256withXMSSMT", "BCPQC");

        fail(!(sig instanceof StateAwareSignature), "wrong signature instance");

        StateAwareSignature xmssSig = (StateAwareSignature) sig;

        xmssSig.initSign(kp.getPrivate());

        fail(!xmssSig.isSigningCapable(), "signature object is not signing-capable");

        xmssSig.update(msg, 0, msg.length);

        byte[] s = sig.sign();

        PrivateKey nKey = xmssSig.getUpdatedPrivateKey();

        fail(kp.getPrivate().equals(nKey), "");
        fail(xmssSig.isSigningCapable(), "signature object is signing-capable");

        xmssSig.update(msg, 0, msg.length);

        try {
            sig.sign();
            fail(true, "no exception after key extraction");
        } catch (SignatureException e) {
            fail(!"signing key no longer usable".equals(e.getMessage()), "wrong exception");
        }

        try {
            xmssSig.getUpdatedPrivateKey();
            fail(true, "no exception after key extraction");
        } catch (IllegalStateException e) {
            fail(!"signature object not in a signing state".equals(e.getMessage()), "wrong exception");
        }

        xmssSig.initSign(nKey);

        xmssSig.update(msg, 0, msg.length);

        s = sig.sign();

        xmssSig.initVerify(kp.getPublic());

        xmssSig.update(msg, 0, msg.length);

        fail(!xmssSig.verify(s), "verification failure");
    }
}

该文件中还有其他示例。源代码在here.

【讨论】:

  • 非常感谢詹姆斯,当我尝试像第 8 步中描述的 here 那样将 BouncyCastlePQCProvider 实施到 JCA 时,它没有被识别。 keytool -genkeypair -alias <alias> -keyalg xmss 提示:no such algorithm exeption 这意味着 BCProvider 没有被识别(因为它显然确实为 keygen 提供了 xmss alg)。由于您已经帮了我很多,您是否也对此有想法? ^^
  • @NicolasBrauer: 是在您的 JRE/lib/security/java.security 或 j9+ JRE/conf/security/java.security 中配置的提供程序,并且是可找到的 jar(通过 j8 JRE/lib/ext很好)? (如果第一部分为真,您的代码将不需要 Security.addProvider 调用。记住 BouncyCastlePQCProvider 和 BouncyCastleProvider 是不同的。)
  • 这些说明用于构建和签署您自己的提供商。不理会这些 java.security 文件。 Bouncycastle 已经正确签署了他们的提供者 jar,只需将 bcprov-jdk15on-160.jar 文件放在您的类路径中,然后像示例中一样添加提供者。
  • @dave_thompson_085 谢谢,但从 java9 开始(甚至 8 我不知道)extensions mechanism are no longer supported; Use -classpath instead.@JamesKPolk 非常感谢,这有很大帮助,尽管我无法像在该示例因为我不打算使用它来编写 java 代码,而只是通过命令行界面使用 jarsigner。那么我将如何静态添加它? (如示例用于动态添加)
  • 在检查时,keytool 和 jarsigner 不使用正常的类路径,因此您还需要-providerpath jarfile 来查找提供程序。但是,keytool 似乎只使用了 init(int) 重载,而 XMSSKeyPairGeneratorSpi 拒绝了它;它需要 AlgorithmParameterSpec 特别是 XMSSParameterSpec,或者根本不需要初始化——如果我尝试后者,它确实会生成一个密钥对,但生成的密钥无法编码,因此无法存储。呸。我认为您必须对一代进行编码。我还没有看签名面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2011-01-12
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多