как импортировать открытые / частные ключи из файла с помощью класса ECDsa в. net? - PullRequest
0 голосов
/ 06 мая 2020

Я создал метод, который генерирует новую пару ключей, если у вас их нет, и извлекает их, если они у вас уже были.

Проблема в том, когда я пытаюсь получить ключи ( импортируя их в существующий объект ECDsa), он успешно завершает операцию восстановления, но когда я пытаюсь экспортировать ключи, он выдает ошибку !!

код для записи и получения ключей следующий :

        public ECDsa Ecc=ECDsa.Create();

        public void Initialize_key_Pair(){

         if (File.Exists(Path+"/Keys/PUBkey.txt"))
            {
                Console.WriteLine("retreiving keys");
                using (FileStream fspub=File.OpenRead(Path+"/Keys/PUBkey.txt"))
                using (FileStream fsprv=File.OpenRead(Path+"/Keys/PRVkey.txt"))
                {
                    PublicKey= new byte[fspub.Length];
                    PrivateKey = new byte[fsprv.Length];

                        fspub.Read(PublicKey, 0,PublicKey.Length);
                        fsprv.Read(PrivateKey, 0, PrivateKey.Length);
                        System.Console.WriteLine("private key from directory is :");
                        Stoverflow.PrintByteArray(PrivateKey);

                        //import the keys to the current ECDSA object
                        int bytes,bytes2 = 0; 
                        Span<byte> imported_prv_key=new Span<byte>(PrivateKey);
                        Span<byte> imported_pub_key=new Span<byte>(PublicKey);

                        Ecc.ImportECPrivateKey(PrivateKey,out bytes);
                        Ecc.ImportSubjectPublicKeyInfo(PrivateKey,out bytes2);
                }
            }
            else
            {
                Console.WriteLine("creating new keys");

                using (FileStream fspub = File.Create(Path + "/Keys/PUBkey.txt"))
                using (FileStream fsprv = File.Create(Path + "/Keys/PRVkey.txt"))
                {
                    PublicKey = Ecc.ExportSubjectPublicKeyInfo();
                    PrivateKey = Ecc.ExportECPrivateKey();
                    fspub.Write(PublicKey, 0, PublicKey.Length);
                    fsprv.Write(PrivateKey, 0, PrivateKey.Length);
                }
            }
        }

проблема в том, что я пробую следующее:

Ecc.ExportECPrivateKey()

Я использую приведенный выше код для экспорта ключей после их извлечения из файлов, но это вызывает следующую ошибку

Unhandled exception. System.Security.Cryptography.CryptographicException: Object contains only the public half of a key pair. A private key must also be provided.
   at Interop.Crypto.GetECKeyParameters(SafeEcKeyHandle key, Boolean includePrivate)
   at System.Security.Cryptography.ECOpenSsl.ExportNamedCurveParameters(SafeEcKeyHandle key, Boolean includePrivateParameters)
   at System.Security.Cryptography.ECOpenSsl.ExportParameters(SafeEcKeyHandle currentKey, Boolean includePrivateParameters)
   at System.Security.Cryptography.ECDsaImplementation.ECDsaOpenSsl.ExportParameters(Boolean includePrivateParameters)
   at System.Security.Cryptography.ECDsa.ExportECPrivateKey()

Я не знаю, в чем причина проблемы, похоже, что импорт ключей в объект ECDsa прошел успешно, но всякий раз, когда я пытаюсь использовать эти ключи из этого объекта, происходит сбой, пожалуйста help !!

ps: я использую linux в качестве операционной системы, поэтому я не могу использовать ECDsaCng

...