using ElectronicSignature.Certification; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography; using System.Security; using System.Text; using Org.BouncyCastle.Cms; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.X509; public static class Engine { private static readonly string keyPairPath = @"G:\tests\rsaKeyPair.pem"; private static readonly string privateKeyPath = @"G:\tests\rsaPrivateKey.pem"; private static readonly string publicKeyPath = @"G:\tests\rsaPublicKey.pem"; private static readonly string csrPath = @"G:\tests\rsaCSR.pem"; private static readonly string signedCertPath = @"G:\tests\rsaSignedCert.pem"; private static readonly string selfSignedCertPath = @"G:\tests\selfSignedCert.pem"; private static readonly string privateCertPath = @"G:\tests\privateCert.pfx"; private static readonly string privateCertPass = "1234"; /// /// Эта тестовая функция может генерировать пару открытых и закрытых ключей с использованием алгоритма шифрования RSA. /// Это широко используемый алгоритм для генерации защищенных ключей, который часто используется для защищенной связи. /// public static void GenerateRSAKeyPair() { var keyPair = Cryptography.GenerateRSAKeyPair(); keyPair.ToPemFile(keyPairPath); MessageBox.Show("OK"); } /// /// Эта тестовая функция может генерировать пару открытых и закрытых ключей с использованием алгоритма шифрования ECDSA. /// Это широко используемый алгоритм для генерации защищенных ключей, который часто используется для защищенной связи.s /// public static void GenerateECDSAKeyPair() { var keyPair = Cryptography.GenerateECDSAKeyPair(); keyPair.ToPemFile(keyPairPath); } /// /// Этой тестовой функцией может быть запись пары ключей в файл или создание закрытого и открытого ключей. /// Закрытые ключи используются в асимметричном шифровании, где один ключ используется для шифрования, а другой - для дешифрования. /// public static void WriteKeyPairInPemFile() { var keyPair = keyPairPath.GetKeyPairFromPem(); keyPair.Private.ToPemFile(privateKeyPath); keyPair.Public.ToPemFile(publicKeyPath); } /// /// Эта тестовая функция может генерировать запрос на подпись сертификата (CSR), который представляет собой сообщение, отправляемое в центр сертификации для запроса цифрового сертификата. /// public static void GenerateCSR() { 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() { var selfSignedCert = Cryptography.GenerateSelfSignedCert(csrPath.GetCSRPemFile(), keyPairPath.GetPrivateKeyFromPem(), DateTime.UtcNow, DateTime.UtcNow.AddYears(1)); selfSignedCert.ToPemFile(selfSignedCertPath); } /// /// Этой тестовой функцией может быть создание файла PFX, который представляет собой формат файла, используемый для безопасного хранения закрытых ключей и сертификатов. /// public static void CreatePfx() { 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() { var signedCert = Cryptography.GenerateSignedCertificate(csrPath.GetCSRPemFile(), privateCertPath.GetPrivateCert(privateCertPass), privateCertPath, DateTime.UtcNow, DateTime.UtcNow.AddYears(1)); signedCert.ToPemFile(signedCertPath); } /// /// Эта тестовая функция может проверять, что сертификат был подписан закрытым ключом. /// public static void VerifySignedByPrivateKey() { var message = "Hello world"; var signature = Cryptography.SignDataByPrivateKey(message, privateKeyPath.GetPrivateKeyFromPem()); if (Cryptography.VerifySignedByPublicKey(message, signature, publicKeyPath.GetPublicKeyFromPem())) MessageBox.Show("Сертификат был подписан закрытым ключом."); else MessageBox.Show("Сертификат был подписан не закрытым ключом."); } //Эта тестовая функция может расшифровывать данные с использованием закрытого ключа. public static void TestDecryptWithKey() { var message = "Hello world"; var keyPair = keyPairPath.GetKeyPairFromPem(); var encoded = Cryptography.EncryptDataWithPublicKey(message, keyPair.Public); var data = Cryptography.DecryptDataWithPrivateKey(encoded, keyPair.Private); if(message == data) MessageBox.Show("Проверка успешна"); } /// /// Эта тестовая функция может проверять, что подписанным данным можно доверять, используя тот же сертификат. /// public static void TestVerifySignedDataBySameCert() { var message = "Hello world"; var signature = Cryptography.SignDataByPrivateCert(message, privateCertPath.GetPrivateCert(privateCertPass)); if (Cryptography.VerifySignedDataBySameCert(signature, privateCertPath.GetPrivateCert(privateCertPass), out var data)) { if (data != null) MessageBox.Show("подписанным данным можно доверять"); } else { MessageBox.Show("подписанным данным нельзя доверять"); } } /// ///Эта тестовая функция может проверять соответствие открытого ключа и закрытого ключа. /// public static void VerifyMatchBetweenPublicAndPrivateKeys() { var isValid = Cryptography.VerifyMatchBetweenPublicAndPrivateKeys(signedCertPath.GetPublicCert(), privateCertPath.GetPrivateCert(privateCertPass)); if(isValid) MessageBox.Show("Ключи совпадают"); } // шифровка разшифровка public static void check() { var message = "Hello world"; var encoded = Cryptography.EncryptDataByPublicCert(message, signedCertPath.GetPublicCert()); var data = Cryptography.DecryptDataWithPrivateCert(encoded, privateCertPath.GetPrivateCert(privateCertPass), privateCertPass); MessageBox.Show(Encoding.UTF8.GetString(data)); } /// /// Проверяет метод Get Compressed ECDSA PublicKey FromBase64, предоставляя сжатый открытый ключ ECDSA в кодировке Base64 /// и проверяем, не является ли полученный ключ закрытым. /// public static void TestGetCompressedECDSAPublicKeyFromBase64() { var key = "A2srIPKCMgOVyXq/fhK5Wnr3A/w9cfDv7dEepWZAKglw".GetCompressedECDSAPublicKeyFromBase64(); Console.WriteLine(!key.IsPrivate); } /// /// Проверяет, получают ли они метод compressedecdsapublickeyfrompem, предоставляя сжатый открытый ключ ECDSA в формате PEM /// и проверяем, не является ли импортированный ключ закрытым.. /// public static void TestImportCompressedECDSAPublicKeyFromPem() { var compressedKeyAsPem = @"-----BEGIN EC PUBLIC KEY-----A2srIPKCMgOVyXq/fhK5Wnr3A/w9cfDv7dEepWZAKglw-----END EC PUBLIC KEY-----"; var key = compressedKeyAsPem.GetCompressedECDSAPublicKeyFromPem(); Console.WriteLine(!key.IsPrivate); } }