现代密码学3.7--CCA安全
現代密碼學3.7--CCA安全
- CCA安全
- 含oracle的實驗過程PrivKA,Πcca(n)PrivK^{cca}_{\mathcal{A},\Pi}(n)PrivKA,Πcca?(n)
- CCA安全定義
- 對不滿足CCA安全的密碼方案的攻擊
- 簡單例子:對基于PRF構造的密碼方案的攻擊
- 復雜例子:對CBC的攻擊,padding-oracle
- 求出bbb
- 求出mmm的每一位
博主正在學習INTRODUCTION TO MODERN CRYPTOGRAPHY (Second Edition) --Jonathan Katz, Yehuda Lindell,做一些筆記供自己回憶,如有錯誤請指正。整理成一個系列現代密碼學,方便檢索。
- 第二章定義了完美安全及其對應的密碼方案“一次一密”,
- 第三章3.1、3.2定義了計算安全,3.3介紹了PRG和基于PRG構造的滿足計算安全的密碼方案;
- 3.4節定義了CPA安全,3.5節介紹了PRF和基于PRF構造的滿足CPA安全的密碼方案,3.6節介紹了PRG和PRF構造的流密碼和分組密碼;
- 3.7節
- 將介紹一種新的安全性:CCA安全,這種安全性是之前我們構造的密碼方案都不滿足的,non-malleability/不可延展性是滿足CCA安全的必要條件;
- 并以CBC分組密碼為例,表示對于這種不滿足CCA安全的密碼方案,可以進行怎樣的攻擊。
CCA安全
跟CPA安全很類似,除了encryption oracle外,多了decryption oracle,只有一個要求:不能問oracle跟挑戰密文一樣的密文。
含oracle的實驗過程PrivKA,Πcca(n)PrivK^{cca}_{\mathcal{A},\Pi}(n)PrivKA,Πcca?(n)
- 敵手A\mathcal{A}A已知安全參數1n1^n1n,有一個連接Enck(?)Enc_k(\cdot)Enck?(?)的oracle和連接Deck(?)Dec_k(\cdot)Deck?(?)的oracle,輸出等長明文m0,m1m_0,m_1m0?,m1?給加密者;
- 加密者任選b∈{0,1}b\in\{0,1\}b∈{0,1},輸出密文c←Enck(mb)c\leftarrow Enc_k(m_b)c←Enck?(mb?)給敵手A\mathcal{A}A,ccc是挑戰密文;
- 敵手A\mathcal{A}A在獲得ccc后,仍有一個連接Enck(?)Enc_k(\cdot)Enck?(?)的oracle和連接Deck(?)Dec_k(\cdot)Deck?(?)的oracle(可以根據ccc調整,繼續查詢),輸出猜測的b′b'b′;
- 如果b′=bb'=bb′=b輸出1,否則輸出0。
CCA安全定義
私鑰加密方案Π=(Gen,Enc,Dec)\Pi=(Gen,Enc,Dec)Π=(Gen,Enc,Dec)如果對于任意PPT敵手A\mathcal{A}A,都有一個可忽略函數negl滿足Pr[PrivKA,Πcca(n)=1]≤12+Pr[PrivK_{\mathcal{A},\Pi}^{cca}(n)=1]\le \frac{1}{2}+Pr[PrivKA,Πcca?(n)=1]≤21?+negl(n)(n)(n),則稱該方案Π\PiΠ在選擇明文攻擊下有不可區分的加密,是滿足CCA安全的。
安全性:多次加密的CCA安全=單次加密的CCA安全。
對不滿足CCA安全的密碼方案的攻擊
簡單例子:對基于PRF構造的密碼方案的攻擊
- 根據3.5節構造基于PRF的密碼方案Π\PiΠ:m0=0n:m_0=0^n:m0?=0n,m1=1nm_1=1^nm1?=1n,Enck(m)=<Fk(r)⊕m>Enc_k(m)=<F_k(r)\oplus m>Enck?(m)=<Fk?(r)⊕m>,c=<r,s>c=<r,s>c=<r,s>
- 如果修改ccc的第一個比特sss,記作c′c'c′;
- 因為c≠c′c\neq c'c?=c′,所以可以問decryption oracle;得到10n?110^{n-1}10n?1或者01n?101^{n-1}01n?1,那么就可以判斷是m0m_0m0?還是m1m_1m1?,這不滿足CCA安全。
所以,滿足CCA安全的密碼方案的必要條件是不可延展性:如果敵手修改一個給定密文,結果是一個無效密文或者解密得到一個與原始明文完全無關的明文。
復雜例子:對CBC的攻擊,padding-oracle
- LLL:塊長度
- bbb:需要被填充的字節數,b≠0b\neq 0b?=0,如果已經是不需要填充,則填充LLL個字節,有1≤b≤L1\le b\le L1≤b≤L
- 填充規則:如果需要填充1個字節,則填010101;如果需要填充4個字節,則填040404040404040404040404;如果需要填充bbb個字節,則填bbb個0b0b0b
- 加密:對明文mmm填充至LLL的倍數,對填充后的信息進行CBC加密
- 解密:按CBC解密,得到填充后的信息,找到最后一個字節0b0b0b,
- 如果后bbb個都是0b0b0b,刪去這bbb個0b0b0b,得到原始明文;
- 如果后bbb個不都是0b0b0b,則不符合填充規則,返回"bad padding" error。
- 根據這兩種不同的返回,我們可以求出bbb,進而求出明文信息的每一位。這種decryption oracle被稱為padding-oracle,對于不滿足CCA安全的CBC分組加密模式可以進行攻擊。
以3-block為例:IV,c1,c2IV,c_1,c_2IV,c1?,c2?,每個block長度為LLL,解密m2=Fk?1(c2)⊕c1m_2=F_k^{-1}(c_2)\oplus c_1m2?=Fk?1?(c2?)⊕c1?,c1c_1c1?改變則m2m_2m2?會相應改變
求出bbb
- 本來解密是正確的,改變c1c_1c1?的第一個字節,如果解密m2m_2m2?返回"bad padding"error,則說明c1c_1c1?(LLL長)的第一個字節就屬于padding位(那么后面都屬于padding位),而padding位1≤b≤L1\le b\le L1≤b≤L最多只有LLL位,那么b=Lb=Lb=L;
- 同理,如果改變第一個字節解密還是正確的,改變第二個字節返回error,則b=L?1b=L-1b=L?1。
求出mmm的每一位
- 取△i=(0…0∣∣0i∣∣0(b+1)…0(b+1)⊕(0…0∣∣00∣∣0b…0b)\triangle_i=(0…0 ||0i||0(b+1)…0(b+1)\oplus (0…0||00||0b…0b)△i?=(0…0∣∣0i∣∣0(b+1)…0(b+1)⊕(0…0∣∣00∣∣0b…0b),0≤i≤28?10\le i\le 2^8-10≤i≤28?1
- m2m_2m2?的最后一位是B0b…0bB0b…0bB0b…0b
- 現在修改c1c_1c1?為“c1⊕△ic_1\oplus \triangle_ic1?⊕△i?”,則m2m_2m2?最后一位相應改變為B⊕i∣∣(b⊕(b+1)…b⊕(b+1)B\oplus i||(b\oplus (b+1)…b\oplus (b+1)B⊕i∣∣(b⊕(b+1)…b⊕(b+1)
- 除非B⊕△i=b⊕(b+1)B\oplus \triangle_i=b\oplus (b+1)B⊕△i?=b⊕(b+1),解密m2m_2m2?會返回"bad padding" error;
- 我們只需要遍歷iii,找到某個iii使得解密m2m_2m2?不返回"bad padding " error,此時B=△i⊕b⊕(b+1)B=\triangle_i \oplus b\oplus (b+1)B=△i?⊕b⊕(b+1)。
- 按照求最后一位BBB的方式去求其他位。
總結
以上是生活随笔為你收集整理的现代密码学3.7--CCA安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初等数论--整除--两数乘积保持整除性
- 下一篇: 现代密码学5.1--哈希函数定义