经典McEliece加入IETF和OpenSSH

我的简化NTRU Prime的早期工作一直在进步。IETF文件SSH中的sntrup761已通过多个处理点。GnuPG的libgcrypt增加了对sntrup761的支持. The对sntrup761的libssh支持正在工作,但合并请求被阻塞,主要是因为没有时间调试为什么回归测试套件在非-sntrup761型与补丁相关的部件。

基础基于格的后量子算法具有一定的不确定性围绕着它,我觉得量子后的故事不仅仅是增加sntrup761型到实现。经典McEliece已经向我提到过几次了,我花了一些时间学习它,并做了一个非常棒的工作提议的ISO标准并已发布草案-josefsson-mceliece在IETF中以使该算法易于用于IETF社区。Classic McEliece的高质量实现已发布为图书馆信仰我一直支持扬·莫伊什的工作Debian的libmcelice包唉,它被卡在了ftp-master NEW队列用于两个月以上的手动审查。先决条件库MBlibcpucycles系列已在Debian中提供。

所有的文本编写和打包工作都为编写一些代码奠定了基础。当我添加对的支持时sntrup761型在里面libssh数据库,我开始熟悉OpenSSH代码库,所以很自然会返回OpenSSH,为Classic McEliece测试一个新的SSH KEX。DJB公司建议选择麦塞利6688128并将其与现有的X25519+sntrup761或者用普通的X25519型。而三种算法的混合X25519型,sntrup761型麦塞利6688128对于那些不想失去sntrup761所提供的好处的人来说,这只是一个简单的选择X25519型具有麦塞利6688128.中的关键合路器sntrup761x25519是一个简单的沙512我能说的唯一好处是,它的描述和实现都很简单,而且由于它已经部署好了,所以不会引发太多问题。

在拖延了几个月的编码之后,一旦我坐下来工作,只花了几个小时就成功建立了Classic McEliece SSH连接。我想在我开始之前,我的大脑已经把背景中的所有东西都整理好了。要复制它,请在Debian测试环境中尝试以下操作(我使用播客以获得清洁的环境)。

#podman run-it--rm debian:测试-极限apt更新apt dist-upgrade-yapt安装-y wget python3库dbytes-dev libcpucycles-dev gcc生成git autoconf libz-dev光盘~wget-q-O-https://lib.mceliece.org/libmcelice-20230612.tar.gz|焦油xfz-cd libmcelice-20230612/./配置进行安装ldconfig(ldconfig)光盘。。git克隆https://gitlab.com/jas/openssh-portable(https://gitlab.com/jas/openssh-portable)cd openssh-可移植git结帐jas/mcelice自动侦察./configure#verify“libmcelice支持:是”make#CC=“CC-DDEBUG_KEX=1-DDEBUG _KEXDH=1-DDEBUG-KEXECDH=1”

现在您应该有一个支持Classic McEliece的工作SSH客户端和服务器!通过运行验证支持./ssh-Q密钥它应该提到mcelice6688128x25519-sha512@openssh.com.

要让它打印大量调试输出,可以删除#角色在最后一行,但不要在生产中使用这样的内置。

您可以按如下方式进行测试:

./ssh-keygen-A#写入/usr/local/etc/ssh_host_。。。#通过运行以下命令设置基于公钥的登录:./ssh-keygen-t rsa-f~/.ssh/id_rsa-P“”cat~/.ssh/id_rsa.pub>~/.ssh/授权密钥adduser—系统sshdmkdir/var/空虽然正确;执行$PWD/sshd-p 2222-f/dev/null;已完成&./ssh-v-p 2222 localhost-o Kex算法=mcelice6688128x25519-sha512@openssh.com日期

在客户端上,您应该看到如下输出:

OpenSSH_9.5p1,OpenSSL 3.0.11 2023年9月19日...debug1:SSH2_MSG_KEXINIT已发送调试1:SSH2_MSG_KEXINIT已接收调试1:kex:算法:mcelice6688128x25519-sha512@openssh.comdebug1:kex:主机密钥算法:ssh-ed25519调试1:kex:server->客户端密码:chacha20-poly1305@openssh.comMAC:压缩:无调试1:kex:client->服务器密码:chacha20-poly1305@openssh.comMAC:<隐式>压缩:无debug1:需要SSH2_MSG_KEX_ECDH_REPLY调试1:收到SSH2_MSG_KEX_ECDH_REPLYdebug1:服务器主机密钥:ssh-ed25519 SHA256:YognhWY7+399J+/V8eAQWmM3UFDLT0dkmoj3pIJ0zXs...debug1:主机“[localhost]:2222”已知,并且与ED25519主机密钥匹配。debug1:在/root/.ssh/known_hosts:1中找到密钥debug1:134217728块后重新键入调试1:SSH2_MSG_NEWKEYS已发送debug1:需要SSH2_MSG_NEWKEYSdebug1:收到SSH2_MSG_NEWKEYS调试1:在134217728块之后重新键入...调试1:发送命令:date调试1:保证:分叉调试1:permanently_set_uid:0/0环境:USER=根LOGNAME=根HOME=/root路径=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/binMAIL=/var/MAIL/root外壳=/bin/bashSSH_CLIENT=::1 46894 2222SSH_连接=::1 46894::1 2222debug1:client_input_channel_req:通道0 rtype退出状态回复0调试1:client_input_channel_req:channel 0 rtypeeow@openssh.com回复012月9日星期六22:22:40 UTC 2023debug1:通道0:空闲:客户端会话,nchannels 1传输:发送1048044,接收3500字节,0.0秒每秒字节数:发送23388935.4,接收78108.6debug1:退出状态0

请注意kex:算法:mcelice6688128x25519-sha512@openssh.com输出。

网络带宽使用情况如何?下面是一个完整的SSH客户机连接的比较,例如上面登录、打印日期和注销的连接。普通25519平方米大约7kb,X25519型具有sntrup761型大约9kb,并且麦塞利6688128具有X25519型约为1MB。是的,Classic McEliece有很大的密钥,但对于许多环境来说,用于会话建立的1MB数据几乎不引人注目。

./ssh-v-p 2222 localhost-oKexAlgorithms=curve25519-sha256 date 2>&1|grep^已传输传输:发送3028,接收3612字节,0.0秒./ssh-v-p 2222本地主机-oKex算法=sntrup761x25519-sha512@openssh.comdate 2>&1|grep^已转移传输:发送4212,接收4596字节,0.0秒./ssh-v-p 2222本地主机-oKex算法=mcelice6688128x25519-sha512@openssh.comdate 2>&1|grep^已转移传输:发送1048044,接收3764字节,0.0秒内

那么会话建立时间呢?

日期;i=0;测试$i-le 100时;这样做/ssh-v-p 2222 localhost-o KexAlgorithms=曲线25519-sha256日期>/dev/null 2>&1;i=`expr$i+1 `;完成;日期12月9日星期六22:39:19 UTC 20232023年12月9日星期六22:39:25 UTC#6秒日期;i=0;测试$i-le 100时;这样做/ssh-v-p 2222本地主机-oKex算法=sntrup761x25519-sha512@openssh.com日期>/dev/null 2>&1;i=`expr$i+1 `;完成;日期2023年12月9日星期六22:39:29 UTC12月9日星期六22:39:38 UTC 2023#9秒日期;i=0;测试$i-le 100时;这样做/ssh-v-p 2222本地主机-oKex算法=mcelice6688128x25519-sha512@openssh.com日期>/dev/null 2>&1;i=`expr$i+1 `;完成;日期12月9日星期六22:39:55 UTC 20232023年12月9日星期六22:40:07 UTC#12秒

我从未注意到添加sntrup761型,所以我很确定我也不会注意到这种增长。这一切都在继续我的笔记本电脑运行Trisquel所以,要慎重考虑,但至少幅度是明确的。

未来的工作项目包括:

量子后SSH快乐!

更新:将mceliece6688128_keypair调用更改为mceliece6688128f_keypair(即使用完全兼容的f变体)会导致McEliece的速度与sntrup761型在我的机器上。

2023-12-26年更新:初始IETF文档草案-josefsson-ssh-mceliece-00出版。

简化的NTRU Prime sntrup761加入IETF

这个打开SSH项目增加了对混合动力车的支持优化的NTRU Prime量子密钥后封装方法sntrup761型加强其基于X25519的违约版本8.5发布于2021-03-03虽然人们对后量子密码有很多讨论,但我的印象是,在过去两年中,它们的实施和部署速度有所放缓。为什么?不管答案是什么,我们都可以尝试协同更改,但奇怪的是,这些算法的IETF文档似乎缺失了一项工作。

在一些早期工作的基础上X25519/X448至SSH,在我花了一天时间阅读OpenSSH和微型SSH了解其工作原理的源代码。虽然我对最终密钥是如何从sntrup761/X25519秘密中派生出来的并不完全满意——这是对串联秘密的SHA512调用——但我认为这个构造应该得到更好的记录,为提高可信度或更好的设计铺平道路。此外,重复使用RFC5656第4条structs的规范更糟糕(一个不必要的规范性引用),但实现可能更简单。我已经发表了草案-josefsson-ntruprime-ssh-00在这里。这里的学分是扬·莫伊什TinySSH设计的早期的sntrup4591761x25519-sha512@tinyssh.org2018年,Markus Friedl于2019年将其添加到OpenSSH,Damien Miller于2020年将其更改为sntrup761。有谁能为这部作品的历史增添更多内容吗?

有一次我把我的xml2rfc很容易编写一个文档来描述sntrup761密钥封装机制和X25519密钥协商方法之间以非SSH方式的混合构造。我不知道这项工作是否有用,但它可以作为进一步研究的参考。我发表了草案-josefsson-ntruprim-hybrid-00在这里。

最后,基于Streamlined NTRU Prime的IETF文档怎么样?解释所有的细节,尤其是它背后的数学,将是一项巨大的努力。我开始这样做,但意识到停止解释是一种主观要求。如果我们不能假设读者了解格数学,那么像这样的文档是教授格数学的最佳场所吗?我选择了最简单的方法,只是简单介绍了算法,包括SageMath公司和C参考实现以及测试向量。IETF的观众很少理解数学,所以我认为最好把注意力放在网络和算法接口上。这里的一切都是由Streamlined NTRU Prime团队创建的,我只是稍微修改了一下,希望我不会破坏太多。我现在发表了草案-josefsson-ntruprime-streamlined-00在这里。

我维护IETF文件我的ietf-ntruprime GitLab页面,请随时打开合并请求或提出问题以帮助改进它们。

为了对代码的正常工作有信心,我最终准备了一个带有sntrup761的分支对于GNU(全球导航单元)-项目Nettle公司并已提交上游审查。我很不幸不得不理解和执行NIST的DRBG-CTR计算sntrup761已知答案测试,这真是一团糟。为什么确定性随机生成器支持重新播种?为什么它支持非完全熵推导?密钥大小与块大小的混淆是什么?可选参数是什么?有多个算法描述是什么?幸运的是我能够提取一个最小但有效的实现这很容易阅读。我找不到DRBG-CTR测试载体,有人吗?是否有人拥有不使用DRBG-CTR的sntrup761测试向量?关于发布使用随机数据的算法的已知答案测试的最后一点思考:测试向量在实现算法的不同方法上是否稳定?只要考虑一些优化,将一个随机抽取调用移动到另一个调用之前,那么输出不会有所不同吗?还有其他方法来验证实现的正确性吗?

一如既往,快乐黑客!