Я шифрую и дешифрую данные, используя RSACryptoServiceProvider
в C #, и когда я генерирую новую пару ключей, я возвращаю закрытый ключ вызывающей стороне метода, а затем сохраняю открытый ключ в самодельном PKI (просто словарь сkeyBlob и уникальный идентификатор).
Моя проблема заключается в следующем: поскольку мне нужно хранить открытый ключ, я не хочу случайно хранить закрытый ключ в PKI.Однако, поскольку мне также нужно записать закрытый ключ в файл, я работаю с байтовыми массивами, экспортированными с помощью метода ExportCspBlob
.
Мой вопрос:
Как убедиться, проверивbyte[]
что я анализирую в своем методе StoreKey
, что он на самом деле является открытым ключом и не содержит информации о секретном ключе?
Для пояснения приведен соответствующий код:
public static bool StoreKey(byte[] publicKeyParameters, string uniqueIdentifier)
{
bool success = false;
if (!keyCollection.ContainsKey(uniqueIdentifier))
{
if (!keyCollection.ContainsValue(publicKeyParameters))
{
keyCollection.Add(uniqueIdentifier, publicKeyParameters);
success = true;
}
}
return success;
}
И метод GenerateKeys
:
public static byte[] GenerateKeys(string uniqueIdentifier)
{
byte[] privateKeyBlob;
using (var rsa = new RSACryptoServiceProvider(4096))
{
try
{
byte[] publicKey = rsa.ExportCspBlob(false);
privateKeyBlob = rsa.ExportCspBlob(true);
PublicKeyInfrastructure.StoreKey(publicKey, uniqueIdentifier);
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return privateKeyBlob;
}
Поскольку я работаю над двумя разными классами, я хотел бы воздержаться от инициализации RSACryptoServiceProvider
в моей PKI, просто для импорта ключа ипроверьте это.Это возможно?