RSA 填充是如何工作的?
我在網上到處都讀過,人們說純文字 RSA 非常不安全。為了安全起見,您可以對其進行填充,但在任何地方都沒有顯示如何操作的範例。它解釋說,隨機數據被添加到加密過程中以改變最終加密,因此與看起來相似的加密相比,它不能被隨機猜測。
到目前為止,我的理解是你有一個純文字,你把它變成一個散列並用額外的字節填充它,然後你加密它並發送它,然後它被解密成一個帶有字節的散列並變成純文字。填充物去哪兒了?您是否將隨機“垃圾”字節添加到純文字中以填充它,然後對其進行散列和加密?或者你在加密過程中做了一些額外的數學運算嗎?這個過程是什麼?如何弄清楚什麼是填充字節,什麼不是?
除此之外,您如何將其從散列中轉回文本?如果我用鹽把它變成 SHA-512 散列怎麼辦?一旦他們解密 RSA 以找到散列,該人將如何解密數據?我對這個過程的理解是錯誤的嗎?將純文字轉換為十六進制有什麼幫助嗎?
雖然 OAEP 在明文上使用單向函式,但它並不完全是散列:它稱為遮罩生成函式 (MGF),與散列不同,它可以根據需要產生盡可能多或盡可能少的輸出(輸出長度為函式的參數,並且輸入長度與輸出長度解耦)。這個輸出應該是偽隨機的。
你在一個名為 Feistel 網路的結構中使用它。將消息填充到長度 $ k $ (所以你最終會通過 $ k $ 位通過教科書 RSA),您創建兩個塊。其中之一(種子 $ S $ ) 是一個短的固定長度的隨機字元串;另一個(數據塊 $ D $ ) 更長,並且包括消息和一些更傳統的填充(細節並不重要),因此這兩個塊的組合長度為 $ k $ .
一旦你有了這些塊,就該使用你的 MGF。你首先執行 MGF $ S $ 只要得到一個面具 $ D $ ; 你 XOR 那個面具 $ D $ 要得到 $ D^\prime $ . 然後執行 MGF $ D^\prime $ 只要得到一個面具 $ S $ , 並與 $ S $ 要得到 $ S^\prime $ . 連接 $ D^\prime $ 和 $ S^\prime $ 得到你通過 RSA 的東西。
在另一端,你解密得到 $ D^\prime $ 和 $ S^\prime $ . 你先恢復 $ S $ 通過計算 $ MGF(D^\prime) $ 和異或 $ S^\prime $ (這正是你所做的 $ S^\prime $ ; 反過來也一樣)。一旦你有 $ S $ , 你異或 $ D^\prime $ 和 $ MGF(S) $ 要得到 $ D $ ,一旦你有 $ D $ 您取下正常填充以獲取消息。
Feistel 網路通常是將單向函式轉換為可逆函式的好方法。一般來說,你把你正在處理的東西分成兩個塊, $ A_1 $ 和 $ B_1 $ (這些有固定的長度)。然後你計算 $ A_{i+1}=A_i\oplus f(B_i) $ 和 $ B_{i+1}=B_i\oplus f(A_{i+1}) $ , 並重複直到你有 $ A_n,B_n $ 作為你的輸出。為了扭轉它,你計算 $ B_{i-1}=B_i\oplus f(A_i) $ 和 $ A_{i-1}=A_i\oplus f(B_{i-1}) $ ,並重複,直到你有 $ A_1,B_1 $ 再次。這種結構用於多個分組密碼;那裡, $ f $ 也需要一個子鍵作為輸入,所以沒有子鍵你不能反轉網路。它在硬體方面特別好;Feistel 網路意味著加密和解密幾乎相同(您基本上只是顛倒了子密鑰的順序)。