Вопрос

Еще в эпоху ITAR существовал популярный sig, который выполнял обмен ключами Диффи-Хеллмана:

#!/usr/bin/perl -- -export-a-crypto-system-sig Diffie-Hellman-2-lines
($g,$e,$m)=@ARGV,$m||die"$0 gen exp mod\n";print`echo "16dio1[d2%Sa2/d0<X+d
*La1=z\U$m%0]SX$e"[$g*]\EszlXx+p|dc`

С современным постоянным током это может быть немного сокращено до:

dc -e '16dio???|p'

В то время как современная форма dc с командой модульного возведения в степень ('|' вычисляет g ^ e % m посредством эффективного экспоненциального удвоения), вероятно, непобедима, за исключением, возможно, АПЛ, можно ли улучшить исходную форму?Имейте в виду, что значения e и m будут очень большими;они оба будут иметь размер порядка 1024 бит каждый для обеспечения криптографической безопасности.

Это было полезно?

Решение

Для тех, кто не знаком с Диффи-Хелманом или dc (или Perl):все, что делает программа, если вы запускаете ее как "program g x m", является результатом gx(mod m), где g, x и m заданы в шестнадцатеричном формате.Например.

./dh.pl 10 2 9
4

потому что 10 - это шестнадцать и 102 равно двумстам пятидесяти шести, что равно 4 мод 9.

И тот dc команда 16dio???|p говорит:

  • толкать шестнадцать в стопку,
  • dвозвысьте это,
  • установленный input radix (основание) в результате извлечения стека (16, шестнадцатеричный),
  • установленный output radix для результата выталкивания стека (16),
  • получите три строки ввода и выполните их (таким образом, если эти три строки представляют собой три числа g, x, m, они будут помещены в стек).,
  • выполните возведение в степень gx(mod m),
  • pочисти его.

Учитывая , что dc имеет односимвольную команду "|" для вычислений "gx(mod m)" в чем именно и заключается проблема, я нахожу крайне маловероятным, что ее можно улучшить на каком-либо языке программирования. dc просто так получилось, что это инструмент именно для решения этой проблемы;это не соревнование, сравнивающее язык программирования с правильным инструментом.(Например.любому распространенному языку программирования потребуется более двух символов для перечисления файлов в каталоге, в то время как "ls" это всего лишь 2.)

Тем не менее, я отмечаю, что dc -e '16dio???|p' кажется, хочет, чтобы я ввел числа в трех разных строках (по крайней мере, на dc У меня есть здесь), так что это может быть улучшен к чему-то, что может обрабатывать их все в одной строке :-)

dc -e '16dio?|p'

Другие советы

Я очень сомневаюсь, что что-нибудь превзойдет современную версию DC! Вот Python:

def f(g,x,m):
 def h(n):return int(`n`,16)
 return h(g)**h(x)%h(m)

Это не будет работать в Python 3.0, так как мы прекратил обратные кавычки .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top