Найти в Дзене
Life and freedom

Шифруем переписку с Python 3

Шифрование - обратимый процесс преобразования информации по заданному алгоритму и секретным параметрам, называемыми ключом. Нужно оно для защиты секретной информации от лишних глаз, ведения деловых переписок и т. д. В данной статье я расскажу о программе «Муравейник», реализующей одноимённый алгоритм шифрования. Построен он на двух других алгоритмах, о которых можно почитать в Википедии: шифре Виженера и алгоритме Блюм - Блюма - Шуба, позволяющего генерировать псевдослучайные числа.  Считаю некорректным копировать чужое, поэтому даю сразу ссылки на первоисточники: https://www.sites.google.com/site/kriptografics/sifr-vizenera https://www.intuit.ru/studies/courses/691/547/lecture/12383?page=3 Шифрование идёт следующей программой: P = 1298074214633706835075030044377087 Q = 162259276829213363391578010288127 M = P*Q x = 2 t = 0 y = 0 e = False def init(n):    global x    x = n def get():    global x    x = (x**2) % M def start():    global t    t += 1    if t >= len(pswrd):      raise

Шифрование - обратимый процесс преобразования информации по заданному алгоритму и секретным параметрам, называемыми ключом. Нужно оно для защиты секретной информации от лишних глаз, ведения деловых переписок и т. д.

В данной статье я расскажу о программе «Муравейник», реализующей одноимённый алгоритм шифрования. Построен он на двух других алгоритмах, о которых можно почитать в Википедии: шифре Виженера и алгоритме Блюм - Блюма - Шуба, позволяющего генерировать псевдослучайные числа. 

Считаю некорректным копировать чужое, поэтому даю сразу ссылки на первоисточники:

https://www.sites.google.com/site/kriptografics/sifr-vizenera

https://www.intuit.ru/studies/courses/691/547/lecture/12383?page=3

Шифрование идёт следующей программой:

P = 1298074214633706835075030044377087

Q = 162259276829213363391578010288127

M = P*Q

x = 2

t = 0

y = 0

e = False

def init(n):

   global x

   x = n

def get():

   global x

   x = (x**2) % M

def start():

   global t

   t += 1

   if t >= len(pswrd):

     raise ValueError

   init(pswrd[t])

def reset():

   global t

   t = 0

   init(pswrd[t])

def count():

   global y

   global e

   get()

   if x == pswrd[t]:

     y = x

     start()

     y = y + x

     e = True

   else:

     e = False

def shfl(l):

   global x

   global M

   global e

   l2 = []

   reset()

   

   while len(l) > 0:

     M = len(l)

     count()

     if e:

       d = l.pop(y)

     else:

       d = l.pop(x)

     l2.append(d)

   return l2

pswrd = [ord(i)%65536 for i in input('Введи пароль: ')]

init(pswrd[0])

Msg = [ord(i)%65536 for i in input('Сообщение: ')]

enc = []

for i in Msg:

   count()

   if e:

     enc.append(chr((i + (y)%65536) % 65536))

   else:

     enc.append(chr((i + (x)%65536) % 65536))

print(enc)

А расшифровка, соответственно, по обратным формулам и следующей ниже программой:

P = 1298074214633706835075030044377087

Q = 162259276829213363391578010288127

M = P*Q

T = 0

x = 2

t = 0

y = 0

e = False

def init(n):

   global x

   x = n

def get():

   global x

   x = (x**2) % M

def start():

   global t

   t += 1

   if t >= len(pswrd):

     raise ValueError

   init(pswrd[t])

def reset():

   global t

   t = 0

   init(pswrd[t])

def count():

   global y

   global e

   get()

   if x == pswrd[t]:

     y = x

     start()

     y = y + x

     e = True

   else:

     e = False

def get2():

   global x

   x = (x**2) % T

def start2():

   global t

   t += 1

   if t >= len(pswrd):

     raise ValueError

   init(pswrd[t])

def reset2():

   global t

   t = 0

   init(pswrd[t])

def count2():

   global y

   global e

   get2()

   if x == pswrd[t]:

     y = x

     start2()

     y = y + x

     e = True

   else:

     e = False

def decrypt(l):

   global T

   global x

   global y

   global e

   T = len(l)

   reset2()

   l2 = []

   i = 0

   while len(l2) < len(l):

     count()

     if e:

       l2.append([y, l[i]])

     else:

       l2.append([x, l[i]])

   l2.sort()

   l3 = []

   for i in l2:

     l3.append(i[1])

   return l3

pswrd = [ord(i)%65536 for i in input('Введи пароль: ')]

init(pswrd[0])

Msg = input('Шифровка: ')

if Msg.startswith('[') and Msg.endswith(']'):

   Msg = eval(Msg)

else:

   raise RuntimeError

enc = []

for i in Msg:

   count()

   if e:

     enc.append(chr((ord(i)+65536-(y)%65536)%65536))

   else:

     enc.append(chr((ord(i)+65536-(x)%65536)%65536))

print(''.join(enc))

А теперь пробуем:

Пароль: всемпривет

Шифровка:

Введи пароль: всемпривет

Сообщение: ку-ку

['鷾', '\ue253', '섭', 'к', '룢']

Расшифровка:

Введи пароль: всемпривет

Шифровка: ['鷾', '\ue253', '섭', 'к', '룢']

ку-ку

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