【问题标题】:BouncyCastle ECDSA certificates include Order, Generator (Uncompressed), Cofactor, and Seed x509 fields?BouncyCastle ECDSA 证书包括 Order、Generator(未压缩)、Cofactor 和 Seed x509 字段?
【发布时间】:2020-12-17 21:15:01
【问题描述】:

当编写为 PEM 文件时,Org.BouncyCastle.X509.X509Certificate.GetEncoded() 中包含哪些字段(订单、生成器、辅因子等)?他们似乎是畸形的?输出的证书和私钥 PEM 文件匹配。

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number:
        be:d0:a2:d6:d8:08:6b:16:99:02:fa:fd:ed:21:1d
    Signature Algorithm: ecdsa-with-SHA256
    Issuer: CN=TestCertificate
    Validity
        Not Before: Dec 17 19:39:54 2019 GMT
        Not After : Dec 17 19:39:54 2030 GMT
    Subject: CN=TestCertificate
    Subject Public Key Info:
        Public Key Algorithm: id-ecPublicKey
            Public-Key: (256 bit)
            pub:
                04:19:1c:31:a8:b9:d9:9f:05:6e:d4:85:25:53:c0:
                ca:a9:44:05:f6:13:ee:6e:eb:86:f5:44:b6:90:96:
                de:02:d0:41:fc:80:c5:26:23:d7:e9:4c:d3:cd:aa:
                57:80:c6:69:8d:5f:e8:ae:39:12:53:e1:1d:b3:fb:
                98:89:2e:8c:f6
            Field Type: prime-field
            Prime:
                00:ff:ff:ff:ff:00:00:00:01:00:00:00:00:00:00:
                00:00:00:00:00:00:ff:ff:ff:ff:ff:ff:ff:ff:ff:
                ff:ff:ff
            A:   
                00:ff:ff:ff:ff:00:00:00:01:00:00:00:00:00:00:
                00:00:00:00:00:00:ff:ff:ff:ff:ff:ff:ff:ff:ff:
                ff:ff:fc
            B:   
                5a:c6:35:d8:aa:3a:93:e7:b3:eb:bd:55:76:98:86:
                bc:65:1d:06:b0:cc:53:b0:f6:3b:ce:3c:3e:27:d2:
                60:4b
            Generator (uncompressed):
                04:6b:17:d1:f2:e1:2c:42:47:f8:bc:e6:e5:63:a4:
                40:f2:77:03:7d:81:2d:eb:33:a0:f4:a1:39:45:d8:
                98:c2:96:4f:e3:42:e2:fe:1a:7f:9b:8e:e7:eb:4a:
                7c:0f:9e:16:2b:ce:33:57:6b:31:5e:ce:cb:b6:40:
                68:37:bf:51:f5
            Order: 
                00:ff:ff:ff:ff:00:00:00:00:ff:ff:ff:ff:ff:ff:
                ff:ff:bc:e6:fa:ad:a7:17:9e:84:f3:b9:ca:c2:fc:
                63:25:51
            Cofactor:  1 (0x1)
    X509v3 extensions:
        X509v3 Certificate Policies: critical
            Policy: 1.3.5.1.4.1.41779.1.1

        X509v3 Key Usage: critical
            Digital Signature
Signature Algorithm: ecdsa-with-SHA256
     30:45:02:20:7f:6d:1c:25:ec:26:73:d9:07:ae:87:37:5a:02:
     db:00:aa:6f:a8:ec:db:a4:44:73:7a:3b:ba:05:ee:09:f1:5c:
     02:21:00:ed:c8:57:cb:07:a0:54:2c:84:90:f3:59:be:3d:ec:
     2c:63:fd:be:f9:92:3d:9a:15:0a:e1:87:97:9a:7a:73:d5

这是生成密钥的代码:

     var keys = GenerateEcKeyPair("secp256r1");
        AsymmetricKeyParameter privateKey = keys.Private;

        var signatureFactory = new Asn1SignatureFactory(
            X9ObjectIdentifiers.ECDsaWithSha256.ToString(),
            privateKey);

...关键方法

        static AsymmetricCipherKeyPair GenerateEcKeyPair(string curve = "secp256r1")
    {
        
        var prime256v1OID = SecObjectIdentifiers.SecP256r1;
        X9ECParameters ecParam = SecNamedCurves.GetByOid(prime256v1OID);

        //ECDomainParameters ecDomain = new ECDomainParameters(ecParam.Curve, ecParam.G, ecParam.N);
        ECDomainParameters ecDomain= new ECDomainParameters(ecParam.Curve, ecParam.G, ecParam.N, ecParam.H, ecParam.GetSeed());
        ECKeyGenerationParameters keygenParam = new ECKeyGenerationParameters(ecDomain, _SecureRandom);

        ECKeyPairGenerator keyGenerator = new ECKeyPairGenerator("ECDSA");
        keyGenerator.Init(keygenParam);

        var keyPair = keyGenerator.GenerateKeyPair();

        var privateKey = keyPair.Private as ECPrivateKeyParameters;
        var publicKey = keyPair.Public as ECPublicKeyParameters;

        Console.WriteLine($"Private key: {BitConverter.ToString(privateKey.D.ToByteArrayUnsigned()).Replace(" - ", "")}");
        Console.WriteLine($"Public key: {BitConverter.ToString(publicKey.Q.GetEncoded()).Replace(" - ", "")}");

        return keyPair;
    }

^不确定ECDomainParameters ecDomain= ... 使用哪个构造函数?

...然后是证书:

Org.BouncyCastle.X509.X509Certificate newCert = gen.Generate(signatureFactory);

我如何获得如下输出:

Subject Public Key Info:
        Public Key Algorithm: id-ecPublicKey
            Public-Key: (256 bit)
            pub:
                04:64:d5:81:e2:60:68:b7:64:58:ba:87:8c:ec:0b:
                3d:8c:3c:d0:e3:0f:27:72:18:e1:69:bc:6a:27:c6:
                14:ec:86:93:3c:ed:6d:b0:4d:f9:da:38:f1:7c:e0:
                79:60:13:ec:ec:d0:84:7b:47:52:39:45:7a:65:25:
                98:ea:64:90:ff
            ASN1 OID: prime256v1
            NIST CURVE: P-256
    X509v3 extensions:

没有任何“额外”内容(生成器、素数 a、b 等),并且包含以下字段:

ASN1 OID: prime256v1
NIST CURVE: P-256

【问题讨论】:

    标签: .net-core x509certificate bouncycastle


    【解决方案1】:

    原来我不知道自己在做什么(如果这不明显的话)... 可以像这样简单地为ECKeyPairGenerator 创建ECKeyGenerationParameters 实例(不确定是否正确,但它可以工作并且我的要求不需要超级安全):

    static AsymmetricCipherKeyPair GenerateEcKeyPair(string curve = "secp256r1")
        {
    
            DerObjectIdentifier ecParam = SecObjectIdentifiers.SecP256r1;
            ECKeyPairGenerator keyGenerator = new ECKeyPairGenerator();
            keyGenerator.Init(new ECKeyGenerationParameters(ecParam, new
            SecureRandom()));
    
            var keyPair = keyGenerator.GenerateKeyPair();
    
            var privateKey = keyPair.Private as ECPrivateKeyParameters;
            var publicKey = keyPair.Public as ECPublicKeyParameters;
    
            Console.WriteLine($"Private key: {BitConverter.ToString(privateKey.D.ToByteArrayUnsigned()).Replace(" - ", "")}");
            Console.WriteLine($"Public key: {BitConverter.ToString(publicKey.Q.GetEncoded()).Replace(" - ", "")}");
    
            return keyPair;
        }
    

    x509 输出:

     Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:33:d4:49:7f:e2:b1:4f:65:8f:dd:70:dc:4d:55:
                    36:d7:ea:55:78:61:39:8e:88:93:70:b6:bd:2b:2d:
                    38:62:bd:8a:83:f1:c4:9e:c8:6c:83:48:09:c7:a3:
                    8c:fa:52:d5:d1:46:7f:db:58:11:f8:b0:88:51:50:
                    61:d0:32:91:5e
                ASN1 OID: prime256v1
                NIST CURVE: P-256
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-16
      • 2023-04-02
      • 2014-02-16
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多