Я создал метод, который генерирует новую пару ключей, если у вас их нет, и извлекает их, если они у вас уже были.
Проблема в том, когда я пытаюсь получить ключи ( импортируя их в существующий объект 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