Cryptography 高尔夫代码:Diffie-Hellman钥匙交换

Cryptography 高尔夫代码:Diffie-Hellman钥匙交换,cryptography,code-golf,public-key,Cryptography,Code Golf,Public Key,在ITAR时代,有一个: 虽然使用模幂运算命令(“|”通过有效的指数倍增计算g^e%m)的现代dc形式可能是无与伦比的,但原始形式是否可以改进?请记住,e和m值将非常大;对于那些不熟悉Diffie Helman或dc(或Perl)的人来说,如果你以“program g x m”的形式运行程序,那么程序所做的一切都是输出gx(mod m),其中g、x和m是十六进制的。例如 ./dh.pl 10 2 9 4 因为10是16,102是256,也就是4模9 而dc命令16dio???p表示: 将十六

在ITAR时代,有一个:


虽然使用模幂运算命令(“|”通过有效的指数倍增计算g^e%m)的现代dc形式可能是无与伦比的,但原始形式是否可以改进?请记住,e和m值将非常大;对于那些不熟悉Diffie Helman或dc(或Perl)的人来说,如果你以“
program g x m
”的形式运行程序,那么程序所做的一切都是输出gx(mod m),其中g、x和m是十六进制的。例如

./dh.pl 10 2 9
4
因为10是16,102是256,也就是4模9

dc
命令
16dio???p
表示:

  • 十六个推到堆栈上
  • d复制它
  • input基数(base)设置为弹出堆栈的结果(16,十六进制)
  • 将输出基数设置为弹出堆栈的结果(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中无法像我们所做的那样工作。

也许它类似于阶乘高尔夫问题:APL以非常简洁的“?!”获胜这个解决方案的一个问题是,如果h是大的,这将需要非常非常长的时间。对于加密安全性,h的大小约为1024位。我将更新问题以包含此详细信息。如果您希望以多种语言实现,我建议您将此标记为
语言不可知
罗塞塔石
罗塞塔石
./dh.pl 10 2 9
4
def f(g,x,m):
 def h(n):return int(`n`,16)
 return h(g)**h(x)%h(m)