RSA. Применить полученные ключи к считанному массиву байтов - C#
Формулировка задачи:
Здравствуйте, тем на данному вопросу много,но так и не разобрался. Суть:реализация шифрования/дешифрования файла любого типа(jpeg,txt,exe). Генерация пар:открытый/закрытый ключ(E,N)&(D,N), выполнена.(24 битные ключи). Вопрос:не до конца понимаю как правильно "применить" полученные ключи к считанному массиву байтов( блоки по 3 байта).
//генерация ключей,если нужна.
int P = 0, Q = 0, N = 0, F, D, E;
public string path_to_encrypt_file;
private void button1_Click(object sender, EventArgs e) // генерация ключей пользователя А
{
Random rnd = new Random();
do
{
P = rnd.Next(128, 255); // генерация 8 битного числа
} while (IsPrime(P));
do
{
Q = rnd.Next(32768, 65535); // генерация 16 битного числа
} while (IsPrime(P));
textBox1.Text = Convert.ToString(P) + " " + Convert.ToString(Q);
N = P * Q;
F = (P - 1)*(Q - 1);
do
{
D = rnd.Next(2, F - 1);
} while (IsPrime(D)); // если D простое,оно взаимнопростое с F
E = GenerationOfD(D, F); // генерация Е по формуле e*d mod F=1
}
public static bool IsPrime(int A) //Проверка на простоту
{
for(int i=2;i<Math.Sqrt(A)+1;i++)
if ((A % i) == 0) return true;
return false;
}
public static int GenerationOfD(int D, int F)
{
int E = 0; int Res = 0;
for(E=1;;E++)
{
Res = (E *D) % F;
if (Res == 1) break;
}
return E;
}
public static int ModPow(int a, int b, int c) // А число возводимое в степень, Б степень, С остаток от деления. // Метод ModPow ручками
{
int d = a % c, e = a % c;
for (int i = 0; i < b - 1; i++)
{
d = d * e % c;
}
return d;
}Решение задачи: «RSA. Применить полученные ключи к считанному массиву байтов»
textual
Листинг программы
private void button3_Click(object sender, EventArgs e)
{
FileStream fl = new FileStream(path_to_encrypt_file,FileMode.Open,FileAccess.Read);
int len = (int)fl.Length;
string path2 = path_to_encrypt_file;
byte[] buf = new byte[len];
byte[] bufen = new byte[len];
int step = 0;
int encord = 0;
while (len > 0)
{
if (step >= len) break;
int n = fl.Read(buf, step, 3);
if (n == 0)
break;
step += n;
len -= n;
step -= 3;
encord = BitConverter.ToInt32(buf, step);
encord = ModPow(encord, D, N);
bufen[step] = Convert.ToByte(encord);
step += 3;
}
path2 += "encoded";
File.WriteAllBytes(path2, bufen);
fl.Close();
}