Есть ли способ генерировать PSS дополненные подписи в PHP? - PullRequest
2 голосов
/ 12 декабря 2011

В 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?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

У меня были те же потребности, что и у вас, но в 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);
0 голосов
/ 13 декабря 2011

Чтобы не быть "Тем парнем", я решил оставить ответ на вопрос, учитывая, как это все-таки отображается в Google и все;)

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

Я уверен, что у вас будетудачи, будущий человек!

-CPD

...