Crystal Kyber密碼演算法解讀(一)
傳統的公鑰密碼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) C←Encpk(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} s∈Zqn(其中 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,...,q−1}), a ∈ Z q n \boldsymbol{a} \in \mathbb{Z}_{q}^{n} a∈Zqn, b ∈ Z q b \in \mathbb{Z}_{q} b∈Zq,則 ( 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”)
相關文章
- 機器學習:解讀基因密碼「食譜」機器學習密碼
- 重磅 | 我國《密碼法》正式頒佈,解讀密碼分類與密碼裝置管理密碼
- 大棚解讀卓越程式設計師密碼程式設計師密碼
- Vue原始碼解讀一Vue原始碼
- 密碼學系列之:bcrypt加密演算法詳解密碼學加密演算法
- 安天工程師解讀CryptKeeper通用密碼事件工程師密碼事件
- ConcurrentHashMap原始碼解讀一HashMap原始碼
- SnapKit 原始碼解讀(一):ExtensionsAPK原始碼
- 【密碼學原理】流密碼和RC4演算法密碼學演算法
- crystal-redisRedis
- 密碼學系列之:Argon2加密演算法詳解密碼學Go加密演算法
- mysql學習之-密碼管理(預設密碼,修改密碼,解決忘記密碼)MySql密碼
- 分組密碼(四)AES演算法① — 密碼學複習(七)演算法密碼學
- 常用密碼演算法要點密碼演算法
- 窮舉密碼演算法 (轉)密碼演算法
- 解讀KMP演算法KMP演算法
- 解讀排序演算法排序演算法
- 【原始碼解讀(一)】EFCORE原始碼解讀之建立DBContext查詢攔截原始碼Context
- №窮舉密碼演算法指要(原始碼) (轉)密碼演算法原始碼
- 拓端tecdat:解讀出租房市場的資料密碼密碼
- JDK 原始碼 Integer解讀之一(parseInt)JDK原始碼
- MySQL核心原始碼解讀-SQL解析一MySql原始碼
- 【詳解】ThreadPoolExecutor原始碼閱讀(一)thread原始碼
- 【解讀 ahooks 原始碼系列】DOM篇(一)Hook原始碼
- spring-MVC原始碼解讀(一)SpringMVC原始碼
- 密碼學之DES/AES演算法密碼學演算法
- 分組密碼(一) — 密碼學複習(四)密碼學
- 古典密碼學 (一)密碼學
- 密碼學常用解碼網站密碼學網站
- 【密碼學系列】|| 分組密碼的工作模式詳解密碼學模式
- 一位來自《seo實戰密碼》讀者的來信密碼
- 密碼學基礎概念 — 密碼學複習(一)密碼學
- 古典密碼的演化 (一)— 密碼學複習(二)密碼學
- mybatis原始碼解讀---一條sql的旅程MyBatis原始碼SQL
- Caddy 原始碼閱讀(一)Run 詳解原始碼
- 原始碼解讀: Vuex 的一些缺陷原始碼Vue
- Retrofit原始碼解讀(一)--Retrofit簡單流程原始碼
- 我的密碼演算法v1.0密碼演算法