EL_Singature/Library/Engine.cs

154 lines
6.8 KiB
C#
Raw Normal View History

2023-05-19 21:46:44 +04:00

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;
2023-05-25 00:09:20 +04:00
using Xceed.Wpf.Toolkit;
2023-05-19 21:46:44 +04:00
2023-05-25 00:09:20 +04:00
public class Engine
2023-05-19 21:46:44 +04:00
{
/// <summary>
/// Эта тестовая функция может генерировать пару открытых и закрытых ключей с использованием алгоритма шифрования RSA.
/// Это широко используемый алгоритм для генерации защищенных ключей, который часто используется для защищенной связи.
/// </summary>
2023-05-20 00:18:29 +04:00
public static void GenerateRSAKeyPair(string keyPairPath)
2023-05-19 21:46:44 +04:00
{
var keyPair = Cryptography.GenerateRSAKeyPair();
keyPair.ToPemFile(keyPairPath);
}
/// <summary>
/// Этой тестовой функцией может быть запись пары ключей в файл или создание закрытого и открытого ключей.
/// Закрытые ключи используются в асимметричном шифровании, где один ключ используется для шифрования, а другой - для дешифрования.
/// </summary>
2023-05-20 00:18:29 +04:00
public static void WriteKeyPairInPemFile(string keyPairPath, string privateKeyPath, string publicKeyPath)
2023-05-19 21:46:44 +04:00
{
var keyPair = keyPairPath.GetKeyPairFromPem();
keyPair.Private.ToPemFile(privateKeyPath);
keyPair.Public.ToPemFile(publicKeyPath);
}
/// <summary>
/// Эта тестовая функция может генерировать запрос на подпись сертификата (CSR), который представляет собой сообщение, отправляемое в центр сертификации для запроса цифрового сертификата.
/// </summary>
2023-05-20 00:18:29 +04:00
public static void GenerateCSR(string keyPairPath, string csrPath)
2023-05-19 21:46:44 +04:00
{
var keyPair = keyPairPath.GetKeyPairFromPem();
var csr = Cryptography.GenerateCSR("Russia", "Ulyanovsk region", "Ulyanovsk", "UISTU", "Student", "Seliaev_D.A", CryptographyAlgorithm.SHA256withRSA, keyPair);
csr.ToPemFile(csrPath);
}
/// <summary>
/// Эта тестовая функция может генерировать самозаверяющий сертификат.
/// Самозаверяющие сертификаты - это цифровые сертификаты, подписанные тем же лицом, которое выдает сертификат.
/// </summary>
2023-05-20 00:18:29 +04:00
public static void GenerateSelfSignedCert(string csrPath, string keyPairPath, string selfSignedCertPath)
2023-05-19 21:46:44 +04:00
{
var selfSignedCert = Cryptography.GenerateSelfSignedCert(csrPath.GetCSRPemFile(),
keyPairPath.GetPrivateKeyFromPem(),
DateTime.UtcNow,
DateTime.UtcNow.AddYears(1));
selfSignedCert.ToPemFile(selfSignedCertPath);
}
/// <summary>
/// Этой тестовой функцией может быть создание файла PFX, который представляет собой формат файла, используемый для безопасного хранения закрытых ключей и сертификатов.
/// </summary>
2023-05-20 00:18:29 +04:00
public static void CreatePfx(string keyPairPath, string selfSignedCertPath, string privateCertPath)
2023-05-19 21:46:44 +04:00
{
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));
}
/// <summary>
/// Эта тестовая функция может генерировать подписанный сертификат.
/// Подписанный сертификат - это цифровой сертификат, который был подписан доверенной третьей стороной, известной как центр сертификации.
/// </summary>
2023-05-20 00:18:29 +04:00
public static void GenerateSignedCert(string csrPath, string privateCertPath, string privateCertPass, string signedCertPath)
2023-05-19 21:46:44 +04:00
{
var signedCert = Cryptography.GenerateSignedCertificate(csrPath.GetCSRPemFile(),
privateCertPath.GetPrivateCert(privateCertPass),
privateCertPath,
DateTime.UtcNow,
DateTime.UtcNow.AddYears(1));
signedCert.ToPemFile(signedCertPath);
}
/// <summary>
/// Эта тестовая функция может проверять, что сертификат был подписан закрытым ключом.
/// </summary>
2023-05-25 00:09:20 +04:00
public static bool VerifySignedByPrivateKey(string privateKeyPath, string publicKeyPath)
2023-05-19 21:46:44 +04:00
{
var message = "Hello world";
var signature = Cryptography.SignDataByPrivateKey(message, privateKeyPath.GetPrivateKeyFromPem());
if (Cryptography.VerifySignedByPublicKey(message, signature, publicKeyPath.GetPublicKeyFromPem()))
2023-05-25 00:09:20 +04:00
return true;
2023-05-19 21:46:44 +04:00
else
2023-05-25 00:09:20 +04:00
return false;
2023-05-19 21:46:44 +04:00
}
2023-05-25 00:09:20 +04:00
public static bool WriteKeyOnFile(string file_path, string file_for_save_path, string public_key_path)
2023-05-19 21:46:44 +04:00
{
2023-05-25 00:09:20 +04:00
FileStream? fstream = null;
try
2023-05-19 21:46:44 +04:00
{
2023-05-25 00:09:20 +04:00
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;
2023-05-19 21:46:44 +04:00
}
2023-05-25 00:09:20 +04:00
catch (Exception ex)
2023-05-19 21:46:44 +04:00
{
2023-05-25 00:09:20 +04:00
return false;
2023-05-19 21:46:44 +04:00
}
}
/// <summary>
2023-05-25 00:09:20 +04:00
/// Функция может проверять, что сертификат был подписан закрытым ключом.
2023-05-19 21:46:44 +04:00
/// </summary>
2023-05-25 00:09:20 +04:00
public static bool CheckKeyinFIle(string file_path, string open_key_path, string private_key_path, string pass)
2023-05-19 21:46:44 +04:00
{
2023-05-25 00:09:20 +04:00
FileStream? fstream = null;
try
{
fstream = new FileStream(file_path, FileMode.Open);
var signature = Cryptography.SignDataByPrivateCert(fstream.ToString(), private_key_path.GetPrivateCert(pass));
if (Cryptography.VerifySignedDataByCertIssuer(signature, open_key_path.GetPublicCert(), out var data))
{
if (data != null)
2023-05-25 00:11:32 +04:00
return false;
2023-05-25 00:09:20 +04:00
}
else
{
2023-05-25 00:11:32 +04:00
return true;
2023-05-25 00:09:20 +04:00
}
}
catch (Exception ex)
{
return false;
}
return false;
2023-05-19 21:46:44 +04:00
}
}