Есть ли способ сгенерировать подписи с дополнением PSS в PHP?

В PHP я хочу подписывать некоторые документы с заполнением PSS и дайджестом SHA512.

Согласно документам, на http://www.php.net/manual/en/function.openssl-sign.php, я могу установить дайджест, как мне нужно, используя строку, например

openssl_sign($text-to-sign,$binary_signature,$privkey,"sha512");

Однако я не вижу способа установить отступы.

Может ли кто-нибудь помочь мне понять, как я могу подписывать текст, используя стиль заполнения RSA-PSS, как показано в версии 2.1 PKCS # 1?


person Colin Davis    schedule 12.12.2011    source источник


Ответы (2)


Чтобы не быть «этим парнем», я подумал, что оставлю ответ на вопрос, учитывая, как это отображается в Google и все такое;)

Я могу получить дополнение PSS через http://phpseclib.sourceforge.net/ Пока что я не у меня нет возможности взаимодействовать с OpenSSL или LibTomCrypt, но ... я, вероятно, просто неправильно его конфигурирую.

Уверен, тебе повезет больше, будущий человек!

-CPD

person Colin Davis    schedule 13.12.2011

У меня были те же потребности, что и у вас, но в 2019 году (я полагаю, теперь у нас есть лучшие библиотеки;)

Как вы уже обнаружили, для этого используется phpseclib, который сейчас находится в версии 2.0 в Debian Stretch.

Генерация подписи

Это код, который я использовал для подписи некоторых двоичных данных, используя ключ 8192 RSA, с заполнением PSS и хэш-функцией SHA512:

require "/usr/share/php/phpseclib/autoload.php";
use phpseclib\Crypt\RSA;

// INPUT DATA
$privkey = "...";   // I used a RSA private key in PEM format, generated by openssl, but phpseclib supports many formats...
$mydata = "...";    // I generated some binary bytes here...

// SIGNING
$rsa = new RSA();
if ($rsa->loadKey($privkey) != TRUE) {
    echo "Error loading private key";
    return;
}
$rsa->setHash("sha512");
$rsa->setMGFHash("sha512"); // This NEEDS to be set, or the default will be used
$rsa->setSignatureMode(RSA::SIGNATURE_PSS); // This doesn't need to be set, as it is already the default value
$signatureBytes = $rsa->sign($mydata);

$signatureBytes - это двоичная строка (или массив байтов, как вы его называете в C / C ++ / C #). Он не имеет кодировки и может содержать NULL байты. Это ваша подпись розыска.

Боковое примечание: почти требуется установить php-gmp, иначе вы получите мучительно медленное время подписи. Здесь есть несколько тестов.

Проверка подписи с помощью OpenSSL

openssl dgst -sha512 -sigopt rsa_padding_mode: pss -sigopt rsa_pss_saltlen: -1 -verify pubkey.pem -signature signature.bin plaintextdata.dat

В деталях, -sigopt rsa_pss_saltlen:-1 указывает openssl использовать длину соли, которая соответствует размеру алгоритма хеширования. (это то, что делают API Microsoft, и нет никакого способа изменить это поведение)

Проверка подписи с помощью C ++ / CLI (.NET)

Чтобы иметь возможность использовать открытый ключ RSA в мире .NET без использования какой-либо другой библиотеки, вам необходимо сначала экспортировать его в формате BLOB с помощью openssl:

openssl rsa -pubin -inform PEM -in pubkey.pem -outform "MS PUBLICKEYBLOB" -out pubkey.blob

Затем вам понадобится .NET 4.6 с новым RSACng CryptoProvider.

И вот код:

// Import the public key (as BLOBDATA)
RSACryptoServiceProvider^ rsaCsp = gcnew RSACryptoServiceProvider();
rsaCsp->ImportCspBlob(pubkey);
RSAParameters rsaParams = rsaCsp->ExportParameters(false);

RSA^ rsa = gcnew RSACng();
rsa->ImportParameters(rsaParams);
array<Byte>^ dataBytes = ...;
array<Byte>^ signatureBytes = ...;
bool signIsValid = rsa->VerifyData(dataBytes, signatureBytes, HashAlgorithmName::SHA512, RSASignaturePadding::Pss);
person gog    schedule 23.05.2019