gehgassi_backend/gehGassi.Core/Services/KeyGeneratorService.cs

62 lines
2.4 KiB
C#

using System;
using gehGassi.Core.Interfaces;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;
namespace gehGassi.Core.Services
{
/// <summary>
/// Service der eine Kombination aus private und public Key erstellen kann
/// </summary>
public class KeyGeneratorService : IKeyGeneratorService
{
/// <summary>
/// Erstellt einen public und einen Private key mit Standard 1024 bit Verschlüsselung
/// </summary>
/// <returns>PrivateKey und Public Key</returns>
public Tuple<string, string> GenerateKeys()
{
return GenerateKeys(1024);
}
/// <summary>
/// Erstellt einen public und einen Private key
/// </summary>
/// <param name="keySize">Schlüssel Größe</param>
/// <returns>PrivateKey und Public Key</returns>
public Tuple<string, string> GenerateKeys(int keySize)
{
var secureRandom = new SecureRandom();
return GenerateKeys(keySize, secureRandom.GenerateSeed(32));
}
/// <summary>
/// Erstellt einen public und einen Private key
/// </summary>
/// <param name="keySize">Schlüssel Größe</param>
/// <param name="seed">Seed</param>
/// <returns>PrivateKey und Public Key</returns>
public Tuple<string, string> GenerateKeys(int keySize, byte[] seed)
{
var generator = new RsaKeyPairGenerator();
var secureRandom = new SecureRandom();
secureRandom.SetSeed(seed);
generator.Init(new KeyGenerationParameters(secureRandom, keySize));
var pair = generator.GenerateKeyPair();
var privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(pair.Private);
var serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetDerEncoded();
var serializedPrivate = Convert.ToBase64String(serializedPrivateBytes);
var publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pair.Public);
var serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
var serializedPublic = Convert.ToBase64String(serializedPublicBytes);
return new Tuple<string, string>(serializedPrivate, serializedPublic);
}
}
}