Kyber加密算法

本文详细介绍了后量子密码中的BabyKyber公钥加密系统,包括其密钥生成、加密和解密过程,以及算法参数如多项式次数、向量维度和模数等。重点阐述了私钥和公钥的构成,以及加密和解密步骤,展示了其基于容错学习的数学基础。
摘要由CSDN通过智能技术生成

后量子密码kyber是一个公钥加密系统(类似于RSA,使用公钥加密、私钥解密)。包括三个部分:密钥生成、加密和解密。
Kyber有三个安全级别。图表显示了不同安全级别的密钥、密文大小(RSA作为比较)

对于下面的介绍,本文将会使用一个缩小版本的Kyber,称为 Baby Kyber. 相比于常规的Kyber可读性更强,只是安全参数更小。

和其他公钥加密系统一样,我们需要一个模q.也就是说,每次计算后我们都要对结果进行 module q 计算。对于 Baby Kyber 我们设定 q=17. 同时,由于Kyber需要处理大量的多项式加法和乘法,我们也需要对这些多项式进行取模运算。对于Baby Kyber 我们设定使用多项式 f = x 4 + 1 f=x^4+1 f=x4+1进行取模计算,保证所有的多项式的最高次数都小于4。

密钥生成

密钥生成阶段会产生: 私钥 s ; 公钥 A , t {\color{Blue} 私钥} {\color{Red}s}; {\color{Blue}公钥}{\color{Red}A,t} 私钥s;公钥A,t

1.私钥

私钥是由具有“小”系数的多项式组成的向量。在 Baby Kyber 中私钥包含两个多项式: s = ( − x 3 − x 2 + x − x 3 − x ) s=\begin{pmatrix}-x^3-x^2+x\\ -x^3-x\end{pmatrix} s=(x3x2+xx3x).

2.公钥

公钥包含两个元素:随机多项式矩阵 A \mathbf{A} A 和多项式向量 t \mathbf{t} t. 矩阵 A \mathbf{A} A 的生成很简单,仅仅是产生随机系数,然后对 q 取模。在 Baby Kyber 中我们使用
                    A = ( 6 x 3 + 16 x 2 + 16 x + 11 9 x 3 + 4 x 2 + 6 x + 3 5 x 3 + 3 x 2 + 10 x + 1 6 x 3 + x 2 + 9 x + 15 ) ~~~~~~~~~~~~~~~~~~~A = \begin{pmatrix}6x^3+16x^2+16x+11 & 9x^3+4x^2+6x+3\\ 5x^3+3x^2+10x+1 & 6x^3+x^2+9x+15 \end{pmatrix}                    A=(6x3+16x2+16x+115x3+3x2+10x+19x3+4x2+6x+36x3+x2+9x+15).
计算多项式向量 t \mathbf{t} t 需要一个错误向量 e \mathbf{e} e (和私钥一样, e \mathbf{e} e 也是小系数多项式). 在 Baby Kyber 中我们使用 e = ( x 2 x 2 − x ) e=\begin{pmatrix}x^2\\x^2-x\end{pmatrix} e=(x2x2x).
接着我们通过计算 t = A s + e \mathbf{t=As+e} t=As+e得到多项式向量 t \mathbf{t} t (最终 t \mathbf{t} t 成为和 s 、 e \mathbf{s 、e} se 一样的多项式向量)。
Baby Kyber 中我们可以计算出 t = A s + e = ( 16 x 3 + 15 x 2 + 7 10 x 3 + 12 x 2 + 11 x + 6 ) t=As+e=\begin{pmatrix}16x^3+15x^2+7\\10x^3+12x^2+11x+6\end{pmatrix} t=As+e=(16x3+15x2+710x3+12x2+11x+6).

整个算法实际上建立在一个容错学习问题(module-learning-with-errors, MLWE)上,即已知 ( A , t ) \mathbf{(A,t)} (A,t) 求解 s \mathbf{s} s , 这个问题对于量子计算机来说也是一个难以求解的问题。

加密

加密阶段使用 公钥 ( A , t ) {\color{Blue}公钥}{\color{Red}(A,t)} 公钥(A,t) 对消息进行加密。

1.首先,我们需要两个向量: 错误向量 e 1 和 随机数多项式向量 r {\color{Blue}错误向量}{\color{Red}e_1}和{\color{Blue}随机数多项式向量}{\color{Red}r} 错误向量e1随机数多项式向量r,这两个向量每次加密新生成;还需要一个 误差多项式 e 2 {\color{Blue}误差多项式 }{\color{Red}e_2} 误差多项式e2. e 1 、 e 2 和 r 都是和 s 一样完全随机并且都是“小”系数 e_1、e_2和r都是和s一样完全随机并且都是“小”系数 e1e2r都是和s一样完全随机并且都是系数

Baby Kyber 中我们使用: r = ( − x 3 + x 2 x 3 + x 2 − 1 ) r=\begin{pmatrix}-x^3+x^2\\x^3+x^2-1\end{pmatrix} r=(x3+x2x3+x21),        e 1 = ( x 2 + x x 2 ) ~~~~~~e_1=\begin{pmatrix}x^2+x\\x^2\end{pmatrix}       e1=(x2+xx2),        e 2 = − x 3 − x 2 ~~~~~~e_2=-x^3-x^2       e2=x3x2.

  ~  
2.接着,我们要把消息转化成多项式:在 Baby Kyber 中我们假设消息为
         m s g = 11 = ( 11 ) 10 = ( 1011 ) 2 ~~~~~~~~msg=11=(11)_{10}=(1011)_{2}         msg=11=(11)10=(1011)2 ⟶ \longrightarrow 1 x 3 + 0 x 2 + 1 x 1 + 1 x 0 = x 3 + x + 1 = m b 1x^3+0x^2+1x^1+1x^0=x^3+x+1=m_b 1x3+0x2+1x1+1x0=x3+x+1=mb
在加密之前还要放缩这个消息多项式 m = m b × ⌈ q 2 ⌋ m=m_b \times \left \lceil \frac{q}{2} \right \rfloor m=mb×2q :把消息多项式 m b m_b mb ⌈ q 2 ⌋ \left \lceil \frac{q}{2} \right \rfloor 2q. 在 Baby Kyber ⌈ q 2 ⌋ = ⌈ 17 2 ⌋ = 9 \left \lceil \frac{q}{2} \right \rfloor=\left \lceil \frac{17}{2} \right \rfloor=9 2q=217=9. 因此,最终加密消息为 m = m b × ⌈ q 2 ⌋ = 9 ⋅ m b = 9 x 3 + 9 x + 9 m=m_b \times \left \lceil \frac{q}{2} \right \rfloor=9 \cdot m_b=9x^3+9x+9 m=mb×2q=9mb=9x3+9x+9.

  ~  
3.最后我们使用 公钥 ( A , t ) {\color{Blue}公钥}{\color{Red}(A,t)} 公钥(A,t) 对消息 m m m进行加密,产生的 密文 {\color{Blue}密文} 密文 ( u , v ) {\color{Red}(\mathbf{u},v)} (u,v),其中 u \mathbf{u} u是多项式向量, v v v是多项式:

                                                       u = A T r + e 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\mathbf{u}=\mathbf{A}^T\mathbf{r}+\mathbf{e_1}                                                       u=ATr+e1;                 v = t T r + e 2 + m ~~~~~~~~~~~~~~~v=\mathbf{t}^T\mathbf{r}+e_2+m                v=tTr+e2+m
Baby Kyber 中我们可以得到:
                               u = ( 11 x 3 + 11 x 2 + 10 x + 3 4 x 3 + 4 x 2 + 13 x + 11 ) ;             v = 7 x 3 + 6 x 2 + 8 x + 15 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\mathbf{u}=\begin{pmatrix}11x^3+11x^2+10x+3\\ 4x^3+4x^2+13x+11\end{pmatrix};~~~~~~~~~~~v=7x^3+6x^2+8x+15                               u=(11x3+11x2+10x+34x3+4x2+13x+11);           v=7x3+6x2+8x+15

解密

解密阶段使用 私钥 s {\color{Blue} 私钥} {\color{Red}s} 私钥s 密文 ( u , v ) {\color{Blue}密文}{\color{Red}(\mathbf{u},v)} 密文(u,v) 进行解密。

先计算一个有噪音 n o i s y noisy noisy的结果:
m n = v − s T u = ( t T r + e 2 + m ) − s T ( A T r + e 1 ) = ( ( A s + e ) T r + e 2 + m ) − s T A T r − s T e 1 = m + e T r + e 2 − s T e 1 m_{n}=v-\mathbf{s^Tu}=(\mathbf{t}^T\mathbf{r}+e_2+m)-\mathbf{s}^T(\mathbf{A}^T\mathbf{r}+\mathbf{e_1})=((\mathbf{As+e})^T\mathbf{r}+e_2+m)-\mathbf{s}^T\mathbf{A}^T\mathbf{r}-\mathbf{{s}^Te_1}=m+\mathbf{e^Tr}+e_2-\mathbf{s^Te_1} mn=vsTu=(tTr+e2+m)sT(ATr+e1)=((As+e)Tr+e2+m)sTATrsTe1=m+eTr+e2sTe1.

Baby Kyber 中, m n = 7 x 3 + 14 x 2 + 7 x + 5 m_n=7x^3+14x^2+7x+5 mn=7x3+14x2+7x+5, 我们观察每个系数同 ⌈ q 2 ⌋ \left \lceil \frac{q}{2} \right \rfloor 2q 和0(或 q q q)的距离,离 ⌈ q 2 ⌋ \left \lceil \frac{q}{2} \right \rfloor 2q 更近则舍入为 ⌈ q 2 ⌋ = 9 \left \lceil \frac{q}{2} \right \rfloor=9 2q=9,否则舍入为0.

最终得到放缩后的多项式 m = 9 x 3 + 0 x 2 + 9 x + 9 m=9x^3+0x^2+9x+9 m=9x3+0x2+9x+9, 我们再还原回二进制多项式 m b = 1 9 × ( 9 x 3 + 0 x 2 + 9 x + 9 ) = 1 x 3 + 0 x 2 + 1 x + 1 m_b=\frac{1}{9}\times(9x^3+0x^2+9x+9)=1x^3+0x^2+1x+1 mb=91×(9x3+0x2+9x+9)=1x3+0x2+1x+1, 从中读出原始消息 ( 1011 ) 2 = ( 11 ) 10 (1011)_2=(11)_{10} (1011)2=(11)10.

算法参数

普通的 Kyber 加密算法和 Baby Kyber 基本没有什么不同,只不过有着更大的参数,算法的主要参数如下:

  • n : n: n: 使用的多项式的最大次数。 Baby Kyber n = 4 n=4 n=4.
  • k : k: k: 每个向量的维度,即每个向量包含几个多项式。 Baby Kyber k = 2 k=2 k=2.
  • q : q: q: 模数。Baby Kyber q = 17 q=17 q=17.
  • η 1 , η 2 : \eta _{1} ,\eta _{2} : η1,η2: 控制“小”系数的范围, η 1 \eta _{1} η1控制 s 、 e 和 r s、e和r ser的系数范围, η 2 \eta _{2} η2控制 e 1 、 e 2 e_1、e_2 e1e2的系数范围。Baby Kyber η 1 = 1 , η 2 = 1 \eta _{1}=1,\eta _{2}=1 η1=1,η2=1.
  • d u 、 d v : d_u、d_v: dudv: 控制着多少 ( u , v ) (u,v) (u,v) 被压缩。
  • δ : \delta : δ: 解密出现错误的概率。
    在这里插入图片描述

Kyber KEM

Kyber通常被用来构造一个KEM(key-encapsulation-mechanism,即密钥封装机制,类似于Diffie-Hellman密钥协商):通过Fujisaki-Okamoto变换从IND-CPA安全转换到IND-CCA安全。Kyber KEM 提供了以下三个功能:

  • ( p k , s k ) = K E M K e y G e n ( ) (pk, sk)=KEM_KeyGen() (pk,sk)=KEMKeyGen(): 产生公钥和私钥.
  • ( c t , s s ) = K E M E n c r y p t ( p k ) (ct, ss)=KEM_Encrypt(pk) (ct,ss)=KEMEncrypt(pk): 产生一个随机数 s s ss ss, 然后使用公钥加密得到 c t ct ct.
  • ( s s ) = K E M D e c r y p t ( s k , c t ) ( ss)=KEM_Decrypt(sk, ct) (ss)=KEMDecrypt(sk,ct): 使用私钥 s k sk sk 解密密文 c t ct ct 得到明文 s s ss ss.
四种安全性(即密码分析中四种攻击方式)
  1. 唯密文攻击(COA):攻击者在仅知道密文的情况下能够分析求解出明文或密钥.
  2. 已知明文攻击(KPA):知道部分(明文,密文)对,能够推出密钥和加密算法.
  3. 选择明文攻击(CPA):可以选择任意明文获得对应的密文,能够推出密钥
  4. 选择密文攻击(CCA):可以选择任意密文,获得明文,最后能够推出密钥.
  • 语义安全:即攻击者在得到密文的情况下,无法从中得到任何明文相关的哪怕是一比特的信息.
  • IND-CPA安全:即在攻击者能够自己选择明文,查询对应密文的情况下,攻击者给加密方两个等长明文 m 0 m_0 m0 m 1 m_1 m1,让加密方选择其中一个加密,输出密文 c i      i ∈ { 0 , 1 } c_i ~~~~i \in\{0,1\} ci    i{0,1} . 攻击者无法从密文 c i c_i ci 中识别出加密的是 m 0 m_0 m0还是 m 1 m_1 m1.(攻击者不能查询这两个明文加密后的密文,但可以在明文中加入一些对自己有利的信息)
  • IND-CCA安全:即攻击者能够自己选择明文,查询密文和选择密文,查询明文的情况下,攻击者给加密方两个等长明文 m 0 m_0 m0 m 1 m_1 m1,让加密方选择其中一个加密,输出密文 c i      i ∈ { 0 , 1 } c_i ~~~~i \in\{0,1\} ci    i{0,1} . 攻击者无法从密文 c i c_i ci 中识别出加密的是 m 0 m_0 m0还是 m 1 m_1 m1.(攻击者由于没有密钥,因此很难生成合法密文进行查询。但攻击者可以篡改密文)

语义安全的方案通过添加随机数,使其上升为 IND-CPA安全;而仅 IND-CPA安全的方案通过添加密文完整性验证机制(如Fujisaki-Okamoto变换),使其达到 IND-CCA安全。

CCA安全的KEM构造(基于FO变换)

p.s. 需要说明的是这里的KEM并非后量子Kyber特有的。事实上,任意公钥加密算法都可以构造一个KEM.
在这里插入图片描述

  • KeyGen: 输入一个安全参数 1 λ 1^\lambda 1λ, 使用PKE.Gen(即公钥密码的密钥生成算法)生成公私钥对 ( s k , p k ) (sk,pk) sk,pk, 公布公钥 p k pk pk. 产生一个随机明文 s s s (欺骗攻击者用的).
  • Encaps: 产生随机消息 m m m; 使用 m m m (或加上 p k pk pk) 通过随机数喻言机G(类似于随机数生成器)产生随机数 r r r ; 使用公钥 p k pk pk 通过 PKE.Enc(即公钥密码的加密算法)加密 m m m r r r,产生密文 c c c; 最后使用随机数喻言机H 计算 ( m , c ) (m,c) m,c得到共享密钥 k k k.
  • Decaps: 使用私钥 sk, 通过 PKE.Dec(即公钥密码的解密算法)解密密文 c c c得到消息 m ′ m^{'} m, 再通过G产生随机数 r ′ r^{'} r; 接着通过 PKE.Enc 重新加密 ( m ′ , r ′ ) (m^{'},r^{'}) (m,r) 得到密文 c ′ c^{'} c. 最后比较 c c c c ′ c^{'} c是否相同,相同则通过H计算得到共享密钥 k k k,不相同则说明一开始输入的密文 c c c有问题,这里采用了一种隐式拒绝,通过H计算 ( s , c ) (s,c) (s,c)得到一个假的共享密钥.

正常的加密过程中,Alice和Bob通过上面的KEM进行通信:首先,Alice使用KeyGen算法产生 ( s k , p k , s ) (sk,pk,s) (sk,pk,s),公开公钥 p k pk pk; Bob使用公钥 p k pk pk通过Encaps算法得到共享密钥 k k k和密文 c c c, 接着把密文 c c c发给Alice; Alice拿着Bob发过来的密文 c c c使用 ( s k , p k ) (sk,pk) (sk,pk)执行Decaps算法,检查重新加密得到的 c ′ c^{'} c是否和Bob发的密文相同(实际上就是检查Bob有没有修改密文),这样Alice和Bob就都得到了共享密钥 k k k.
---------------------------------------------------------------------------------------
可以看出KEM机制结合了公钥密码和对称密码:通过公钥密码实现了共享密钥,后续通信双方进行对称加密。个人认为主要是为了使用公钥实现通信双方的身份认证,使用对称加密实现更快的加密效率。

Reference

https://cryptopedia.dev/posts/kyber/
https://blog.csdn.net/A33280000f/article/details/118304531
https://www.cnblogs.com/max1z/p/15992505.html 推荐!
https://www.zhihu.com/question/595757042/answer/2985338809
https://blog.csdn.net/weixin_44885334/article/details/129013351

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值