Атаки на эллиптические кривые
Скачать 191.67 Kb.
|
= [u]Db = ({0}, {1}) ", x3, y3) Do While True ''Шифруем Dim flaf3 As Boolean = False Dim shifr As String For i = n To dlina_p - 1 + n If n >= dlina_file Then Exit Do If flaf3 Then shifr += soobsh(i) Else shifr = soobsh(i) flaf3 = True End If Next l += Str(shifr * x3 Mod p) n += dlina_p Loop ''Передаем получателю R и l Console.WriteLine("Шифровка {0}", l) ''Расшифровка ''Умножаем открытый ключ на R Console.WriteLine("Пробуем расшифровать") Console.WriteLine() x1 = rx y1 = ry udvoenie(x1, y1) For i = 0 To Cb - 3 slojenie(x1, y1, x3, y3) Next Dim pl As Integer = 0 Do While True If pl * x3 Mod p = 1 Then Exit Do Else pl += 1 End If Loop Do While True ''Шифруем Dim flaf3 As Boolean = False Dim shifr As String For i = n To dlina_p - 1 + n If n >= dlina_file Then Exit Do If flaf3 Then shifr += l(i) Else shifr = l(i) flaf3 = True End If Next m += Str(shifr * x3 Mod p) n += dlina_p Loop start = start + start * 0.2 Console.WriteLine("Время для расшифровки {0}", start) Console.WriteLine("Расшифрованное сообщение - {0}", m) Console.ReadKey() '' Console.Clear() '' '' Шифр Эль-Гамеля Dim mlg As Integer = 5 Dim plg As Integer Dim glg As Integer Console.WriteLine("Введите простое число") Console.Write("p=") plg = Console.ReadLine() Dim flag As Boolean flag = True Dim rez As Integer Dim x As Integer For i = 2 To plg - 1 If plg Mod i = 0 Then Console.WriteLine("Это не простое число") Next flag = False Exit For End If Console.WriteLine("Введите любое число") Console.Write("g=") glg = Console.ReadLine() Console.WriteLine("Введите число 1 x = Console.ReadLine() Console.WriteLine() Console.WriteLine("Вычисляем y = g^x mod p") Console.Write("y=") rez = (glg ^ x) Mod plg Console.WriteLine(rez) Console.WriteLine() Console.WriteLine("Открытым ключем является тройка ({0},{1},{2})", plg, glg, rez) Dim klg As Integer Console.WriteLine() Console.WriteLine("Введите число 1 klg = Console.ReadLine() Dim alg As Integer Console.WriteLine("Вычисляем a = g^k mod p") Console.Write("a=") alg = (glg ^ klg) Mod plg Console.WriteLine(alg) Dim blg As Integer Console.WriteLine("Вычисляем b = y^k * M mod p") Console.Write("b=") blg = ((rez ^ klg) * mlg) Mod plg Console.WriteLine(blg) Console.WriteLine("Пара ({0},{1}) является шифротекстом", alg, blg) ''Расшифровываем Console.WriteLine("Пробуем расшифровать") Dim ilg As Integer = 0 Dim f As Integer = alg ^ x Do While True If ilg * f Mod plg = 1 Then Exit Do Else ilg += 1 End If Loop mlg = (blg * ilg) Mod plg Console.WriteLine("Было зашифровано сообщение '{0}'", mlg) Console.ReadKey() '' атака на алгоритм эльгамаля ''Допустим что мы знаем пораждающую точку и эллиптическую кривую '' Console.Clear() Console.WriteLine("атака на алгоритм эль-гамаля") start = Timer tim.Start() Dim flag1 As Boolean = False Dim x4, x5 As Integer x4 = rx x5 = ry Do While True Dim t As Integer = 0 Do While True If t * rx Mod p = 1 Then Exit Do Else t += 1 End If Loop If (l * t) Mod p = m Then Console.WriteLine("Ура") Console.WriteLine("rx={0},ry={1},шифровка - {2}, зашифрованно было - {3}", rx, ry, l, m) Else finish = Timer start = finish - start Console.WriteLine("Время на взлом {0}", start) tim.Stop() Console.ReadKey() Exit Do If flag1 = True Then slojenie(x4, x5, rx, ry) rx = x3 ry = y3 Else udvoenie(rx, ry) rx = x3 ry = y3 flag1 = True End If End If Loop ''Алгоритм Диффи-Хельмана Dim cb1 As Integer Dim cb2 As Integer Dim kdx As Integer Console.Clear() Console.WriteLine("Алгоритм Дифии-Хельмана") Console.WriteLine("Введите сообщение") m = Console.ReadLine Console.Clear() Console.WriteLine("Алгоритм Дифии-Хельмана") Console.WriteLine("Было выбрано сообщение для кодирования m={0}", m) Console.WriteLine("Параметры эллиптической кривой a={0}, b={1}, p={2} q={3}, G({4},{5})", a, b, p, inv, Gx, Gy) Console.WriteLine() ''Вводим секретный ключ Do While True q={0}", inv) Console.WriteLine("Введите секретный ключ Cb1 для пользователя 1, 0 If cb1 < inv And 0 < cb1 Then Console.WriteLine("Выбран секретный ключ Cb1={0}", cb1) Exit Do Else Console.WriteLine("Вы ввели недопустимые значени") Console.WriteLine() End If Loop Do While True q={0}", inv) Console.WriteLine("Введите секретный ключ Cb2 для пользователя 2, 0 If cb2 < inv And 0 < cb2 Then Console.WriteLine("Выбран секретный ключ Cb2={0}", cb2) Exit Do Else Console.WriteLine("Вы ввели недопустимые значени") Console.WriteLine() End If Loop ''Вычисляем открытый ключ udvoenie(Gx, Gy) For i = 0 To cb1 - 3 slojenie(Gx, Gy, x3, y3) Next Console.WriteLine("Открытый ключ Xa=({0},{1})", x3, y3) Dim h As Integer h = 29 Console.WriteLine() Do While True Console.WriteLine("Введите случайное число, 0 Console.WriteLine() If kdx < inv And 0 < kdx Then Console.WriteLine("Выбрано число k={0}", kdx) Exit Do Else Console.WriteLine("Вы ввели недопустимые значени") Console.WriteLine() End If Loop ''Вычисляем точку P udvoenie(Gx, Gy) For i = 0 To kdx - 3 slojenie(Gx, Gy, x3, y3) Next Console.WriteLine(" P=kG=({0},{1})", x3, y3) Dim rdx As Integer rdx = x3 Mod inv Console.WriteLine(rdx) Dim sdx As Integer sdx = (kdx * h + rdx * x3) Mod inv Console.WriteLine(sdx) Console.ReadKey() End Sub End Module |