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);
}
}