using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.X509; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Sifreleme2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string plainText = "TeknoSeyir"; string cihperText = encrypt(plainText); string decryptedCipherText = decrypt(cihperText); Console.WriteLine("Encrypted text: {0}", cihperText); Console.WriteLine("Decrypted text {0}. Encryption/Decryption was correct {1}", decryptedCipherText, (plainText == decryptedCipherText).ToString()); } static string encrypt(string plainText) { byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); PemReader pr = new PemReader( (StreamReader)File.OpenText("./public.pem") ); RsaKeyParameters keys = (RsaKeyParameters)pr.ReadObject(); // Pure mathematical RSA implementation // RsaEngine eng = new RsaEngine(); // PKCS1 v1.5 paddings // Pkcs1Encoding eng = new Pkcs1Encoding(new RsaEngine()); // PKCS1 OAEP paddings OaepEncoding eng = new OaepEncoding(new RsaEngine()); eng.Init(true, keys); int length = plainTextBytes.Length; int blockSize = eng.GetInputBlockSize(); List<byte> cipherTextBytes = new List<byte>(); for (int chunkPosition = 0; chunkPosition < length; chunkPosition += blockSize) { int chunkSize = Math.Min(blockSize, length - chunkPosition); cipherTextBytes.AddRange(eng.ProcessBlock( plainTextBytes, chunkPosition, chunkSize )); } return Convert.ToBase64String(cipherTextBytes.ToArray()); } static string decrypt(string cipherText) { byte[] cipherTextBytes = Convert.FromBase64String(cipherText); PemReader pr = new PemReader( (StreamReader)File.OpenText("./private.pem") ); AsymmetricCipherKeyPair keys = (AsymmetricCipherKeyPair)pr.ReadObject(); // Pure mathematical RSA implementation // RsaEngine eng = new RsaEngine(); // PKCS1 v1.5 paddings // Pkcs1Encoding eng = new Pkcs1Encoding(new RsaEngine()); // PKCS1 OAEP paddings OaepEncoding eng = new OaepEncoding(new RsaEngine()); eng.Init(false, keys.Private); int length = cipherTextBytes.Length; int blockSize = eng.GetInputBlockSize(); List<byte> plainTextBytes = new List<byte>(); for (int chunkPosition = 0; chunkPosition < length; chunkPosition += blockSize) { int chunkSize = Math.Min(blockSize, length - chunkPosition); plainTextBytes.AddRange(eng.ProcessBlock( cipherTextBytes, chunkPosition, chunkSize )); } return Encoding.UTF8.GetString(plainTextBytes.ToArray()); } } }