Какой сертификат ECC будет работать со следующим кодом PKCS7/CMS?

Мы используем стандарт формата данных PKCS#7/CMS для шифрования/дешифрования/подписания/проверки конфиденциальных полезных данных. В настоящее время мы используем 2048- и 4096-битные сертификаты RSA (и ключи) для наших PKCS7/CMS и все в порядке (см. рабочий код RSA ниже).

Мы хотим добавить поддержку ECC (в частности, кривой secp521), но .NET 4.5 имеет неравномерную поддержку ECC, несмотря на то, что он Единственный PKI-алгоритм NSA Suite B (хотя и с 256 и 384 простыми модулями).

Вопрос

Какие сертификаты EC + ключи, совместимые с .NET 4.5 и приведенным ниже кодом (возможно, с некоторыми изменениями), я могу использовать? Я ищу конкретные кривые, на самом деле создание сертификата + ключей через OpenSSL (или другой распространенный или бесплатный инструмент) дало бы чрезвычайно конкретный ответ и было бы признательно!

Рабочий упрощенный код для сертификата RSA-4096 + ключи

public byte[] Encrypt(byte[] plainBytes, X509Certificate2 recipientCert)
{
    // create ContentInfo
    ContentInfo plainContent = new ContentInfo(plainBytes);

    // EnvelopedCms represents encrypted data
    //Oid encryptAlgoOid = new Oid("2.16.840.1.101.3.4.1.46"); // AES-256-GCM, .NET doesn't have it :(
    Oid encryptAlgoOid = new Oid("2.16.840.1.101.3.4.1.42"); // AES-256-CBC
    EnvelopedCms encryptedData = new EnvelopedCms(plainContent, new AlgorithmIdentifier(encryptAlgoOid));

    // add a recipient
    CmsRecipient recipient = new CmsRecipient(recipientCert);

    // encrypt data with public key of recipient
    encryptedData.Encrypt(recipient);

    // create PKCS #7 byte array
    byte[] encryptedBytes = encryptedData.Encode();

    // return encrypted data
    return encryptedBytes;
}

Исключение при использовании сертификата ECC + ключей

System.Security.Cryptography.CryptographicException: Unknown error "-1073741637".
   at System.Security.Cryptography.Pkcs.EnvelopedCms.EncryptContent(CmsRecipientCollection recipients)
   at System.Security.Cryptography.Pkcs.EnvelopedCms.Encrypt(CmsRecipientCollection recipients)
   at System.Security.Cryptography.Pkcs.EnvelopedCms.Encrypt(CmsRecipient recipient)

Рабочий упрощенный код для сертификата RSA-4096 + ключи

public byte[] Sign(byte[] data, X509Certificate2 signingCert)
{
    // create ContentInfo
    ContentInfo content = new ContentInfo(data);

    // SignedCms represents signed data
    SignedCms signedMessage = new SignedCms(content, detached:true)

    // create a signer
    CmsSigner signer = new CmsSigner(signingCert);

    // sign the data
    signedMessage.ComputeSignature(signer);

    // create PKCS #7 byte array
    byte[] signedBytes = signedMessage.Encode();

    // return signed data
    return signedBytes;
} 

Исключение при использовании сертификата ECC + ключей

System.Security.Cryptography.CryptographicException: Invalid provider type specified.
   at System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo(CmsSigner signer, Boolean silent)
   at System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner signer, Boolean silent)
   at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent)
   at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer)

Создание сертификата ECC

Я использую следующий пакетный файл для создания своих сертификатов ECC, репрезентативного фрагмента который

openssl ecparam -out test-ecparams.pem -name secp521r1
openssl req -newkey ec:test-ecparams.pem -sha512 -keyout test-key.pem -keyform PEM -out test-csr.pem -outform PEM -subj '/C=US/CN=ECC-cert-test' 
openssl x509 -req -days 365 -in test-csr.pem -signkey test-key.pem -out test-cert.pem -sha512 
openssl pkcs12 -export -aes256 -out test.pfx -in test-cert.pem -inkey test-key.pem -name "ECC-cert-test-friendlyname"

Дополнительные сведения

Если вы не хотите (повторно) создавать сертификат в соответствии с указанным выше пакетным файлом, вот дамп сертификата через openssl asn1parse -in test-cert.pem -i -dump

    0:d=0  hl=4 l= 450 cons: SEQUENCE          
    4:d=1  hl=4 l= 291 cons:  SEQUENCE          
    8:d=2  hl=2 l=   9 prim:   INTEGER           :ECEA16A0348AEAE1
   19:d=2  hl=2 l=  10 cons:   SEQUENCE          
   21:d=3  hl=2 l=   8 prim:    OBJECT            :ecdsa-with-SHA512
   31:d=2  hl=2 l=  37 cons:   SEQUENCE          
   33:d=3  hl=2 l=  11 cons:    SET               
   35:d=4  hl=2 l=   9 cons:     SEQUENCE          
   37:d=5  hl=2 l=   3 prim:      OBJECT            :countryName
   42:d=5  hl=2 l=   2 prim:      PRINTABLESTRING   :US
   46:d=3  hl=2 l=  22 cons:    SET               
   48:d=4  hl=2 l=  20 cons:     SEQUENCE          
   50:d=5  hl=2 l=   3 prim:      OBJECT            :commonName
   55:d=5  hl=2 l=  13 prim:      UTF8STRING        :ECC-cert-test
   70:d=2  hl=2 l=  30 cons:   SEQUENCE          
   72:d=3  hl=2 l=  13 prim:    UTCTIME           :130212015455Z
   87:d=3  hl=2 l=  13 prim:    UTCTIME           :140212015455Z
  102:d=2  hl=2 l=  37 cons:   SEQUENCE          
  104:d=3  hl=2 l=  11 cons:    SET               
  106:d=4  hl=2 l=   9 cons:     SEQUENCE          
  108:d=5  hl=2 l=   3 prim:      OBJECT            :countryName
  113:d=5  hl=2 l=   2 prim:      PRINTABLESTRING   :US
  117:d=3  hl=2 l=  22 cons:    SET               
  119:d=4  hl=2 l=  20 cons:     SEQUENCE          
  121:d=5  hl=2 l=   3 prim:      OBJECT            :commonName
  126:d=5  hl=2 l=  13 prim:      UTF8STRING        :ECC-cert-test
  141:d=2  hl=3 l= 155 cons:   SEQUENCE          
  144:d=3  hl=2 l=  16 cons:    SEQUENCE          
  146:d=4  hl=2 l=   7 prim:     OBJECT            :id-ecPublicKey
  155:d=4  hl=2 l=   5 prim:     OBJECT            :secp521r1
  162:d=3  hl=3 l= 134 prim:    BIT STRING        
      0000 - 00 04 00 3b b5 16 53 81-4a e5 40 3e c3 43 6f 09   ...;..S.J.@>.Co.
      0010 - 19 22 6f f2 45 81 71 41-3f 75 1e 89 74 a0 2a eb   ."o.E.qA?u..t.*.
      0020 - 8b d5 c5 1e 9c 50 6b 2e-2d 3c 69 da 5b 91 55 71   .....Pk.-<i.[.Uq
      0030 - 46 8e ef a7 b2 13 ad e0-9c 26 6d 99 6b d3 42 e1   F........&m.k.B.
      0040 - 3d 7a 21 2c 01 be 7b e8-43 c0 c0 79 ef 1e f4 4d   =z!,..{.C..y...M
      0050 - 7d 7d 52 56 30 17 57 2a-96 05 57 64 7d 8a e1 7a   }}RV0.W*..Wd}..z
      0060 - 3a 40 ff cd d6 03 e0 a2-00 3b 16 a9 26 91 d3 e9   :@.......;..&...
      0070 - d2 d9 db 5e 7f 00 7a ba-61 d3 8b b5 9f c2 8e ba   ...^..z.a.......
      0080 - ef 16 e9 c6 b9 47                                 .....G
  299:d=1  hl=2 l=  10 cons:  SEQUENCE          
  301:d=2  hl=2 l=   8 prim:   OBJECT            :ecdsa-with-SHA512
  311:d=1  hl=3 l= 140 prim:  BIT STRING        
      0000 - 00 30 81 88 02 42 01 53-a8 eb 32 30 84 b6 80 ab   .0...B.S..20....
      0010 - 12 f2 03 2a fb 39 f6 3b-72 54 6e 1b 48 cd 52 0e   ...*.9.;rTn.H.R.
      0020 - a7 64 96 02 52 75 5d bc-5d 85 65 b1 a4 f1 05 1b   .d..Ru].].e.....
      0030 - 7b 9c 5d 7b e2 b3 21 88-f4 f3 d8 04 7f 45 68 ac   {.]{..!......Eh.
      0040 - f3 77 7a fa ff 12 17 fc-02 42 01 8f ab 6d 0a fb   .wz......B...m..
      0050 - dd 70 37 f4 53 03 91 13-97 63 3e 77 37 78 86 e4   .p7.S....c>w7x..
      0060 - e7 4f 1c 06 51 99 2a e0-0b c1 6c ea 44 bd b2 41   .O..Q.*...l.D..A
      0070 - 78 be 67 b6 00 74 fd b2-4d 11 2e a6 58 2e b5 02   x.g..t..M...X...
      0080 - 77 ef 98 b2 ca be 68 b1-d3 27 e2 fb               w.....h..'..

PS: ранее я задавал вопрос, пытаясь решить проблему в обратном порядке; при выполнении ECC PKCS7/CMS через BouncyCastle но у него столько объятий, сколько у кактуса. Этот вопрос преследует совершенно иной подход...


person DeepSpace101    schedule 11.02.2013    source источник
comment
Ваш предыдущий вопрос не включал часто используемые теги, такие как cryptography и шифрование. Ваш вопрос увидели максимум 59 подписчиков с указанными тегами, и у вашего вопроса был шанс снежинки в аду.   -  person Maarten Bodewes    schedule 12.02.2013
comment
Платформа Microsoft CNG поддерживает только именованные кривые. Так что если ваш сертификат содержит параметры домена вместо OID кривой, то он не будет поддерживаться. Может ли это быть проблемой?   -  person Maarten Bodewes    schedule 12.02.2013
comment
Требуется ли вашему клиенту реализация ECC или реализация ECC, сертифицированная по FIPS 140-2? Я не уверен, что .NET. В любом случае, просто чтобы указать на некоторые другие варианты, есть также cryptlib и Mocana (не бесплатно, но может иметь сделку с вашим клиентом)   -  person jglouie    schedule 12.02.2013


Ответы (2)


Возможно, стоит отметить, что наборы шифров TLS не очень связаны с CMS (обратите внимание, что в RFC для CMS не упоминается TLS), поэтому, если вы намерены использовать CMS, то просмотр списка наборов шифров TLS, которые поддерживает OpenSSL, может оказаться неподходящим местом.

Кроме того, поскольку SHA-128 отсутствует, использование ecdsa-with-SHA128 кажется подвигом. ecdsa-with-SHA256 на самом деле может быть лучшим местом для начала.

person Viktor Dukhovni    schedule 26.11.2015

Ваша комбинация: ecdsa-with-SHA512 — не лучшая идея :-) Вместо этого попробуйте ecdsa-with-SHA128. Если это работает, вы можете увеличить до ecdsa-with-SHA256.

Вы уже проверили блог MSDN на Эллиптическая кривая Диффи-Хеллмана?

Вам следует подумать о том, чтобы не использовать криптографические библиотеки .NET по умолчанию; лучше попробуйте использовать OpenSSL и .NET / OpenSSL Wrapper.

В деталях: OpenSSL предоставляет список Cyphers: Open SSL ECC TLS 1.2 Cyphers: - TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 ECDH-ECDSA-AES128-SHA256 - TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 ECDH-ECDSA-AES256-SHA384 - TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 ECDH-ECDSA-AES128-GCM-SHA256 - TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 ECDH- ECDSA-AES256-GCM-SHA384

Список изменится, если вы выберете TLS 1.1!

Шифры .NET 4.5: немного скрыты, и список не зависит от библиотек вашей операционной системы: ознакомьтесь с классом и атрибутами класса алгоритма цифровой подписи на эллиптических кривых (ECDSA): MSDN ECDSA

Так что теперь просто выберите рабочую комбинацию.

person Tobi    schedule 05.03.2014
comment
Добро пожаловать в Stack Overflow. Я внес некоторые косметические изменения в ваш ответ, но он опасно близок к тому, чтобы быть «не ответом», а просто комментариями. - person Jonathan Leffler; 05.03.2014
comment
Можете ли вы уточнить свою комбинацию: ecdsa-with-SHA512 - не лучшая идея :-)? - person DeepSpace101; 07.03.2014
comment
Исключение в вопросе: System.Security.Cryptography.CryptographicException: указан неверный тип поставщика. указывает, что ecdsa-with-SHA512 не поддерживается. И я знаю, что эта комбинация также была невозможна с openSSL год назад. Поэтому измените подпись на ecdsa-with-SHA128. Также ознакомьтесь с: openssl.org/docs/apps/ciphers.html ECDSA. с SHA512 очень редко. Неудивительно, что .NET не очень хорошо его поддерживает. - person Tobi; 07.03.2014