简化的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测试向量?关于发布使用随机数据的算法的已知答案测试的最后一点思考:测试向量在实现算法的不同方法上是否稳定?只要考虑一些优化,将一个随机抽取调用移动到另一个调用之前,那么输出不会有所不同吗?还有其他方法来验证实现的正确性吗?

一如既往,快乐黑客!

EdDSA和Ed25519进入IETF

在与Niels Möller会面后FOSDEM公司并了解他的版本25519在中实现GNU Nettle公司,我开始对Ed25519进行简单的实现描述。目标是帮助各种IETF公司(和非IETF)协议增加了对Ed25519的支持。正如许多人所知,打开SSH保密性卫兵在最新版本中支持Ed25519,并且OpenBSD(打开BSD)自从v5.5 2014年5月发布与Ed25519签订。这个描述EdDSA和Ed25519的论文不针对实现者,也不包括测试向量。我觉得还有改进的余地,可以让更多人接受。

我们的工作在IETF上发布为草案-josefsson-edsa-ed25519我们正在征求实施者和其他人的反馈。请帮助我们纠正文件中的错误,并指出缺少的内容。例如,可以做什么来帮助实现者避免副通道泄漏?我不认为该草案是优化和无副通道实现的地方,也不是关于无副通道编程的全面教程的地方。但也许有一个中间立场,我们可以说一些比我们今天能做的更多的话。欢迎创意!

骰子随机数

使用熵生成数据,或随机数生成,是一个众所周知的难题。许多加密算法和协议都假设随机数据可用。有许多实现,包括/BSD和Linux内核中的dev/random以及GnuTLS或OpenSSL等加密库中的API调用。通过阅读源代码可以了解它们的工作原理。数据的质量取决于实际硬件和可用的熵源——RNG实现本身是确定性的,它只是用一组数据源的假定熵转换数据,然后生成输出流。

在某些情况下,例如在虚拟化环境或小型嵌入式系统上,很难找到足够数量的源。对于你得到的数据中有多少熵,几乎没有任何下限估计。您可以通过使用单独的硬件RNG来改善RNG问题,但这其中存在部署复杂性,从理论上讲,这是一个问题,即您只需将良好的随机数据从一个系统移动到另一个系统即可获得。(还有更多关于硬件RNG的内容,我将留到以后再说。)

出于某些目的,可用的解决方案并没有给我带来足够的信心,因为它的复杂性很高。复杂性往往是安全的敌人。在加密讨论中,我半开玩笑地说,关于我唯一信任的RNG过程,是一个我可以用简单的语言解释并在纸笔帮助下实现自己的过程。通常,我使用滚动常规六面的示例骰子(D6)多次。我最近一直在更详细地思考这个过程,觉得是时候把它写下来了,不管它看起来有多傻。

一个有六个边的模具产生一个介于1和6之间的随机数。直观地说服自己它没有明显的偏见是相对直接的:检查它看起来是否对称,并进行一些试验。通过反复滚动骰子,您可以在时间允许的情况下生成所需的数据量。

我不了解足够的热力学知识,不知道如何估计物理过程的熵,所以我需要求助于直观的论点。很容易假设一个骰子产生2.5比特的熵,因为log_2(6)~=2.584。至少我发现直觉上很容易说服自己,2.5位是一个上限,在我看来,没有比看掷骰子结果更大的熵了。不过,我怀疑大多数骰子都有某种形式的缺陷,这导致了在大量掷骰时可以发现的非常小的偏差。因此,我建议大多数D6的平均熵略低于2.5位。此外,为了建立一个下限,直观地说,似乎很容易相信,如果特定D6的熵接近2位,而不是2.5位,那么通过试卷可以很快地看到这一点。这是假设模具中没有复杂的逻辑和机械来隐藏模式。戴上锡箔帽,考虑一个带有电源和机械装置的模具,它可以决定落在哪个数字上:它可以生成看起来像接缝的随机图案,其中仍然包含0位熵。例如,假设构建一个D6来生成模式4、1、4、2、1、3、5、6、2、3、1、三、6、3、五、6、4……这意味着它生成0位熵(将数字与sqrt(2)的小数进行比较)。其他因素也可能影响输出中的熵量,如果你只是从桌子上方1厘米/1英寸直接放下模具,就可以考虑了。也可能还有其他原因导致掷骰子中的熵更有限,直觉论证有时是完全错误的!以本次讨论为背景,为了简单起见,接下来,我将假设我的D6在每次滚动时产生2.5位的熵。

我们需要计算出需要滚动多少次。我通常需要一个128位的随机数(16字节)。加密算法和协议通常使用power-of-2数据大小。64位熵导致暴力攻击,需要大约2^64次测试,对于许多操作,这在当今的计算能力下是可行的。使用当今的技术,执行2^128操作似乎是不可能的。要使用每卷产生2.5位熵的D6生成128位熵,需要执行ceil(128/2.5)=52卷。

我们还需要设计一种算法,将D6输出转换为结果的128位随机数。虽然从理论上看,让D6输出的每一位都影响128位随机数的每一个位是很好的,但这对于笔和纸来说变得很难做到。更新:这篇博客帖子曾经在这里包含了一个算法,但它显然是错误的(写得太晚了……)所以我删除了它——我需要回来进一步思考这个问题。

那么下一步是什么?取决于您想将随机数据用于什么目的。出于某些目的,例如生成一个高质量的128位AES密钥,我就完成了。钥匙就在那里。要生成高质量的ECC私钥,您需要生成更多的随机性(匹配ECC曲线大小),并执行一些EC操作。不幸的是,要生成高质量的RSA私钥,您需要更多的随机性,在这种情况下,使用此过程生成的强大128位种子来实现PRNG更为合理。后一种方法是通用的解决方案:使用骰子方法生成128位数据,然后播种您选择的CSPRNG以快速获得大量数据。这些步骤有些技术性,并且您会丢失纸和笔属性,但与验证您从RNG实现中获得的高质量熵相比,实现这些部分的代码更容易验证。

便携式对称密钥容器(PSKC)库

过去几周,我一直在努力实施副本请求6030也称为便携式对称密钥容器(PSKC)。那么什么是PSKC?便携式对称密钥容器(PSKC)格式用于向加密设备或软件传输和提供对称密钥。

我的PSKC库允许您解析、验证和生成PSKC数据。PSKC库是用C编写的,使用库XML,并根据LGPLv2型+实际上,PSKC最常用于在个性化机器和OTP验证服务器之间传输OATH HOTP/TOTP设备(和其他OTP设备)的密钥。昨天我发布了2.0.0版属于OATH工具包使用新的PSKC库。查看我之前的OATH工具包简介作为背景。OATH Toolkit是为Debian/Uubuntu打包的,我希望很快更新包以包含libpskc/psktool。

要了解PSKC数据格式,请考虑最有效的PSKC最小数据:

<?xml版本=“1.0”?><KeyContainer xmlns=“urn:ietf:params:xml:ns:keyprov:pskc”Version=“1.0”><密钥包/></KeyContainer>

该库可以很容易地用于将PSKC数据导出为逗号分隔值(CSV)格式,实际上PSKC库教程最后以这个为例。已完成API文档用于图书馆。命令行工具对最终用户更有用,允许您解析和检查PSKC数据。下面是如何使用它解析一些PSKC数据的示例,首先我们显示文件“PSKC-figure2.xml”的内容:

<?xml version=“1.0”encoding=“UTF-8”?><KeyContainer版本=“1.0”Id=“示例ID1”xmlns=“urn:ietf:params:xml:ns:keyprov:pskc”><密钥包><密钥Id=“12345678”算法=“urn:ietf:params:xml:ns:keyprov:pscc:hotp”><发卡行>发卡行-A<数据><秘密><PlainValue>MTIzNA==</PlainValue></秘密></数据></键></KeyPackage></KeyContainer>

以下是如何解析和漂亮打印PSKC数据:

茉莉@拿铁:~$pskctool-c pskc-fiure2.xml便携式对称密钥容器(PSKC):版本:1.0Id:示例ID1密钥包0:设备信息:密钥:编号:12345678发行人:发行人-A算法:urn:ietf:params:xml:ns:keyprov:pscc:hotp密钥密钥(base64):MTIzNA==茉莉@拿铁:~$

有关更多信息,请参阅OATH工具包网站PSKC图书馆手册.