Расшифровка OpenPGP в C # с помощью закрытого ключа файла Certificate .pfx X.509

#c# #encryption

#c# #шифрование

Вопрос:

Друзья,

Мы приобрели сертификаты класса 3 как .pfx, так и .cer у центра сертификации. И shared .cer(открытый ключ) нашему партнеру.

Шифрование (Java)

Наш партнер зашифровал сообщение (с помощью нашего открытого ключа), используя стандарт openpgp Java bouncy castle, и передал зашифрованное сообщение, как показано ниже, —— НАЧАТЬ СООБЩЕНИЕ PGP —— Версия: x v2hQEMAzFXJ94q1Nm8AQf /Tld0/3dAvgFKPQVBS8bmbXChXeApeReo1ydNS …… —— ЗАВЕРШЕНИЕ PGPСООБЩЕНИЕ——

Расшифровка: (C #)

Нам нужно расшифровать сообщение с помощью нашего файла .pfx.

Я просмотрел следующие статьи, http://burnignorance.com/c-coding-tips/pgp-encryption-decryption-in-c / Похоже, что новая PGPKeyPair генерируется и используется для шифрования и дешифрования.

Но в моем случае у меня есть файл .pfx Как нам извлечь ключ pgpprivate из файла .pfx, используемого для расшифровки? Не могли бы вы поделиться некоторыми мыслями о том, как мы можем это сделать. Заранее спасибо за все ваше время на это.

13/12/2020

Я импортировал файл X509Certificate .pfx в хранилище, как показано ниже, и пытался преобразовать ключ pgpprivate,

 string certPath = @"C:Userstest.pfx";
            string certPass = "apples";

            // Create a collection object and populate it using the PFX file
            X509Certificate2Collection collection = new X509Certificate2Collection();
            collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet);

            X509Certificate2 certificate = collection[0];
            AsymmetricAlgorithm x509PrivateKey = certificate.PrivateKey;
            PgpPrivateKey pK = x509PrivateKey; //Here i am gettting the invalid conversion error.
 

Я пытаюсь использовать закрытый ключ сертификата X.509 в качестве PGPrivatekey при расшифровке. Но при назначении закрытого ключа pgpprivatekey возникает недопустимое исключение приведения.

Есть ли какой-либо способ добиться этого?

С уважением, Сталин

Комментарии:

1. Используйте метод импорта : docs.microsoft.com/en-us/dotnet/api /…

2. Спасибо. Я уже импортировал сертификат в объект X509Certificate2. Но я не знаю о преобразовании X.509 PrivateKey в объект PGPPrivatekey для использования алгоритма дешифрования PGP.

3. Вам нужен закрытый ключ, который вы можете получить из X509Certificate2 : docs.microsoft.com/en-us/dotnet/api /…

4. Как вы упомянули, я попытался импортировать сертификат X.509 (.pfx) в хранилище и получил объект privatekey и попытался преобразовать в pgpprivatekey, который можно использовать в процессе PGPdecrition, аналогично blog, burnignorance.com/c-coding-tips/pgp-encryption-decryption-in-c Однако получение недопустимого исключения приведения при назначении privatekey для pgprivatekey. Не могли бы вы поделиться своими мыслями. Я также добавил соответствующий код

Ответ №1:

Вы можете попробовать использовать BouncyCastle API для чтения файла pfx с использованием файла класса PKCS12, а затем преобразовать ключ в PgpSecretKey.

прочитайте документ в —> pkcs12.getKey() и классе PgpSecretKey.

 public static void GetPriveKey(String pfxFile, String pfxPassword)
{
    //Load PKCS12 file
    Pkcs12Store pkcs12 = new Pkcs12Store(new FileStream(pfxFile, FileMode.Open, FileAccess.Read), pfxPassword.ToArray());
    string keyAlias = null;

    foreach (string name in pkcs12.Aliases)
    {
        if (pkcs12.IsKeyEntry(name))
        {
           keyAlias = name;
            break;
        }
    }

    //
    AsymmetricKeyParameter Privatekey = pkcs12.GetKey(keyAlias).Key;
    X509CertificateEntry[] ce = pkcs12.GetCertificateChain(keyAlias);
    AsymmetricKeyParameter PublicKey= ce[0].Certificate.GetPublicKey();


    PgpSecretKey mySecretKey = new PgpSecretKey(PgpSignature.DefaultCertification,
        PublicKeyAlgorithmTag.RsaGeneral,
        PublicKey,
        Privatekey,
        DateTime.UtcNow,
        keyAlias,
        SymmetricKeyAlgorithmTag.Cast5,
        pfxPassword.ToCharArray(), 
        true,
        null, 
        null,
        new SecureRandom());
 }