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