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
{
///
/// Service der eine Kombination aus private und public Key erstellen kann
///
public class KeyGeneratorService : IKeyGeneratorService
{
///
/// Erstellt einen public und einen Private key mit Standard 1024 bit Verschlüsselung
///
/// PrivateKey und Public Key
public Tuple GenerateKeys()
{
return GenerateKeys(1024);
}
///
/// Erstellt einen public und einen Private key
///
/// Schlüssel Größe
/// PrivateKey und Public Key
public Tuple GenerateKeys(int keySize)
{
var secureRandom = new SecureRandom();
return GenerateKeys(keySize, secureRandom.GenerateSeed(32));
}
///
/// Erstellt einen public und einen Private key
///
/// Schlüssel Größe
/// Seed
/// PrivateKey und Public Key
public Tuple 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(serializedPrivate, serializedPublic);
}
}
}