2015-08-14 4 views
0

Я выполняю криптографическую программу на Python.Решение системы квадратичных уравнений

Он состоит в чтении случайной фразы, например HELLO. Затем он присваивает это соответствующие значения ASCII, как:

H = 72, E = 79. 

Тогда, используя теорему Пифагора, он создает два числа C1 и C2, как это:

C1 = sqrt(A^2 + (A+B)^2); 
C2 = sqrt(B^2 + (A+B)^2) 

, где в этом случае A = H и B = E. Это будет часть шифрования, но у меня возникают проблемы с решением системы, которая будет действовать как дешифратор.

Как я могу решить эту систему с помощью python?

C1 = sqrt(A^2 + (A+B)^2); 
C2 = sqrt(B^2 + (A+B)^2); 

Конечно, известны только C1 и C2.

Нужен ли мне новый модуль? Который из?

+3

Вам не нужен Python для решения этой проблемы. Вам нужен кусочек бумаги и немного навыков математики в школе, чтобы преобразовать его в формулы для A и B. После этого вы можете написать эти формулы в Python -> PROFIT! –

+0

На самом деле я пытался решить A и B, но я не мог, поэтому я думаю о цифровом решении. –

+0

Могут ли потенциальные злоумышленники получить доступ к значениям C1/2? Потому что, если вы действительно говорите только об использовании двух символов в качестве ключа, это означает, что (1) вы можете перенаправить решение без какой-либо сложной математики, это займет всего 64 000 с лишним попыток; и (2) так может нападающий. – paxdiablo

ответ

1

Если вы говорите об использовании двух символов для шифрования, это не очень хорошая идея.

Это дает только 65536 возможных вариантов (было упомянуто два символа ASCII, но я буду использовать полный 8-битный октет, поэтому 256 умножается на 256), достаточно просто переустановить это. Во-первых, мы знаем, что каждое значение A и B создает уникальную пару C1/C2, согласно следующей программе, которая не генерирует дубликатов:

lookup = {} 
for a in range(256): 
    for b in range(256): 
     c1s = a*a + (a+b)*(a+b) 
     c2s = b*b + (a+b)*(a+b) 
     lkey = "%d:%d"%(c1s,c2s) 
     lookup[lkey] = 1 
print(len(lookup))     # gives 65536 (256 squared) 

Кроме того, так как A и B целые числа, так что тоже будет C12 и C22.

Таким образом, первый шаг заключается в разработке квадратов значений вы данных (поскольку sqrt является потенциально дорогостоящей операцией), принимая во внимание возможность точечных неточностей плавающими:

c1s = int(c1 * c1 + 0.1) 
c2s = int(c2 * c2 + 0.1) 

Тогда, просто грубая силу решения:

for a in range(256): 
    for b in range(256): 
     if c1s != a*a + (a+b)*(a+b): 
      continue 
     if c2s == b*b + (a+b)*(a+b): 
      print(a,b) 
      sys.exit(0) 
print("No solution") 

на моей машине, ища медленным решение (как a и b набор до 255), он занимает весь smidgeon за шесть ч undredths секунды.

Но вы должны иметь в виду, что если злоумышленник имеет значения C1/C2, они также могут быстро получить результаты. И даже если они не делают, факт, что есть только возможности 64K, означает, что они могут попробовать каждое возможное значение чуть более чем на одну четверть часа. Поэтому я бы не использовал этот метод для хранения чего-нибудь ценного в течение очень долгого времени :-)

+0

Но никто не узнает, как рассчитать C1 или C2. Это только между вами и мной. Btw, мне удается решить уравнения для B, это просто заменить его в одном из уравнений. Не беспокойтесь о том, что я зашифрую. : D Спасибо! –

+0

Кроме того, результат шифрования будет выглядеть примерно так: 23.34,23.67,12.34,45,66 ... И так далее, это C1 и C2 каждой пары символов. Единственный способ расшифровать его - знать, что такое покровитель, используемый для получения C1 и C2 на первом месте. –

+0

@ Карлос, основываясь на ваших комментариях, кажется, немного информации отсутствует. Как было сказано, относительно легко восстановить A и B из C1 и C2 даже в парах, поэтому я должен предположить, что вы каким-то образом используете эти значения для шифрования открытого текста (вместо того, чтобы использовать HELLO в качестве открытого текста). Как это делается? – paxdiablo

Смежные вопросы