using ElectronicSignature.Certification; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography; using System.Security; public class Engine { /// /// Эта тестовая функция может генерировать пару открытых и закрытых ключей с использованием алгоритма шифрования RSA. /// Это широко используемый алгоритм для генерации защищенных ключей, который часто используется для защищенной связи. /// public static void GenerateRSAKeyPair(string keyPairPath) { var keyPair = Cryptography.GenerateRSAKeyPair(); keyPair.ToPemFile(keyPairPath); } /// /// Этой тестовой функцией может быть запись пары ключей в файл или создание закрытого и открытого ключей. /// Закрытые ключи используются в асимметричном шифровании, где один ключ используется для шифрования, а другой - для дешифрования. /// public static void WriteKeyPairInPemFile(string keyPairPath, string privateKeyPath, string publicKeyPath) { var keyPair = keyPairPath.GetKeyPairFromPem(); keyPair.Private.ToPemFile(privateKeyPath); keyPair.Public.ToPemFile(publicKeyPath); } /// /// Эта тестовая функция может генерировать запрос на подпись сертификата (CSR), который представляет собой сообщение, отправляемое в центр сертификации для запроса цифрового сертификата. /// public static void GenerateCSR(string keyPairPath, string csrPath) { var keyPair = keyPairPath.GetKeyPairFromPem(); var csr = Cryptography.GenerateCSR("Russia", "Ulyanovsk region", "Ulyanovsk", "UISTU", "Student", "Seliaev_D.A", CryptographyAlgorithm.SHA256withRSA, keyPair); csr.ToPemFile(csrPath); } /// /// Эта тестовая функция может генерировать самозаверяющий сертификат. /// Самозаверяющие сертификаты - это цифровые сертификаты, подписанные тем же лицом, которое выдает сертификат. /// public static void GenerateSelfSignedCert(string csrPath, string keyPairPath, string selfSignedCertPath) { var selfSignedCert = Cryptography.GenerateSelfSignedCert(csrPath.GetCSRPemFile(), keyPairPath.GetPrivateKeyFromPem(), DateTime.UtcNow, DateTime.UtcNow.AddYears(1)); selfSignedCert.ToPemFile(selfSignedCertPath); } /// /// Этой тестовой функцией может быть создание файла PFX, который представляет собой формат файла, используемый для безопасного хранения закрытых ключей и сертификатов. /// public static void CreatePfx(string keyPairPath, string selfSignedCertPath, string privateCertPath) { var certificate = new X509Certificate2(selfSignedCertPath); var keyPair = keyPairPath.GetKeyPairFromPem(); var bcRsaPrivateKey = (RsaPrivateCrtKeyParameters)keyPair.Private; var rsaParameters = DotNetUtilities.ToRSAParameters(bcRsaPrivateKey); var rsaKey = RSA.Create(rsaParameters); // Assuming you have an X509Certificate2 named certificate var exportableCertificate = certificate.CopyWithPrivateKey(rsaKey); // Create password for certificate protection var passwordForCertificateProtection = new SecureString(); foreach (var @char in "1234") passwordForCertificateProtection.AppendChar(@char); // Export certificate to a file. File.WriteAllBytes(privateCertPath, exportableCertificate.Export(X509ContentType.Pfx, passwordForCertificateProtection)); } /// /// Эта тестовая функция может генерировать подписанный сертификат. /// Подписанный сертификат - это цифровой сертификат, который был подписан доверенной третьей стороной, известной как центр сертификации. /// public static void GenerateSignedCert(string csrPath, string privateCertPath, string privateCertPass, string signedCertPath) { var signedCert = Cryptography.GenerateSignedCertificate(csrPath.GetCSRPemFile(), privateCertPath.GetPrivateCert(privateCertPass), privateCertPath, DateTime.UtcNow, DateTime.UtcNow.AddYears(1)); signedCert.ToPemFile(signedCertPath); } /// /// Эта тестовая функция может проверять, что сертификат был подписан закрытым ключом. /// public static bool VerifySignedByPrivateKey(string privateKeyPath, string publicKeyPath) { var message = "Hello world"; var signature = Cryptography.SignDataByPrivateKey(message, privateKeyPath.GetPrivateKeyFromPem()); if (Cryptography.VerifySignedByPublicKey(message, signature, publicKeyPath.GetPublicKeyFromPem())) return true; else return false; } public static bool WriteKeyOnFile(string file_path, string file_for_save_path, string public_key_path) { FileStream? fstream = null; try { fstream = File.OpenRead(file_path); var encoded = Cryptography.EncryptDataByPublicCert(fstream.ToString(), public_key_path.GetPublicCert()); fstream?.Close(); fstream = new FileStream(file_for_save_path, FileMode.OpenOrCreate); fstream?.Write(encoded); fstream?.Close(); return true; } catch (Exception ex) { return false; } } /// /// Функция может проверять, что сертификат был подписан закрытым ключом. /// public static bool CheckKeyinFIle(string file_path, string open_key_path, string private_key_path, string pass) { FileStream? fstream = null; try { fstream = new FileStream(file_path, FileMode.Open); var signature = Cryptography.SignDataByPrivateCert(fstream.ToString(), private_key_path.GetPrivateCert(pass)); fstream.Close(); if (!Cryptography.VerifySignedDataByCertIssuer(signature, open_key_path.GetPublicCert(), out var data)) { return true; } else { return false; } } catch (Exception ex) { return false; } } }