早在 ITAR 时代,就有一个 执行 Diffie-Hellman 密钥交换的流行签名:

#!/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)可能是无与伦比的,但也许 APL, ,可以对原始形式进行改进吗?请记住,e 和 m 值将非常大;为了加密安全,它们的大小均为 1024 位。

有帮助吗?

解决方案

对于那些不熟悉 Diffie-Helman 或 dc (或 Perl):如果您将其运行为“,则该程序会执行所有操作”program g x m", 是输出 gX(mod m),其中 g、x 和 m 以十六进制给出。例如。

./dh.pl 10 2 9
4

因为 10 是十六并且 102 是二百五十六,即 4 mod 9。

还有 dc 命令 16dio???|p 说:

  • 十六 到堆栈上,
  • d复制它,
  • 输入出栈结果的基数(16,十六进制),
  • 出栈结果的输出基数 (16),
  • 获取三行输入并执行它们(因此,如果这三行是三个数字 g、x、m,它们就会被推入堆栈),
  • 对 g 求幂X(模米),
  • p打印它。

鉴于 dc 有一个单字符命令“|“用于计算”gX(mod m)”这正是问题所在,我发现它不太可能在任何编程语言中得到改进。 dc 恰好是解决这个问题的工具;将编程语言与正确的工具进行比较是没有争议的。(例如。任何常见的编程语言都需要两个以上的字符来列出目录中的文件,而“ls“只有 2。)

也就是说,我注意到 dc -e '16dio???|p' 似乎希望我在三个不同的行中输入数字(至少在 dc 我这里有),所以它 可以改进 到可以在同一行处理所有这些的东西:-)

dc -e '16dio?|p'

其他提示

我非常怀疑任何东西都会超越现代直流版本!这是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