id: Гость   вход   регистрация
текущее время 01:50 24/11/2020
создать
просмотр
ссылки

реализация шифра Вернама


Хочу представить сообществу свою программу – реализацию шифра Вернама (одноразовый блокнот) с дополнительными функциями. Программа написана на Python и может:

  • Генерировать ключи, используя функцию os.urandom()
  • Шифровать и расшифровывать данные
  • При шифровании добавлять в конец данных контрольную сумму (sha1) и проверять ее при расшифровании
  • Сжимать данные с помощью gzip или bzip2

Контрольная сумма нужна для зашиты от подмены в случае, когда злоумышленнику известна часть ключа/сообщения. Контрольная сумма и сжатие опциональны, по умолчанию программа добавляет контрольную сумму, если использовать сжатие, то sha1 добавляться уже не будет. При необходимости можно отключить оба варианта или использовать их вместе. Прилагается документация на русском и английском.
Размер – меньше 400 (четырехсот) строк.
Лицензия – MIT.
https://github.com/anton-tsyganenko/otppy
При привильном использовании и отсутствии закладок в ОС и интерпритаторе взлом абсолютно невозможен.


 
На страницу: 1, 2, 3 След.
Комментарии
— unknown (01/06/2014 20:36)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664

urandom не является источником экстрагированной физической энтропии, а является источником растянутой из коротких значений псевдоэнтропии → программа не является реализацией шифра Вернама.
— Anton_Tsyganenko (01/06/2014 21:08)   <#>
urandom не является источником экстрагированной физической энтропии, а является источником растянутой из коротких значений псевдоэнтропии

А насколько это надежно? Если его заменять, то на что? (радиоактивный распад не предлагать)
программа не является реализацией шифра Вернама.

Так вроде же нет спецификиций.
— unknown (01/06/2014 21:18, исправлен 01/06/2014 21:19)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664

Насколько надёжно что? urandom? Он дёргает мелкие куски энтропии и растягивает их в большую гамму. Поскольку гамма наверняка генерится за один раз, то она вся будет растянута из одного внутреннего состояния, образованного мелким фрагментов энтропии. Это надёжно, примерно как некий потоковый шифр, хотя и с большим внутренним состоянием и зависит от того, какой алгоритм реализован в os.urandom. В пределе это должно быть надёжно, как обычный 256-512-битовый шифр. Истинная случайность экстрагируется только постобработкой данных физических процессов.

— Гость (01/06/2014 21:35)   <#>
os.urandom в unix-системах берет случайные данные из /dev/urandom, в винде – CryptGenRandom(). Пост-обработка физических процессов недоступна большинству пользователей.
— Anton_Tsyganenko (01/06/2014 21:37)   <#>
Кстати, если ключ не очень случайный, сжатие поможет?
— Гость (01/06/2014 21:50)   <#>
Нет:

Contrary to a view in the I&C community, compression does not render data random, as can be seen from the case of votes, where the message space has very low entropy.


Да даже если б у вас стоял QRNG, дальше-то что? Нужно, чтоб одна и та же гамма была на обоих концах связи, а как вы её туда доставите? Добро пожаловать в QKD.
— Anton_Tsyganenko (01/06/2014 22:12)   <#>
Нужно, чтоб одна и та же гамма была на обоих концах связи, а как вы её туда доставите? Добро пожаловать в QKD.

Передать можно при личной встрече или в сейф-пакете. Только не надо говорить, что при личной встрече можно сразу передать и данные – передача ключа может осуществляться тогда, когда данных еще нет.
— Гость (01/06/2014 22:43)   <#>

Ну, если только так...
— ZAS (01/06/2014 22:59)   <#>
os.urandom в unix-системах берет случайные данные из /dev/urandom, в винде – CryptGenRandom().


Использование системной функции создает удобную универсальную лазейку. Достаточно перехватить вызов, и сразу видно сами случайные числа, а также какому процессу, в какой момент и в какой точке они понадобились.

http://www.zas-comm.ru
— Anton_Tsyganenko (01/06/2014 23:18)   <#>
Использование системной функции создает удобную универсальную лазейку. Достаточно перехватить вызов, и сразу видно сами случайные числа, а также какому процессу, в какой момент и в какой точке они понадобились.

Понятно, что если в системе есть закладки, трояны, кейлогеры и т.д., то каким бы не был хорошим алгоритм, он не спасет. Даже если получать случайные числа другим образом, троян может сделать дамп памяти. Предполагается, что используемая система надежна и в ваш монитор посторонние не смотрят.
— SATtva (02/06/2014 09:29)   профиль/связь   <#>
комментариев: 11552   документов: 1036   редакций: 4094
Вообще, реализация OTP (даже если это именно OTP, а не непонятно что, как в данном случае) — это что-то типа hello world: столь же элементарно, сколь и бессмысленно. То есть как абстрактная задача сойдёт, но выкладывать это в паблик по меньшей мере пошло.
— Anton_Tsyganenko (02/06/2014 13:15)   <#>
Да, изначально было just for fun. Хотя чем проще алгоритм и меньше программа, тем проще ее проверить. Понятно, что пока есть pgp, она вряд-ли будет пользоваться популярностью, но квантовый суперкомпютер рано или поздно будет сделан, и тогда расшифровка pgp-сообщений не составит труда.
В данном случае это OTP, хоть там и куча отсебятины, ключи используются только один раз.
— SATtva (02/06/2014 13:44)   профиль/связь   <#>
комментариев: 11552   документов: 1036   редакций: 4094
unknown выше написал, в чём главная проблема: источник материала для ключей — ГПСЧ, что превращает Вашу реализацию в тыкву. Хотя бы берите энтропию из /dev/random — даже с учётом всех его проблем и блокируемости чтения, такой вариант будет выглядеть более вменяемо.
— Anton_Tsyganenko (02/06/2014 16:32)   <#>
Можете объяснить разницу между /dev/random и /dev/urandom? А если для генерации ключей 2 раза использовать os.urandom, а потом xor-ить их между собой?
— unknown (02/06/2014 16:56)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664
Будет XOR соседних учатков гаммы, развёрнутой из одного и того же фрагмента энтропии, условного ключа.
На страницу: 1, 2, 3 След.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3