Hash

在 PKCS#1 V2.2 中,MGF 是否應該基於 RSA-OAEP-ENCRYPT 使用的相同雜湊函式?

  • July 14, 2016

PKCS#1 v2.2的第 7.1.1 節中,給出了 RSAES-OAEP-Encrypt 的兩個選項:

  • 雜湊
  • MGF

同一文件的附錄 B.2.1 指出 MGF1 基於散列函式。

MGF1 是基於被選作 RSAES-OAEP-Encrypt 選項的相同散列函式,還是不同的散列函式?

如果它們可以不同,那麼它們在哪些常見的實現中有所不同?

第一個散列僅用於散列標籤。大多數時候標籤只是空的,這意味著可以使用一個常量值,僅由雜湊算法本身標識。

儘管雜湊值可能不同並且可能具有任何 SHA-x 值,但它們通常設置為 SHA-1 - 這是預設值。請注意,對於 MGF-1,SHA-1 被認為是安全的。它也可以保存在空字元串上使用。所以通常使用 SHA-1 是沒有問題的,幾乎沒有理由使用另一種雜湊算法。

因此,通常您會發現兩種實現:一種始終保持預設值(SHA-1 兩次),另一種是可配置的,例如 Oracle 的 Java 中的一種(或 Bouncy Castle)。除非另有說明,否則可配置的也將保持預設值。

直到今天,我遇到的所有 OAEP 實現都預設使用 SHA-1,但我想在這個世界上可能會有一個選擇不同的雜湊(如果只是為了完全避免 SHA-1)。


瞧,一種“不平衡”的 OAEP 加密(使用 Oracle 的 Java 8):

MGF1ParameterSpec mgfSpec = new MGF1ParameterSpec("SHA-256");
// the "label", currently encoded to zero bytes
PSource pSource = new PSource.PSpecified(new byte[0]);
OAEPParameterSpec oaepSpec = new OAEPParameterSpec("SHA-512", "MGF1", mgfSpec, pSource);

Cipher oaep = Cipher.getInstance("RSA/ECB/OAEPPadding");
oaep.init(Cipher.ENCRYPT_MODE, kp.getPublic(), oaepSpec);
byte[] nothingEncryptedReallyWell = oaep.doFinal();
System.out.println(Hex.toHexString(nothingEncryptedReallyWell));

引用自:https://crypto.stackexchange.com/questions/37726