Подобные вопросы о Stackoverflow с дополнительной информацией см. В Maarten Bodewes ответы на , и , .
Часть «mode» строки преобразования не имеет никакого эффекта. Проблема в том, что разные провайдеры используют разные настройки по умолчанию. Это неудачно и совершенно определенно неоптимально. Должны ли мы обвинять Sun / Oracle? У меня нет мнения, кроме того, что я недоволен результатом.
OAEP - довольно сложная конструкция с двумя различными хеш-функциями в качестве параметров. Строка преобразования Cipher позволяет вам указать один из них, который вы указали как SHA-256. Однако функция MGF1 также параметризуется хеш-функцией, которую нельзя указать в строке преобразования шифра. По умолчанию провайдер Oracle - SHA1, а провайдер BouncyCastle - SHA-256. Таким образом, в действительности существует скрытый параметр, который имеет решающее значение для взаимодействия.
Решение состоит в том, чтобы более полно указать, что представляют собой эти скрытые параметры, предоставив OAEPParameterSpec
для метода Cipher.init(...)
, как в следующем примере:
Cipher encryptionCipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding", "BC");
OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1",
MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
encryptionCipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParameterSpec);
// ...
// ...
// ...
Cipher decryptionCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1",
MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
decryptionCipher.init(Cipher.DECRYPT_MODE, privateKey, oaepParameterSpec);
Первый из них, по сути, запрещен, потому что это уже значения по умолчанию для Bouncycastle.