Internet草稿 经典McEliece 2023年10月
约瑟夫松 2024年4月15日到期 [页码]
工作组:
网络工作组
Internet草稿:
草案-josefsson-mceliece-00
出版:
预期状态:
信息
到期:
作者:
S.Josefsson,预计起飞时间。

经典McEliece

摘要

本文档指定了Classic McEliece,一种特殊的加密算法家族。

关于本文档

在作为RFC发布之前,应删除此注释。

此文档的状态信息可在https://datatracker.ietf.org/doc/draft-josefsson-mceliece网站/.

此草稿和问题跟踪程序的来源可在https://gitlab.com/jas/ietf-mceliece网站.

关于下段备忘

本互联网草案完全按照BCP 78和BCP 79的规定。

Internet-Drafts是Internet工程任务的工作文档部队(IETF)。请注意,其他小组也可以分发工作作为Internet-Drafts的文档。当前Internet-Drafts的列表是https://datatracker.ietf.org/drafts/current网站/.

网络草稿是最长有效期为六个月的草稿文件并可随时由其他文件更新、替换或作废时间。使用Internet-Drafts作为参考是不合适的材料或引用它们,而不是作为“正在进行的工作”

此Internet草稿将于2024年4月15日到期。

目录

1前言

本文件是拟议ISO McEliece标准的转录版本。

Classic McEliece团队被视为本文档中文本的作者和所有者,包括(按字母顺序):

  • Daniel J.Bernstein,伊利诺伊大学芝加哥分校和鲁尔大学波鸿分校

  • 中国科学院董周

  • Carlos Cid、Simula UiB和冲绳科学技术研究所

  • 苏黎世联邦理工学院Jan Gilcher

  • Tanja Lange,埃因霍温理工大学

  • 苏黎世联邦理工大学Varun Maram

  • Ingo von Maurich,自我

  • 拉斐尔·米索茨基(Rafael Misoczki),谷歌

  • 鲁本·尼德哈根,中国科学院和丹麦南部大学

  • Edoardo Persichetti,佛罗里达大西洋大学

  • 克里斯蒂安·彼得斯,自我

  • 尼古拉斯·森德里尔(Inria Nicolas Sendrier)

  • 耶鲁大学Jakub Szefer

  • PQ Solutions Ltd.的岑荣哲海。

  • Martin Tomlinson,PQ Solutions Ltd.和普利茅斯大学

  • Wen Wang,耶鲁大学

2介绍

第一个基于代码的公钥加密系统(PKE)于1978年推出[麦克利埃塞].公钥指定随机二进制Goppa代码。密文是一个码字加上随机错误。私钥允许高效解码:从密文中提取码字,识别并消除错误。

McEliece系统被设计为单向(OW-CPA),这意味着攻击者无法有效地找到当随机选择码字时,来自密文和公钥的码字。的安全级别尽管45年来有几十份攻击文件,McEliece系统仍然非常稳定。这个最初的McEliece参数仅设计为2^64安全性,但系统很容易扩展到“过度杀伤力”针对计算机技术的进步,包括量子技术,提供充足安全余量的参数计算机。

McEliece系统促进了大量后续工作。其中一些工作得到了改进效率,同时明确维护安全:这包括尼德雷特提出的“双重”PKE,软件加速和硬件加速。

此外,现在已经知道如何有效地将OW-CPA PKE转换为IND-CCA2 KEM防止所有ROM攻击。在两种假设下,这种转换很严格,保持了安全级别McEliece PKE所满足的:首先,PKE是确定性的(即解密恢复所有随机性使用的);其次,PKE对有效密文没有解密失败。更好的是,最近的工作对于更广泛的攻击,即QROM攻击,实现了类似的紧密性。散列函数的风险-特定攻击可能比ROM或QROM攻击更快,可以通过选择经过仔细研究的高安全性“非结构化”散列函数。

经典McEliece将所有这些结合在一起。它是一种KEM,设计用于非常高安全性的IND-CCA2安全水平,即使是针对量子计算机。KEM是根据为OW-CPA设计的PKE保守构建的安全性,即使用二进制Goppa代码的Niederreiter的McEliece的PKE的双重版本。每个级别的设计结构是为了使未来的密码审计师能够确信量子后公钥加密。

三。术语和定义

就本文件而言,以下术语和定义适用。

  • SHAKE256:参见[NIST。FIPS.202年],Classic McEliece中使用的唯一对称基本体,具有选定的参数

  • IND-CCA2:对自适应选择密码攻击的不可区分性

  • KEM:钥匙封装机制

  • OW-CPA:单向对抗chosen-plantext攻击

  • PKE:公钥加密系统

  • ROM:随机模型

  • QROM:量子随机模型

  • F_q:q的有限域

  • :=:集合的成员

  • A_b,A_{b}:用表达式b下标的实体A

  • A^b,A^{b}:实体A上标有表达式b

  • A_b^c,A_{b}^{c},A^{c}_{b} :实体A用表达式b下标,用表达式c上标

  • =>:大于或等于

  • <=:小于或等于

  • 天花板(a):将a映射到大于或等于a的最小整数的函数

  • p*q:矩阵乘法

4符号和缩略语

4.1.符号指南

下表介绍了本规范中使用的符号。本手册仅供参考;对于完成所列术语的定义,请参阅适当的文本。还使用了其他一些符号偶尔地;在适当的地方在正文中介绍它们。

  • n: 代码长度(CM参数的一部分)

  • k: 代码维度(CM参数的一部分)

  • t: 保证的纠错能力(CM参数的一部分)

  • q: 所用字段的大小(CM参数的一部分)

  • m: q的以2为底的对数(CM参数的一部分)

  • u: 非负整数(CM参数的一部分)

  • v: 非负整数(CM参数的一部分)

  • Hash:加密哈希函数(symmetric-cryptronic参数)

  • HashLen:Hash(对称密码参数)输出的长度

  • Sigma_1:非负整数(对称加密参数)

  • Sigma_2:非负整数(对称密码参数)

  • PRG:伪随机比特生成器(对称密码参数)

  • g: F_q[x]中的多项式(私钥的一部分)

  • alpha_i:有限字段F_q的元素(私钥的一部分)

  • Gamma:(g,alpha_0,…,alpha_{n-1})(私钥的一部分)

  • s: 长度为n的位字符串(私钥的一部分)

  • T: F_2(CM公钥)上的mt*k矩阵

  • e: 长度为n且汉明重量为t的比特串

  • C: 封装会话密钥的密文

4.2.列矢量与行矢量

F_2^n的元素,例如码字和错误向量,始终被视为列向量。本公约避免所有换位。请注意,这与编码理论中的一个常见约定不同,即将码字作为行向量写入,但要换位码字以应用奇偶校验。

4.3.0编号与1编号

为了简化与大多数编程语言中的软件的比较,本规范一致使用从0开始编号的索引,包括行索引、列索引和alpha索引。注意中的约定数学文献有时同意这一点,但有时不同意:例如多项式指数通常从0开始编号,而与多项式指数无关的大多数向量是通常从1开始编号。

5要求

本文档定义了经典McEliece KEM。KEM由三个数学函数组成,即对于第10条中列出的每个“选定参数集”,使用KeyGen、Encap和Decap。

每个选定参数集的定义统一为一个更广泛参数的单个定义第6条规定的空间。对于该参数空间中的每个参数集文档定义

  • 给定随机位的KeyGen准确输出哪个公钥和私钥;

  • 给定公钥和随机位,Encap确切输出哪个密文和会话密钥;

  • 给定密文和私钥,Decap确切输出哪个会话密钥。

本文档通过提供计算F的算法来定义每个数学函数F。基本这里不再重复高斯消去等算法,而是MatGen、编码、解码、不可约,FieldOrdering(字段排序)、SeededKeyGen(种子KeyGen)、FixedWeight(固定重量)、KeyGen、Encap(封装)和Decap(去盖)在下面指定为编号列表第步(共步)。

其中三种算法,即FixedWeight、KeyGen和Encap,是随机的,生成随机位在指定的时刻。允许作为相应数学输入的随机位串的集合函数被定义为这些算法所消耗的随机比特串的集合。例如KeyGen算法精确读取HashLen随机位,因此数学函数KeyGen的域是集合HashLen-bit字符串的。这里,经典McEliece参数之一的HashLen对于每个选定的参数集是256。

要声明符合本文件,算法应(1)命名KeyGen或Encap或Decap;(2)确定第10条中列出的参数集(不是第6条中的另一个参数集);和(3)计算正是本文档中为该参数集定义的相应数学函数。对于例如,一个KeyGen实现声称符合mcelice6960119的此文档参数集应计算该参数集的指定KeyGen函数:即实现应准确读取HashLen=256位随机性,并应产生与KeyGen算法相同的输出下面指定的生成给定的256位字符串。

三种算法组成的元组(KeyGen、Encap和Decap各一种)与本文档的一致性是定义为每个算法都符合本文件的要求,并且应再次确定第10条。

用户有时会对算法进行进一步限制,例如包括各种副通道对策(可以使用自己的随机位)或达到特定的性能水平。此类约束超出了本文档的范围。本文档定义了以下数学函数应通过任何一致算法进行计算;本文档不限制这些函数的方式计算。

6参数

CM参数是以下定义的CM算法的隐式输入。CM参数集指定以下内容:

  • 正整数m。这也定义了参数q=2^m。

  • n≤q的正整数n。

  • 带有mt<n的正整数t=>2。这也定义了参数k=n-mt。

  • 阶m的一元不可约多项式f(z):=f_2[z]。这定义了字段F_q。

  • t次的一元不可约多项式F(y):=F_q[y]。这定义了字段F{q^t}=F{2^mt}。

  • 带v<=k+u的整数v=>u=>0。未提及这些参数的参数集将它们定义为默认情况下为(0,0)。

  • 下面列出了对称加密参数。

对称加密参数如下:

  • 正整数HashLen。

  • 一种加密散列函数hash,用于输出HashLen位。

  • 整数Sigma_1=>m。

  • 整数Sigma_2=>2m。

  • 伪随机位生成器PRG将一个HashLen位串映射为一个n+Sigma_2 q+Sigma _1 t+HashLen位串。

7单向函数

7.1.矩阵缩减

7.1.1.简化的排-螯式

给定一个矩阵X,高斯消去法以简化的行列形式计算唯一矩阵R,其中与X具有相同的行数和相同的行间距。采用简化的排螯形式意味着是序列c0<c1<…<c{r-1}使得

  • R的第0行以c0列的1开头,这是c0列中唯一的非零条目;

  • R的第1行以c1列中的1开头,这是c1列唯一的非零条目;

  • R的第2行以c2列的1开头,这是c2列中唯一的非零条目;

  • 等。;

  • r的第r-1行以列c{r-1}中的1开头,这是列c{r-1}的唯一非零项;

  • R的所有后续行都是0。

注意R的秩是R。

7.1.2.系统形式

作为特例,如果

  • R正好有R行,即没有零行;

  • c_i=i表示0<=i<r。(第二个条件等价于简单地说c_{r-1}=r-1,除了退化情况r=0。)

换句话说,R的形式是(I_R|T),其中I是R*R单位矩阵形式意味着计算与X具有相同行空间的唯一系统形式矩阵,如果这样的矩阵存在。

7.1.3.半系统形式

以下系统形式概念的推广使用了两个满足v=>的整数参数u,vu=>0。

设R是一个降维row-echelon形式的秩R矩阵柱。

我们说,如果R有R行(即没有零行),则R是(u,v)-半系统形式;ci=i表示0<=i<r-u;对于0<=i<r,c_i<=i-u+v(c_i条件等价于简单的c_{r-u-1}=r-u-1和c_{r-1}<=r-u+v-1,除了退化情况r=u。)

作为一个特例,如果u=v,则(u,v)-半系统形式等价于系统形式。然而,如果v>u,则(u,v)-半系统形式比系统形式允许更多的矩阵。

本规范首先给出了简单情况下(u,v)=(0,0)的各种定义,然后给出了一般情况下的各种定义案例。所选参数集的列表为每个键大小提供了一个参数集,其中(u,v)=(0,0),并且一个标记为“f”的参数集,(u,v)=(32,64)。

7.2.Goppa码的矩阵生成

7.2.1.概述

以下算法MatGen采用Gamma=(g,alpha_0,alpha_1,…,alpha_{n-1})作为输入,其中

  • g是t次F_q[x]中的一元不可约多项式

  • alpha_0、alpha_1、…、。。。,α{n-1}是F_q的不同元素。

算法输出MatGen(Gamma)首先在系统形式的简单情况下定义,然后在半系统形式的一般情况。输出为NIL或形式(T,…),其中T是CM公共键,F_2上的mt*k矩阵。

7.2.2.系统形式

对于(u,v)=(0,0),算法输出MatGen(Gamma)为NIL或形式(T,GammaF_2上的矩阵。以下是算法:

  1. 计算F_q上的t*n矩阵M={h_{i,j}},其中h_{i,j}=alpha_j^i/g(alpha_j),i=0。。。,t-1和j=0。。。,n-1。

  2. 通过替换每个条目u_0+u_1 z+…+,在F_2上形成mt*n矩阵n带列的m的u_{m-1}z^{m-1{共m位u_0,u_1。。。,u{m-1}。

  3. 将N减少为系统形式(I_{mt}|T),其中I_{mt}是mt*mt标识矩阵。如果失败,则返回NIL。

  4. 返回(T,Gamma)。

7.2.3.半系统形式

对于一般u,v,算法输出MatGen(Gamma)为NIL或形式(T,c_{mt-u},…,c_}mt-1},Gamma'),其中

  • T是F_2上的mt*k矩阵;

  • c_{mt-u}。。。,c{mt-1}是mt-u<=c{mt-u}<c{mt-u+1}<…<的整数c{mt-1}<mt-u+v;

  • 伽马射线=(g,α'_0,α'_1,…,α'_{n-1});

  • g与输入中的相同;

  • α'_0,α'_1。。。,α′_{n-1}是F_ q的不同元素。

以下是算法:

  1. 计算F_q上的t*n矩阵M={h_{i,j}},其中h_{i,j}=alpha_j^i/g(alpha_j),i=0。。。,t-1和j=0。。。,n-1。

  2. 通过替换每个条目u_0+u1 z+…+,在F_2上形成一个mt*n矩阵n带列的m的u_{m-1}z^{m-1{共m位u_0,u_1。。。,u{m-1}。

  3. 将N减少为(u,v)-半系统形式,获得矩阵H。如果失败,则返回NIL。(现在第一排有了它c_i列中的前导1。根据半系统形式的定义,c_i=i表示0<=i<mt-u;和mt-u<=c{mt-u}c_{mt-1}<mt-u+v。矩阵H是一个变量,可以稍后更改。)

  4. 集合(alpha'_0,alpha'_1,…,alpha'_{n-1})=(alpha_0,alpha_1,..,alpha_{n-1})。(每个alpha’_i都是一个变量,以后可以更改。)

  5. 对于i=mt-u,则i=mt-u+1,以此类推,直至i=mt-1,顺序如下:将列i与H中的列c_i,同时将alpha'_i与alpha'{c_i}交换。(交换后,第i行在第i列中具有前导1如果ci=i,swap不执行任何操作。)

  6. 矩阵H现在具有系统形式(I_{mt}|T),其中I_{mt}是mt*mt单位矩阵。返回(T,c{mt-u},…,c_{mt-1},Gamma')其中Gamma’=(g,alpha'_0,alpha’_1,……,alpha'_{n-1})。

在特殊情况下(u,v)=(0,0),c_{mt-u}。。。,输出的c{mt-1}部分为空,i循环为空,所以Gamma保证与Gamma相同。减少到(0,0)-半系统形式正是减少到系统形式。因此,通用算法定义与(0,0)算法定义相匹配。

7.3.编码子程序

以下算法Encode接受两个输入:权重t列向量e:=F_2^n;和公钥T,即。,F_2上的mt*k矩阵。算法输出Encode(e,T)是向量C:=F_2^{mt}。以下是算法:

  1. 定义H=(I_{mt}|T)。

  2. 计算并返回C=He:=F_2^{mt}。

7.4.解码子程序

以下算法Decode将C:=F_2^{mt}解码为汉明权重为wt(e)=t的单词e,其中C=He如果有这样一个词;否则返回失败。

形式上,解码需要两个输入:向量C:=F_2^{mt};和Gamma',某些Gamma的MatGen(Gamma)的最后一个组件使得MatGen(伽玛)!=无。为MatGen(Gamma)的第一个组件写入T。根据MatGen的定义,

  • T是F_2上的mt*k矩阵;

  • Gamma’的形式为(g,alpha'_0,alpha’_1,…,alpha'{n-1});

  • g是t次F_q[x]中的一元不可约多项式;

  • α'_0,α'_1。。。,α{n-1}是F_q的不同元素。

解码有两种可能性(C,Gamma'):

  • 如果C=编码(e,T),则解码(C,Gamma')=e。换句话说,如果存在权重-T向量e:=F_2^n,则C=He,H=(I_{mt}|T),则解码(C,Gamma’)=e。

  • 如果对于任何权重t向量e:=F_2^n,C的形式都不是He,那么解码(C,Gamma')=NIL。

以下是算法:

  1. 通过追加k个零,将C扩展到v=(C,0,…,0):=F_2^n。

  2. 找到唯一的c:=F_2^n,使得(1)Hc=0和(2)c与v的汉明距离<=t。如果没有如c,返回NIL。

  3. 设置e=v+c。

  4. 如果wt(e)=t且C=He,则返回e。否则返回NIL。

8经典McEliece KEM

8.1.不可约多项式生成

以下算法“不可约”采用Sigma_1 t的字符串输入位d_0,d_1。。。,d_{西格玛_1t-1}。它输出NIL或一元不可约度t多项式g:=F_q[x]。以下是算法:

  1. 定义beta_j=SUM^{m-1}_每个j:={0,1,…,t-1}的{i=0}(d_{Sigma_1j+i}z^i)。(在每组Sigma_1输入位中,这仅使用前m位。算法忽略剩余的位。)

  2. 定义beta=beta_0+beta_1 y+…+β_{t-1}y^{t-1}:=F_q[y]/F(y)。

  3. 计算F_q上beta的最小多项式g。(根据定义g是一元且不可约的,g(beta)=0。)

  4. 如果g的度数为t,则返回g。否则返回NIL。

8.2.现场订单生成

以下算法FieldOrdering采用Sigma_2 q输入位字符串。它输出NIL或序列F_q的q个不同元素的(alpha_0,alpha_1,…,alpha_{q-1})。以下是算法:

  1. 取第一个Sigma_2输入位b_0,b_1。。。,b_{Sigma_2-1}作为Sigma_2位整数a_0=b_0+2b_1+…+2^{Sigma_2-1}b_{Sigma-2-1},取下一个Sigma_2位作为Sigma_2-bit整数a_1,以此类推,直到a{q-1}。

  2. 如果a_0,a_1。。。,a_q-1不明显,返回NIL。

  3. 按字典顺序对对(a_i,i)进行排序以获得对(a_pi(i),pi(i)),其中pi是{0,1,…,q-1}。

  4. 定义alpha_i=SUM^{m-1}_{j=0}(π(i)_jz^{m-1-j})

  5. 其中pi(i)_j表示pi(i)的第j个最低有效位。(回想一下,有限域F_q被构造为F_2[z]/F(z)。)

  6. 输出(alpha_0、alpha_1、…、alpha_{q-1})。

8.3.密钥生成

以下随机算法KeyGen不接受任何输入(超出参数)。它输出公钥和私钥。以下是使用以下定义的子例程SeededKeyGen的算法:

  1. 生成统一的随机HashLen-bit字符串Delta。(这叫做种子。)

  2. 输出种子KeyGen(Delta)。

以下算法SeededKeyGen采用HashLen-bit输入Delta。它输出公钥和私钥。这里是算法:

  1. 计算E=PRG(Delta),即n+Sigma_2 q+Sigma _1 t+HashLen位的字符串。

  2. 将Delta定义为E的最后一个HashLen位。

  3. 将s定义为E的前n位。

  4. 计算alpha_0。。。,通过FieldOrdering算法从E的下一个Sigma_2 q位中提取alpha_{q-1}。如果此操作失败,请设置Delta=Delta’并重新启动算法。

  5. 用不可约算法从E的下一个Sigma_1 t位计算g。如果此操作失败,请设置Delta=Delta,然后重新启动算法。

  6. 定义Gamma=(g,alpha_0,alpha_1,…,alpha_{n-1})。(请注意,alpha_n,…,alpha_{q-1}不用于Gamma。)

  7. 计算(T,c{mt-u},…,c{mt-1},Gamma’)=MatGen(Gamma)。如果失败,请设置Delta=Delta'并重新启动算法。

  8. 将Gamma'写成(g,alpha'_0,alpha'_1,…,alpha’_{n-1})。

  9. 输出T作为公钥,输出(Delta,c,g,alpha,s)作为私钥,其中c=(c_{mt-u},…,c_{mt-1})和alpha=(α'_0,…,α'{n-1},α_n,……,α{q-1})。

8.4.固定重量矢量生成

以下随机算法FixedWeight不需要输入。它输出权重为t的向量e:=F_2^n该算法使用下面定义的预计算整数tau=>t。以下是算法:

  1. 生成Sigma_1 tau均匀随机位b_0、b_1。。。,b_{Sigma_1 tau-1}。

  2. 定义d_j=SUM^{m-1}_{i=0}(b_{Sigma_1j+i}2^i)对于每个j:={0,1,…,τ-1}。(在每组Sigma_1随机位中,使用只有前m位。算法忽略剩余的位。)

  3. 定义a_0、a_1、…、。。。,a{t-1}作为d_0,d_1,…,中的第一个t项。。。,d_{tau-1}在{0,1,…,n-1}范围内。如果数量较少然后重新启动算法。

  4. 如果a_0,a_1。。。,a{t-1}并不完全不同,请重新启动算法。

  5. 将e=(e_0,e_1,…,e_{n-1}):=F_2^n定义为权重-t向量,使得每个i的e_{a_i}=1。

  6. 返回e。

如果n=q,则整数tau定义为t;如果q/2<=n<q,则为2t;如果q/4<=n<q/2,则为4t;等所有选定的参数集有q/2<=n<=q,所以tau:={t,2t}。

8.5.封装

以下随机化算法Encap将公钥T作为输入。它输出密文C和会话密钥K。下面是非c参数集的算法:

  1. 使用FixedWeight生成权重为t的向量e:=F_2^n。

  2. 计算C=编码(e,T)。

  3. 计算K=散列(1,e,C);哈希输入编码参见第9.2条。

  4. 输出密文C和会话密钥K。

以下是pc参数集的算法:

  1. 使用FixedWeight生成权重为t的向量e:=F_2^n。

  2. 计算C_0=编码(e,T)。

  3. 计算C_1=散列(2,e)。将C=(C_0,C_1)。

  4. 计算K=散列(1,e,C)。

  5. 输出密文C和会话密钥K。

8.6.去封装

以下算法Decap以密文C和私钥作为输入,并输出会话密钥K。以下是非pc参数集的算法:

  1. 设置b=1。

  2. 从私钥中提取s:=F_2^n和Gamma'=(g,alpha'_0,alpha'_1,…,alpha’_{n-1})。

  3. 计算e=解码(C,Gamma')。如果e=NIL,则设置e=s和b=0。

  4. 计算K=散列(b,e,C);哈希输入编码见第9.2条。

  5. 输出会话密钥K。

以下是pc参数集的算法:

  1. 使用C_0:=F_2^{mt}和C_1:=F_2 ^HashLen将密文C拆分为(C_0,C_1)。

  2. 设置b=1。

  3. 从私钥中提取s:=F_2^n和Gamma'=(g,alpha'_0,alpha'_1,…,alpha’_{n-1})。

  4. 计算e=解码(C_0,Gamma')。如果e=NIL,则设置e=s和b=0。

  5. 计算C'_1=散列(2,e)。

  6. 如果C'_1!=C_1,设置e=s和b=0。

  7. 计算K=散列(b,e,C)。

  8. 输出会话密钥K。

9位元及字节组

9.1.对称密码参数的选择

所有选定的参数集都使用以下对称加密参数:

  • 整数HashLen是256。

  • HashLen-bit字符串Hash(x)定义为SHAKE256(x)输出的第一个HashLen位。这里的字节字符串是被视为小型字符串;见第9.2条。字节集被定义为{0,1,…,255}。

  • 整数Sigma_1是16。(所有选定的参数集都有m≤16,因此Sigma_1=>m。)

  • 整数Sigma_2是32。

  • (n+Sigma_2 q+Sigma_1 t+HashLen)位字符串PRG(Delta)定义为SHAKE256(64,三角形)。这里的64,Delta是指以字节64开始并以Delta继续的33字节字符串。

Classic McEliece中使用的所有Hash输入都以字节0或1开头(对于pc,则以字节2开头)(参见第9.2条),因此没有重叠PRG中使用的SHAKE256输入。

9.2.对象表示为字节字符串

9.2.1.位矢量

如果r是8的倍数,则r位向量v=(v_0,v_1,…,v_{r-1}):=F_2^r表示为以下序列r/8字节:

(v0+2v_1+4v_2+…+128v_7,v_8+2v_9+4v_10+…+128 v_15,…,v_{r-8}+2v_{r-7}+4v_{r6}+…+1280v_{r 1})。

如果r不是8的倍数,则r位向量v=(v_0,v_1,…,v_{r-1}):=F_2^r在长度右侧进行零填充在r+1和r+7之间,以8的倍数为准,然后如上所示。

根据定义,Simply Decoded Classic McEliece忽略输入中的填充位,而Narrowly Decoded经典McEliece拒绝填充位非零的输入(密文和公钥);拒绝手段返回NIL。对于某些参数集(但不是全部),r总是8的倍数,所以没有填充位,所以简单解码经典McEliece和窄解码经典McColliece是相同的。

简单解码和窄解码的定义是为了便于讨论区别可能相关的情况。应用程序应避免依赖这种区别。符合本文件不需要简单解码或窄解码标签。

9.2.2.会话密钥

会话密钥K是F_2^HashLen的元素。它表示为一个CEILING(HashLen/8)字节字符串。

9.2.3.非c参数集的密码

对于非pc参数集:密文C是F_2^{mt}的元素。它表示为一个天花板(mt/8)字节字符串。

9.2.4.pc参数集的密码

对于pc参数集,密文C有两个组件:C_0:=F_2^mt和C_1:=F_2 ^HashLen。密文是表示为表示C_0的CEILING(mt/8)字节字符串和CEILING(HashLen/8)字节字符串的串联表示C_1。

9.2.5.非c参数集的散列输入

对于非C参数集,有两种类型的散列输入:(1,v,C)和(0,v,C)。这里v:=F_2^n,C是一个密文。

初始0或1表示为字节。矢量v表示为下一个天花板(n/8)字节。密文表示为下一个天花板(mt/8)字节。因此,如前所述,所有散列输入都以字节0或1开头。

9.2.6.pc参数集的散列输入

对于pc参数集,有三种类型的散列输入:(2,v);(1,v,C);和(0,v,C)。这里v:=F_2^n和C是密文。

初始0、1或2表示为字节。矢量v表示为下一个天花板(n/8)字节。这个如果存在密文,则表示为下一个CEILING(mt/8)+CEILING(HashLen/8)字节。

因此,如前所述,所有散列输入都以字节0、1或2开头。

9.2.7.公钥

公钥T是一个mt*k矩阵,以行主方式表示。每行T为表示为CEILING(k/8)字节字符串,公钥表示为这些字符串。

9.2.8.字段元素

F_q同余F_2[z]/F(z)的每个元素的形式为SUM^{m-1}_{i=0}(c_iz),其中c_i:=F_2。字段的表示元素是向量(c0,c1,…,c{m-1}):=F_2^m的表示。

9.2.9.一元不可约多项式

单不可约度-t多项式g=g_0+g_1x+…+g_{t-1}x^{t-1{+xt表示为t天花板(m/8)字节,即字段元素g0、g1、…、。。。,g{t-1}。

9.2.10.现场订购

F_q中q个不同元素的序列(alpha_0,…,alpha_{q-1})的明显表示为q字段元素。相反,本文件规定了以下表示。

“就地Benes网络”是应用于q=2^m对象数组的一系列2m-1级交换(a_0,a_1,…,a_{q-1})。第一阶段有条件地交换a_0和a_1,有条件地交换a_2和a_3,有条件地交换交换a4和a5等,如q/2控制位序列所规定(1表示交换,0表示保留位置)。第二阶段有条件交换a_0和a_2,有条件交换a_1和a_3,有条件转换a_4和a _6等,由下一个q/2控制位指定。这将持续到m:th阶段条件交换a_0和a{q/2},条件交换a_1和a_{q/2+1}等。(m+1):st阶段与(m-1):st级(具有新的控制位),(m+2):nd级与(m-2):nd阶段类似,依此类推通过(2m-1):第一阶段。

将pi定义为{0,1,…,q-1}的置换,这样alpha_i=SUM^{m-1}_{j=0}(pi(i)_jz^{m-1-j}表示所有i:={0,1,…,q-1}。顺序(alpha_0,…,alpha_{q-1})表示为就地Benes的(2m-1)2^{m-1}控制位序列pi网络。该向量表示为天花板((2m-1)2^{m-4})字节,如上所示。

从数学上讲,每个排列都有多个控制位向量选择。为了符合此要求文件中,置换pi应具体转换为遵循Python脚本。这不是要求解封装算法将控制位读取到检查唯一性。

定义composeinv(c,pi):return[y表示x,y按排序(zip(pi,c))]定义控制位(pi):n=长度(pi)m=1而1<<m<n:m+=1断言1<<m==n如果m==1:返回[pi[0]]p=[pi[x^1]对于范围(n)中的xq=[pi[x]^1,对于范围(n)中的xpiinv=组合inv(范围(n),pi)p、 q=composeinv(p,q),composein(q,p)c=[范围(n)内x的最小值(x,p[x])]p、 q=composeinv(p,q),composein(q,p)对于范围(1,m-1)中的i:cp,p,q=composeinv(c,q),composein(p,q)c=[范围(n)内x的最小值(c[x],cp[x])]f=[c[2*j]%2,对于范围内的j(n//2)]对于范围(n)中的x,F=[x^F[x//2]Fpi=组合inv(F,piinv)l=[Fpi[2*k]%2,对于范围(n//2)中的k对于范围(n)中的y,L=[y^L[y//2]M=组合inv(Fpi,L)subM=[[M[2*j+e]//2(对于范围(n//2)中的j)](对于范围内的e)]subz=映射(控制位,subM)z=[s表示s0s1在zip(*subz)中表示s在s0s1]返回f+z+l

9.2.11.列选择

KeyGen生成的私钥的一部分是u整数的序列c=(c{mt-u},…,c{mt-1})mt-u和mt-u+v-1之间的顺序。

这个序列c表示为一个CEILING(v/8)字节字符串,即整数的小字节格式SUM(总和)^{u-1}_{i=0}(2^{c{mt-u+i}-(mt-u)。

然而,对于(u,v)=(0,0),序列c被表示为8字节字符串-2^32-1的endian格式,即4个字节的值255后跟4个字节值0。

9.2.12.私钥

私钥(Delta,c,g,alpha,s)表示为五个部分的串联:

  • 表示Delta:=F_2^HashLen的CEILING(HashLen/8)字节字符串。

  • 表示列选择c的字符串。该字符串具有CEILING(v/8)字节,如果(u,v)=(0,0),则为8字节。

  • 表示多项式g的tCEILING(m/8)字节字符串。

  • 表示字段顺序alpha的CEILING((2m-1)2^{m-4})字节。

  • CEILING(n/8)字节字符串,表示s:=F_2^n。

10所选参数集

10.1.参数集mcelice6688128

KEM,m=13,n=6688,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。这是一个非c参数集。

10.2.参数集mcelice6688128f

KEM,m=13,n=6688,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。半系统参数(u,v)=(32,64)。这是一个非c参数集。

10.3.参数集mcelice6688128pc

KEM,m=13,n=6688,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。这是一个pc参数集。

10.4.参数集mcelice6688128pcf

KEM,m=13,n=6688,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。半系统参数(u,v)=(32,64)。这是一个pc参数集。

10.5.参数集mcelice6960119

KEM,m=13,n=6960,t=119。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y 119+y^8+1。这是一个非c参数集。

10.6.参数集mcelice6960119f

KEM,m=13,n=6960,t=119。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y 119+y^8+1。半系统参数(u,v)=(32,64)。这是一个非c参数集。

10.7.参数集mceliece6960119pc

KEM,m=13,n=6960,t=119。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y 119+y^8+1。这是一个pc参数集。

10.8.参数集mcelice6960119pcf

KEM,m=13,n=6960,t=119。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y 119+y^8+1。半系统参数(u,v)=(32,64)。这是一个电脑参数集。

10.9.参数集mcelice8192128

KEM,m=13,n=8192,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。这是一个非c参数集。

10.10.参数集mcelice8192128f

KEM,m=13,n=8192,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。半系统参数(u,v)=(32,64)。这是一个非c参数集。

10.11.参数集mcelice8192128pc

KEM,m=13,n=8192,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。这是一个pc参数集。

10.12.参数集mcelice8192128pcf

KEM,m=13,n=8192,t=128。域多项式f(z)=z^13+z^4+z^3+z+1和f(y)=y^128+y^7+y^2+y+1。半系统参数(u,v)=(32,64)。这是一个pc参数集。

11安全注意事项

经典McEliece是一种密钥封装机制,旨在实现IND-CCA2安全性非常高,与传统安全性相比和量子计算机。

随机数据的质量对Classic的安全性至关重要McEliece,参见[RFC4086协议]以获取更多讨论和建议。

实现应设计为模拟安全泄漏敏感材料,包括防止旁道攻击。

经典McEliece安全性的新研究结果可能是在任何可能需要实施或部署的时间发布重新考虑。

为了避免新的研究发现,经典麦克利埃斯可能以“混合”模式与传统算法相结合,旨在不弱于使用的任何一个单独算法,并且算法的组合方式。

12IANA考虑

本文档没有IANA操作。

13工具书类

13.1.规范性引用文件

【NIST.FIPS.202】
德沃金,M。,德沃金,M.J。,以及NIST标准,“SHA-3标准:基于排列的散列和可扩展输出函数”,菲普斯PUB 202,NIST联邦信息处理标准出版物202,DOI 10.6028/nist.fips.202,内政部10.6028/NIST。FIPS.202年,,<http://nvlpubs.nist.gov/nistpubs/FIPS/nist.FIPS.202.pdf>.

13.2.资料性引用

[CM-impl](CM-impl)
经典McEliece团队,“经典McEliece:保守的基于代码的加密:实现者指南”,,<https://classic.mcelice.org/mceliece-impl-20221023.pdf>.
[CM论文]
经典McEliece团队,“经典McEliece:论文”,,<https://classic.mcelice.org/papers.html>.
【CM-pc】
经典McEliece团队,“经典McEliece:保守的基于代码的加密:明文确认意味着什么”,,<https://classic.mcelice.org/mceliece-pc-20221023.pdf>.
[CM-国家]
经典McEliece团队,“经典McEliece:保守的基于代码的加密:设计原理”,,<https://classic.mcelice.org/mceliece-rationale-20221023.pdf>.
[CM-段]
经典McEliece团队,“经典McEliece:Sage套餐”,,<https://classic.mcelice.org/spec.html>.
[CM安全]
经典McEliece团队,“经典McEliece:保守的基于代码的加密:安全审查指南”,,<https://classic.mcelice.org/mceliece-security-20221023.pdf>.
【CM-特定】
经典McEliece团队,“经典McEliece:保守的基于代码的加密:密码系统规范”,,<https://classic.mcelice.org/mceliece-spec-20221023.pdf>.
[麦克利埃塞]
R.J.麦克利埃塞。,“基于代数编码理论的公钥密码系统”,,<https://ipnpr.jpl.nasa.gov/progress_report2/42-44/44N.PDF>.
[RFC4086]
东湖3号,D。,J.席勒。,以及S.克罗克,“安全随机性要求”,业务连续性计划106,RFC 4086号文件,内政部10.17487/RFC4086,,<https://www.rfc-editor.org/rfc/rfc4086>.

附录A。经典McEliece资源概述(资料丰富)

Classic McEliece在中指定[CM-特定]对于pc选项,[CM-pc公司].本文件中的规范与兼容[CM-特定][CM-pc公司]有关设计原理,请参见[CM-基本].

[CM-阶段]介绍了Sage语言中经典McEliece函数的算法。受制于计算机可执行文件,此软件包旨在使算法尽可能可读,包括与算法匹配的详细注释[CM规格](和[CM-pc公司]).

[CM-impl公司]为实施者提供指导。例如,它涵盖了针对并行通道攻击的安全性,选择参数集时的注意事项,设计加密网络应用程序以提高效率,现有的实现,以及如何构建新的实现。

[CM-安全]为安全审查人员提供指导。作为初步事项,[CM-安全]盖子密码系统的正确性:例如,解码步骤2中的c如果存在则是唯一的,而c始终存在当C由Encap输出时。[CM-安全]然后回顾了针对1978年原始版本的攻击的稳定性McEliece密码系统引入[麦克利埃塞],并审查OW-CPA之间的紧密关系该密码系统的安全性和Classic McEliece的QROM IND-CCA2安全性。

根据中的分析[CM-安全],本文件中选择的所有参数均符合ISO的要求2^128针对已知攻击的后量子安全。这是真的,即使只计数量子位操作,忽略(1)量子比特开销和(2)内部攻击的内存访问成本。(本文件没有评论此处未列出的参数是否也满足此要求。)相比之下,128位在该度量中,诸如AES-128之类的密码仅提供略高于2^64的安全性。

更多参考可在上述文件和[CM-papers公司].

作者地址

西蒙·约瑟夫森(编辑)