/ Published in: C#
Expand |
Embed | Plain Text
using System; using Emil.GMP; //from Emil.GMP.dll (class BigInt) using System.Collections.Generic; //for LIST using System.Text; class RSA { static void Main(string[] args) { /// 1. Генерируется случайные простые числа p и q /// 2. Вычисляется их произведение n = pq /// 3. Вычисляется значение функции Эйлера от числа n. /// 4. Выбирается целое число e, взаимно простое со значением функции fi /// часто выбирают равным 17, 257 или 65537 — простым числам, /// двоичное представление которых содержит лишь две единицы: /// 17 = 0x11, 257 = 0x101, 65537 = 0x10001 (простые числа Ферма). */ /// 5. Вычисляется число d мультипликативное обратное к числу e по модулю fi /// /// Пара P = (e,n) публикуется в качестве открытого ключа RSA /// Пара S = (d,n) играет роль секретного ключа RSA /* 2 */ BigInt n = p * q; Console.WriteLine("n = " + n); /* 3 */ BigInt fi = (p-1)*(q-1); Console.WriteLine("fi = " + fi); /* 4 */ string[] pre_e = {"17", "257", "65537", "18446744073709551617", "340282366920938463463374607431768211457"}; int i = rnd.Next(0, pre_e.GetLength(0)); /* 5 */ BigInt d = e.InvertMod(fi); Console.WriteLine("d = " + d); /// ПРОВЕРКА: string text = "котлеты подешевели?"; Console.WriteLine("Оригинальный текст: \'" + text + "\'"); foreach(char c in text) Console.WriteLine("Оригинальные цифры:"); foreach(BigInt bi in original) Console.Write(bi + " "); Console.WriteLine(); Console.WriteLine("Шифр:"); for (int ii = 0; ii < original.Count; ii++) { encripted.Add(original[ii].PowerMod(e, n)); Console.Write(encripted[ii] + " "); } Console.WriteLine(); Console.WriteLine("Расшифровка:"); for (int ii = 0; ii < original.Count; ii++) { decripted.Add(encripted[ii].PowerMod(d, n)); Console.Write(decripted[ii] + " "); } Console.WriteLine(); foreach(BigInt x in decripted) decripted_text.Append((char)x); Console.WriteLine("Расшифрованный текст: \'" + decripted_text + "\'"); } // static void Main(string[] args) } // class RSA // csc /nologo /r:Emil.GMP.dll RSA.cs && RSA.exe // C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 /** C:\downloads\RSA\CS>csc /nologo /r:Emil.GMP.dll RSA.cs && RSA.exe p = 61 q = 53 n = 3233 fi = 3120 e = 65537 d = 2753 Оригинальный текст: 'котлеты подешевели?' Оригинальные цифры: 1082 1086 1090 1083 1077 1090 1099 32 1087 1086 1076 1077 1096 1077 1074 1077 1083 1080 63 Шифр: 2611 1625 2839 1666 1862 2839 2380 1992 3039 1625 187 1862 3067 1862 2814 1862 1666 1804 3216 Расшифровка: 1082 1086 1090 1083 1077 1090 1099 32 1087 1086 1076 1077 1096 1077 1074 1077 1083 1080 63 Расшифрованный текст: 'котлеты подешевели?' */
Comments
Subscribe to comments
You need to login to post a comment.

блин. замени fi на n в шифровке и расшифровке!
rsa это не блочный шифр, вы не можете вот так взять и разбить сообщение на куски и зашифровать каждый кусок в отдельности. Таким образом вы ослабляете криптостойкость алгоритма. Информация в данном алгоритме представляет собой одно большое число, которое нужно возводить в степень по модулю.
Второе - в похожей либе(BigInteger) есть методы генерации простых чисел - их и надо использовать. 61 и 53 не годятся для целей шифрования.
Третье - небольшие числа, например 257 - тоже удар по криптостойкости алгоритма. А так же существует теорема о том, что не все числа ферма являются простыми, поэтому вы не можете вот так просто брать рандом от тех чисел, которые вы привели. Лучше берите статично 65537 - будет куда лучше.
В остальном - замечательно что оно работает. Я у себя пока не добился, но я все-таки пытаюсь сделать правильно (см. пункт 1).
У меня получилось вот так. Работает. Здесь используется либа biginteger.cs, 16-ричная строка, но я думаю не составит труда сначала конвертнуть в байт-сиквенс, а потом конвертнуть обратно. Обратите внимание - информация не делится на байты, здесь - информация воспринимается как огромное целое число. Шифрование открытой экспонентой и модулем, дешифрование - секретной и модулем.