static void Main(string[] args) { Console.WriteLine("** RSA **"); var rsaKey = RsaKey.CreateRsaKey(); var plaintext = "Hello world 123456789/*-+!@#$%^&*()-=_+"; var publicKey = rsaKey.PublicKey; var privateKey = rsaKey.PrivateKey; //var exponent = rsaKey.Exponent; //var modulus = rsaKey.Modulus; var encrypted = RSAEncrypter.RSAEncrypt(publicKey, plaintext, RSAEncryptionPadding.OaepSHA512); var decrypted = RSADecrypter.RSADecrypt(privateKey, encrypted, RSAEncryptionPadding.OaepSHA512); Console.WriteLine("Encrypted: " + encrypted); Console.WriteLine("Decrypted: " + decrypted); //Console.WriteLine("publicKey: {0} privateKey: {1}", publicKey, privateKey); Console.ReadKey(); }
static void Main(string[] args) { RSACryptoServiceProvider signatureRSA = new RSACryptoServiceProvider(); // Генерация RSA ключей RSAParameters publicRSAKeyInfo, privateRSAKeyInfo; try { using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) { Byte[] buffer = RSA.ExportParameters(true).D; string converted_D = BitConverter.ToString(buffer).Replace("-", "|"); buffer = RSA.ExportParameters(true).Modulus; string converted_N = BitConverter.ToString(buffer).Replace("-", "|"); Console.WriteLine("Ключевая пара RSA: \n\tD=" + converted_D + ",\n\tN=" + converted_N); publicRSAKeyInfo = RSA.ExportParameters(false); privateRSAKeyInfo = RSA.ExportParameters(true); } } catch (ArgumentNullException) { Console.WriteLine("RSA шифрование провалилось."); return; } if (args.Length != 1 && args.Length != 2) { Console.WriteLine("Ожидалось 1 или 2 аргумента"); return; } string fileContent = System.IO.File.ReadAllText(args[0]); byte[] sim_encrypted = { }; byte[] keyRijndael = { }; byte[] ivRijndael = { }; byte[] senderSignature = { }; byte[] originalSHA; // Шифруем документ с помощью симметричного шифрования AES(Rijndael) // Ключ шифрования AES шифруем с помощью RSA, используя его публичный ключ // Также генерируем цифровую подпись try { string original = fileContent; using (RijndaelManaged myRijndael = new RijndaelManaged()) { myRijndael.GenerateKey(); myRijndael.GenerateIV(); sim_encrypted = RijndaelEncrypter.EncryptStringToBytes(original, myRijndael.Key, myRijndael.IV); Console.WriteLine("Исходный документ: {0}", original); keyRijndael = RSAEncrypter.RSAEncrypt(myRijndael.Key, publicRSAKeyInfo, false); ivRijndael = RSAEncrypter.RSAEncrypt(myRijndael.IV, publicRSAKeyInfo, false); // Генерация цифровой подписи originalSHA = SHA.GetSHA(Encoding.UTF8.GetBytes(original)); senderSignature = RSAEncrypter.RSAEncrypt(SHA.GetSHA(Encoding.UTF8.GetBytes(original)), signatureRSA.ExportParameters(false), false); } } catch (Exception e) { Console.WriteLine("Error: {0}", e.Message); return; } // Проверка цифровой подписи byte[] encryptedSignature = RSADecrypter.RSADecrypt(senderSignature, signatureRSA.ExportParameters(true), false); if (!Enumerable.SequenceEqual(encryptedSignature, originalSHA)) { Console.WriteLine("Ненастоящая цифровая подпись"); return; } // Вначале расшифровываем параметры симметричного шифрования с помощью закрытого ключа. // А потом используем полученный ключ AES для расшифровки основного текста string roundtrip = RijndaelDecrypter.DecryptStringFromBytes(sim_encrypted, RSADecrypter.RSADecrypt(keyRijndael, privateRSAKeyInfo, false), RSADecrypter.RSADecrypt(ivRijndael, privateRSAKeyInfo, false)); Console.WriteLine("Расшифрованный текст: {0}", roundtrip); }