【问题标题】:Code golf: Diffie-Hellman key exchange代码高尔夫:Diffie-Hellman 密钥交换
【发布时间】:2010-09-29 13:22:26
【问题描述】:

在 ITAR 时代,有一个popular sig that performed Diffie-Hellman key exchange

#!/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'

虽然使用模幂命令('|' 通过有效的指数加倍计算 g^e % m)的现代 dc 形式可能是无与伦比的,而不是 APL,但可以改进原始形式吗?请记住,e 和 m 值将非常大;为了加密安全,它们都将在 1024 位的数量级上。

【问题讨论】:

  • 我建议用language-agnosticrosetta-stone 标记它
  • rosetta-stone 如果你想用多种语言实现。

标签: cryptography code-golf public-key


【解决方案1】:

对于那些不熟悉 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 mod 9。

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

  • 16 压入堆栈,
  • d复制它,
  • i输入基数(基数)设置为弹出堆栈的结果(16,十六进制),
  • o输出基数设置为弹出堆栈 (16) 的结果,
  • 获取三行输入并执行它们(因此,如果这三行是三个数字 g、x、m,它们将被压入堆栈),
  • 求幂 gx(mod m),
  • p打印它。

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

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

dc -e '16dio?|p'

【讨论】:

【解决方案2】:

我非常怀疑现代 dc 版本是否会超越任何东西!这是 Python:

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

它在 Python 3.0 中不起作用,因为我们已经 phased out reverse quotes

【讨论】:

  • 这个解决方案的一个问题是,如果 h 很大,这将花费非常非常长的时间。对于密码安全性,h 大约为 1024 位。我将更新问题以包含此详细信息。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多