Pycrypto RSA PKCS1 OAEP SHA256 Взаимодействие с Java

Я использую следующий код в Python + Pycryptodome (вилка Pycrypto) для шифрования сообщения с помощью RSA PKCS # 1 OAEP SHA256 (RSA/ECB/OAEPWithSHA-256AndMGF1Padding):

from Crypto.Cipher import PKCS1_OAEP
from Cryptodome.Hash import SHA256
cipher = PKCS1_OAEP.new(key=self.key, hashAlgo=SHA256))
ciphertext = cipher.encrypt(cek)

и следующий код на Java для его расшифровки:

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

byte[] cek = cipher.doFinal(ciphertext);

Однако я получаю:

Exception in thread "main" javax.crypto.BadPaddingException: Decryption error
    at sun.security.rsa.RSAPadding.unpadOAEP(RSAPadding.java:499)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:293)
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
3 062
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Sun JCE RSA/ECB/OAEPWithSHA-256AndMGF1Padding фактически означает:

  • Хеш = SHA256
  • MGF1 = SHA1

Pycrypto (включая Pycryptodome), с другой стороны, предполагает следующее при использовании PKCS1_OAEP.new(hashAlgo=SHA256):

  • Хеш = SHA256
  • MGF1 = SHA256

Чтобы Pycrypto был совместим с Sun JCE, вам необходимо настроить функцию Pycrypto OAEP MGF1 на использование SHA1, передав аргумент mgfunc:

from Cryptodome.Cipher import PKCS1_OAEP
from Cryptodome.Hash import SHA256, SHA1
from Cryptodome.Signature import pss

cipher = PKCS1_OAEP.new(key=self.key, hashAlgo=SHA256, mgfunc=lambda x,y: pss.MGF1(x,y, SHA1))
ciphertext = cipher.encrypt(cek)

Стоит отметить, что согласно выход из строя RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING, BouncyCastle использует SHA256 как для хэша, так и для MGF1 так же, как и Pycrypto.

Другие вопросы по теме