Криптосеть на базе решетки

Nov 14, 2021 13:57


Я как-то придумал эту идею и хотел реализовать на какой-то ролевой игре. Но так и не собрался.

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

Предлааемое решение - некая n+1 сторона привозит и продает руководителям этих n партий шифроблокноты. Блокноты - пронумерованы. И в каждом n (лучше n+m, есть несколько запасных блокнотов на случай компрометации или утраты) страниц.

Каждая страница представляет собой поворотную решётку 10x10 или 12x12. Соответсвенно, если мы хотим отправить письмо владельцу блокнота i (а список владельцев доверенная сторона-организатор сети распространяет по своим абонентам абсолютно открыто. Более того, если список сторон известен заранее. его можно прям на форзаце напечать, а там уже вопрос только в том, выкупила соответсвующая партия свой блокнот или нет), мы открываем i-тую страницу нашего блокнота и шифруем этой решеткой письмо.

Получаетель письма смотрит список абонентов, находит там нас (j) открывает j-тую страницу своего блокнота и расшифровыает посление.

n+1 сторона-организатор криптосети мамой клянется, что у неё нет копий решёток, содержащихся в проданных блокнотах.

n, кстати, может быть достаточно большим. Количество возможных решеток равно 4m2/4 где m - сторона квадрата, т.е для решетки 10x10 - 250. А число нужных для шифрования решеток (n2-n)/2. Так что можно еще и при генерации решеток спокойно выкидывать те, у которых расположение дырок не обеспечивает механической прочности или слишком много подряд идущих дырок, позволяющих увидеть кусок открытого текста.

Тут поскольку у любого участника сети есть как противники, так и союзники, а блокнот работает и с теми, и с другими, информация о компрометации блокнота скорее всего будет распространяться достаточно быстро.

А вот, собственно как можно нагенерировать кучу поворотных решеток

#!/usr/bin/env python3 import secrets SIZE = 10 def bits(random): for byte in random: m = int(byte) for n in range(4): yield m & 3 m = m >> 2 rand = secrets.token_bytes(int((SIZE*SIZE / 2 + 7) / 8)+1) matrix = [['.'] * SIZE for i in range(SIZE)] getbits = bits(rand) for i in range(SIZE >> 1): for j in range(SIZE >> 1): quarter = next(getbits) if quarter == 0: matrix[i][j] = 'x' elif quarter == 1: matrix[SIZE - j - 1][i] = 'x' # clockwise elif quarter == 2: matrix[SIZE - i - 1][SIZE - j - 1] = 'x' #upside down else: matrix[j][SIZE - i - 1] = 'x' # anticlockwise print('\n'.join([ ' '.join(matrix[i]) for i in range(SIZE)]))

This entry was originally posted at https://vitus-wagner.dreamwidth.org/2285841.html. Please comment there using OpenID. Now there are
comments

криптография

Previous post Next post
Up