Pycrypto RSA PKCS1 OAEP SHA256 Совместимость с Java - PullRequest
0 голосов
/ 17 мая 2018

Я использую следующий код в Python + Pycryptodome (Pycrypto fork) для шифрования сообщения с использованием 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)

1 Ответ

0 голосов
/ 17 мая 2018

В Sun JCE RSA/ECB/OAEPWithSHA-256AndMGF1Padding фактически означает Hash = SHA256 и MGF1 с использованием SHA1.Pycrypto *, с другой стороны, предполагает MGF1 + SHA256, когда Hash = SHA256.

Вам необходимо соответствующим образом настроить Pycrypto *, передав правильный механизм хеширования в функцию MGF1:

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 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...