Эквивалент Java RSA/ECB/OAEPWITSHA-256ANDMGF1PADDING в PHP

У меня есть случай, когда «секрет» приходит ко мне из приложения Java и шифруется с использованием открытого ключа и шифра RSA/ECB/OAEPWITSHA-256ANDMGF1PADDING. Я пытаюсь его расшифровать, но не знаю, как получить эквивалент этого шифра. Я использовал phpseclib для других целей безопасности и пробовал там режим шифрования OAEP, но безрезультатно. Я просто получаю ошибку расшифровки без информации. Я просто хочу заявить, что ключи верны:

function oaes_decrypt($ciphertext, $privatekey) {
    $rsa = new \Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
    $rsa->setMGFHash('sha256');
    $rsa->setHash('sha256');
    $rsa->loadKey($privatekey);

    return $rsa->decrypt($ciphertext);
}

Любая помощь будет оценена! Благодарю вас!


person Meezaan-ud-Din    schedule 20.08.2015    source источник
comment
secure.php.net/manual/en/function.openssl- private-decrypt.php Это кажется наиболее вероятным кандидатом, хотя OPENSSL_PKCS1_OAEP_PADDING не кажется таким конкретным. Я не знаю, сможете ли вы сделать это таким образом; вы рассматривали возможность использования libsodium вместо этого? crypto_box_seal() и crypto_box_seal_open() подойдут для этого варианта использования.   -  person Scott Arciszewski    schedule 20.08.2015
comment
Спасибо, Скотт. Я попробую метод PHP open ssl с OPENSSL_PKCS1_OAEP_PADDING и посмотрю, поможет ли он. В противном случае я посмотрю github.com/jedisct1/libsodium-php.   -  person Meezaan-ud-Din    schedule 21.08.2015
comment
openssl_private_decrypt() не работал. Дам вам знать, как у меня дела с libsodium.   -  person Meezaan-ud-Din    schedule 21.08.2015
comment
К сожалению, мне придется сделать это в Windows. Кто-нибудь знает, как заставить libsodium работать в Windows без Vsual Studio?   -  person Meezaan-ud-Din    schedule 21.08.2015
comment
doc.libsodium.org/bindings_for_other_languages/index.html   -  person Scott Arciszewski    schedule 21.08.2015


Ответы (1)


Попробуйте $rsa->setMGFHash('sha1'); SHA-256 в RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING не относится к хешу MGF1. Чтобы это было sha256, вам нужно сделать это:

Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT);
oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams);
byte[] pt = oaepFromInit.doFinal(ct);
System.out.println(new String(pt, StandardCharsets.UTF_8));

Окончательный результат, который работает в PHP:

function oaes_decrypt($ciphertext, $privatekey) {
    $rsa = new \Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
    $rsa->setMGFHash('sha1');
    $rsa->setHash('sha256');
    $rsa->loadKey($privatekey);

    return $rsa->decrypt($ciphertext);
}
person neubert    schedule 23.08.2015
comment
Да, это то, что я пробовал сегодня утром (по совету кого-то другого, и это сработало). Я добавлю к вашему ответу, а затем приму его. Спасибо. - person Meezaan-ud-Din; 24.08.2015