后量子密码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=(−x3−x2+x−x3−x).
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=(x2x2−x).
接着我们通过计算
t
=
A
s
+
e
\mathbf{t=As+e}
t=As+e得到多项式向量
t
\mathbf{t}
t (最终
t
\mathbf{t}
t 成为和
s
、
e
\mathbf{s 、e}
s、e 一样的多项式向量)。
在 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一样完全随机并且都是“小”系数 e1、e2和r都是和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+x2−1), 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=−x3−x2.
~
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⌋=9⋅mb=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=v−sTu=(tTr+e2+m)−sT(ATr+e1)=((As+e)Tr+e2+m)−sTATr−sTe1=m+eTr+e2−sTe1.
在 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 s、e和r的系数范围, η 2 \eta _{2} η2控制 e 1 、 e 2 e_1、e_2 e1、e2的系数范围。Baby Kyber 中 η 1 = 1 , η 2 = 1 \eta _{1}=1,\eta _{2}=1 η1=1,η2=1.
- d u 、 d v : d_u、d_v: du、dv: 控制着多少 ( 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.
四种安全性(即密码分析中四种攻击方式)
- 唯密文攻击(COA):攻击者在仅知道密文的情况下能够分析求解出明文或密钥.
- 已知明文攻击(KPA):知道部分(明文,密文)对,能够推出密钥和加密算法.
- 选择明文攻击(CPA):可以选择任意明文获得对应的密文,能够推出密钥
- 选择密文攻击(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