Crystal Kyber密碼演算法解讀(一)

Annalovecoding發表於2020-11-20

傳統的公鑰密碼PKE
( G e n , E n c , D e c ) (Gen,Enc,Dec) (Gen,Enc,Dec)
其中 G e n Gen Gen生成的金鑰對為 ( p k , s k ) (pk,sk) (pk,sk)
傳送方用公鑰進行加密 C ← E n c p k ( m ) C\leftarrow Enc_{pk}(m) CEncpk(m)
接收方用自己的私鑰進行解密 m : = D e c s k ( c ) m:=Dec_{sk}(c) m:=Decsk(c)

公鑰密碼的缺點:計算速度慢,效率比對稱演算法低太多了公鑰密碼效率低的原因?

在這裡插入圖片描述

首先這裡討論有關效率的指標有這些:CPU、network bandwidth也就是網路頻寬、functionalites功能性
“moral”的原因是因為,首先,如何做到pk不洩露sk的資訊,這已經是需要很強數學能力的事情了(attacker不能通過公鑰去破解出私鑰)
相比對稱密碼只是簡單的打亂位元來說,公鑰密碼的方法更復雜的多
而且,一些已知的非對稱加密系統看起來實現了我們需要的安全,但實際上需要巨大的計算開銷。注意到McEliece cryptosystem 和 NTRUEncrypt都實現了高速下的非對稱加解密方案(比RSA,橢圓曲線下的El Gamal快多了)。
並沒有證據表明非對稱加密在計算方面比對稱加密更難。
頻寬是非對稱加密演算法中另一個效率指標。這絕對是限制加密演算法效率的因素之一。公鑰密碼演算法是公開的,意味著任何人包括攻擊者都能使用公鑰去加密任意的訊息。這意味著如果加密演算法是確定的,那麼攻擊者就可以通過窮舉得到匹配的密文。因此一個非對稱加密演算法還需要包含額外的隨機性。
這樣的額外的隨機性就使得加密資料的大小增加。
例如,RSA使用1024位金鑰,最多隻能加密117位元組的資料元素,從而產生128位元組的密文。因此,如果你只用RSA加密一個大檔案,那麼最終加密的明文會比密文多出%9的資訊。對於10GB的訊息來說,這就是900M的冗餘資訊。除此之外,對稱加密只會產生固定的開銷。在大多數場景下,網路頻寬都是比CPU要更稀缺的資源
因此出現了金鑰協商的方案。這跟公鑰密碼非常像。

迴歸正題

crystal kyber其實就是這樣一個用非對稱加密的思想去封裝金鑰並進行金鑰協商的演算法。主要聚焦的也是在KEM(key encapsulation mechanism)
在這裡插入圖片描述

如何生成pk和sk,並且pk不會暴露sk的資訊?

這裡就用到了LWE(learning with errors)問題。LWE是格上的一類困難問題。Crystal kyber演算法用到了環上的LWE問題(Ring-LWE)。

什麼是LWE問題?

  • 已知一種情況: s ∈ Z q n \boldsymbol{s} \in \mathbb{Z}_{q}^{n} sZqn(其中 Z q n \mathbb{Z}_{q}^{n} Zqn相當於一個n維向量,每一維都是 Z m o d q \mathbb{Z} mod q Zmodq,也就是 { 0 , 1 , 2 , . . . , q − 1 } \left\{0,1,2,...,q-1\right\} {0,1,2,...,q1}), a ∈ Z q n \boldsymbol{a} \in \mathbb{Z}_{q}^{n} aZqn, b ∈ Z q b \in \mathbb{Z}_{q} bZq,則 ( a , b ) ∈ Z q n × (\boldsymbol{a}, b) \in \mathbb{Z}_{q}^{n} \times (a,b)Zqn× Z q \mathbb{Z}_{q} Zq。那麼我們可以想象一個黑盒,黑盒內部的運算規則為,輸入 a \boldsymbol{a} a,經過 < s , a > <\boldsymbol{s},\boldsymbol{a}> <s,a>的點乘運算後,得到 b b b。在外界看來,不知道 b b b是怎麼獲得的,只知道 a \boldsymbol{a} a b b b,在這種情況下,求出 s \boldsymbol{s} s是容易的。
  • 另一種情況:黑盒中的點乘運算加入了誤差項 e {e} e,也就是 b = < s , a > + e b=<\boldsymbol{s},\boldsymbol{a}>+e b=<s,a>+e,這個 e {e} e可以是任意的噪聲,這個時候,外部再要通過 a \boldsymbol{a} a b b b求出 s \boldsymbol{s} s就非常困難了。

環LWE還沒講所以先空在這下次補充

上面我們知道了環LWE問題求解 s {s} s是困難的,因此可以利用這個困難問題去生成 ( p k , s k ) (pk,sk) (pk,sk)金鑰對。
主要流程如下。
在這裡插入圖片描述

在這裡插入圖片描述
下面我們依次解讀其中用到的演算法。

B 32 \mathcal{B}^{32} B32表示長度為32的8位無符號整數字節矩陣,通過呼叫randombytes函式得到。
https://github.com/dsprenkels/randombytes

  • G G G函式用SHA3-512例項化
    在這裡插入圖片描述

  • P a r s e Parse Parse函式

Input:位元組流B
Output:多項式環
	i:=0
	j:=0
	while j<n do
		d1:=bi+256*(bi+1 mod+ 16)
		d2:=round(bi+1/16)+16*bi+2
		if d1<q then
			ajhead:=d1
			j:j+1
		end if
		if d2<q and j<n then
			ajhead:=d2
			j:=j+1
		end if
		i:=i+3
	end while
	return a0head+a1headX+...+an-1headXn-1

在這裡插入圖片描述
注:這裡有個疑問,怎麼實現   m o d   + \bmod ^{+} mod+
P a r s e Parse Parse函式的輸入是 X O F ( ρ , j , i ) \mathrm{XOF}(\rho, j, i) XOF(ρ,j,i) X O F \mathrm{XOF} XOF剛剛有提到是SHAKE-128

  • C B D CBD CBD函式(“center binomial distribution”)

相關文章