EL_Singature/AppView/Engine.cs

203 lines
9.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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";
/// <summary>
/// Эта тестовая функция может генерировать пару открытых и закрытых ключей с использованием алгоритма шифрования RSA.
/// Это широко используемый алгоритм для генерации защищенных ключей, который часто используется для защищенной связи.
/// </summary>
public static void GenerateRSAKeyPair()
{
var keyPair = Cryptography.GenerateRSAKeyPair();
keyPair.ToPemFile(keyPairPath);
MessageBox.Show("OK");
}
/// <summary>
/// Эта тестовая функция может генерировать пару открытых и закрытых ключей с использованием алгоритма шифрования ECDSA.
/// Это широко используемый алгоритм для генерации защищенных ключей, который часто используется для защищенной связи.s
/// </summary>
public static void GenerateECDSAKeyPair()
{
var keyPair = Cryptography.GenerateECDSAKeyPair();
keyPair.ToPemFile(keyPairPath);
}
/// <summary>
/// Этой тестовой функцией может быть запись пары ключей в файл или создание закрытого и открытого ключей.
/// Закрытые ключи используются в асимметричном шифровании, где один ключ используется для шифрования, а другой - для дешифрования.
/// </summary>
public static void WriteKeyPairInPemFile()
{
var keyPair = keyPairPath.GetKeyPairFromPem();
keyPair.Private.ToPemFile(privateKeyPath);
keyPair.Public.ToPemFile(publicKeyPath);
}
/// <summary>
/// Эта тестовая функция может генерировать запрос на подпись сертификата (CSR), который представляет собой сообщение, отправляемое в центр сертификации для запроса цифрового сертификата.
/// </summary>
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);
}
/// <summary>
/// Эта тестовая функция может генерировать самозаверяющий сертификат.
/// Самозаверяющие сертификаты - это цифровые сертификаты, подписанные тем же лицом, которое выдает сертификат.
/// </summary>
public static void GenerateSelfSignedCert()
{
var selfSignedCert = Cryptography.GenerateSelfSignedCert(csrPath.GetCSRPemFile(),
keyPairPath.GetPrivateKeyFromPem(),
DateTime.UtcNow,
DateTime.UtcNow.AddYears(1));
selfSignedCert.ToPemFile(selfSignedCertPath);
}
/// <summary>
/// Этой тестовой функцией может быть создание файла PFX, который представляет собой формат файла, используемый для безопасного хранения закрытых ключей и сертификатов.
/// </summary>
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));
}
/// <summary>
/// Эта тестовая функция может генерировать подписанный сертификат.
/// Подписанный сертификат - это цифровой сертификат, который был подписан доверенной третьей стороной, известной как центр сертификации.
/// </summary>
public static void GenerateSignedCert()
{
var signedCert = Cryptography.GenerateSignedCertificate(csrPath.GetCSRPemFile(),
privateCertPath.GetPrivateCert(privateCertPass),
privateCertPath,
DateTime.UtcNow,
DateTime.UtcNow.AddYears(1));
signedCert.ToPemFile(signedCertPath);
}
/// <summary>
/// Эта тестовая функция может проверять, что сертификат был подписан закрытым ключом.
/// </summary>
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("Проверка успешна");
}
/// <summary>
/// Эта тестовая функция может проверять, что подписанным данным можно доверять, используя тот же сертификат.
/// </summary>
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("подписанным данным нельзя доверять");
}
}
/// <summary>
///Эта тестовая функция может проверять соответствие открытого ключа и закрытого ключа.
/// </summary>
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));
}
/// <summary>
/// Проверяет метод Get Compressed ECDSA PublicKey FromBase64, предоставляя сжатый открытый ключ ECDSA в кодировке Base64
/// и проверяем, не является ли полученный ключ закрытым.
/// </summary>
public static void TestGetCompressedECDSAPublicKeyFromBase64()
{
var key = "A2srIPKCMgOVyXq/fhK5Wnr3A/w9cfDv7dEepWZAKglw".GetCompressedECDSAPublicKeyFromBase64();
Console.WriteLine(!key.IsPrivate);
}
/// <summary>
/// Проверяет, получают ли они метод compressedecdsapublickeyfrompem, предоставляя сжатый открытый ключ ECDSA в формате PEM
/// и проверяем, не является ли импортированный ключ закрытым..
/// </summary>
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);
}
}