【问题标题】:How to generate EC keypair with Bouncy Castle如何使用 Bouncy Castle 生成 EC 密钥对
【发布时间】:2018-02-20 04:53:55
【问题描述】:

我当前的项目使用 BouncyCastle 的 fips 资源仅用于加密/解密签名等。密钥仍然是使用通常的 C# 充气城堡生成的。现在,因为这是一种浪费,我想更改代码,但我找不到任何有关如何执行此操作的文档。

到目前为止我有什么:

ECDomainParameters s = new ECDomainParameters(...?)
        FipsEC.KeyPairGenerator ecGen = CryptoServicesRegistrar.CreateGenerator(new FipsEC.KeyGenerationParameters(s));

但是如何指定曲线的类型,G 和 n?

如果您能以某种方式提供帮助,请提前致谢。

【问题讨论】:

  • 我找到了FipsEC.DomainParams.B571,但不知道如何在这段代码中使用它

标签: c# bouncycastle encryption-asymmetric elliptic-curve fips


【解决方案1】:

我在 BouncyCastle 单元测试中找到了一些示例。尝试通过测试下载他们的代码:https://www.bouncycastle.org/csharp/download/bccrypto-csharp-1.8.1-src.zip 或在他们的网页上找到适当的源:https://www.bouncycastle.org/csharp/index.html

然后查找带有单元测试的类:ECTest

例如,他们有这样的代码:

/**
 * key generation test
 */
[Test]
public void TestECDsaKeyGenTest()
{
    SecureRandom random = new SecureRandom();

    BigInteger n = new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307");

    FpCurve curve = new FpCurve(
        new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q
        new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a
        new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16), // b
        n, BigInteger.One);

    ECDomainParameters parameters = new ECDomainParameters(
        curve,
        curve.DecodePoint(Hex.Decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G
        n);

    ECKeyPairGenerator pGen = new ECKeyPairGenerator();
    ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(
        parameters,
        random);

    pGen.Init(genParam);

    AsymmetricCipherKeyPair pair = pGen.GenerateKeyPair();

    ParametersWithRandom param = new ParametersWithRandom(pair.Private, random);

    ECDsaSigner ecdsa = new ECDsaSigner();

    ecdsa.Init(true, param);

    byte[] message = new BigInteger("968236873715988614170569073515315707566766479517").ToByteArray();
    BigInteger[] sig = ecdsa.GenerateSignature(message);

    ecdsa.Init(false, pair.Public);

    if (!ecdsa.VerifySignature(message, sig[0], sig[1]))
    {
        Fail("signature fails");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多