Преобразование знака java rsa в php-код с помощью phpseclib

Может ли кто-нибудь помочь мне преобразовать знак java в код php с помощью phpseclib

public string SignData(string _data,string _priKey)
 {
 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
 rsa.FromXmlString(_priKey);
 UnicodeEncoding ByteConverter = new UnicodeEncoding();
 byte[] dataToEncrypt = ByteConverter.GetBytes(_data);
 byte[] signature = rsa.SignData(dataToEncrypt,'sha256');
 string result = Convert.ToBase64String(signature);
 return result;
 }

Я использую это, но это не работает (в laravel)

use phpseclib\Crypt\RSA;

$rsa = new RSA();
$rsa->setHash('sha256');
$rsa->setSignatureMode(2);
$privateXmlKey = '<RSAKeyValue><Modulus></Modulus><Exponent>AQAB</Exponent><P></P><Q></Q><DP></DP><DQ></DQ><InverseQ></InverseQ><D></D></RSAKeyValue>';
$rsa->loadKey($privateXmlKey, 2);
$text = 'sample data';
$plainText = mb_convert_encoding($text, 'UTF-16');
$sign = $rsa->sign($plainText);
$sign = base64_encode($sign);

Я пробовал оба режима подписи: CRYPT_RSA_SIGNATURE_PKCS1 и CRYPT_RSA_SIGNATURE_PSS

Большое спасибо

Что именно не работает? Какой результат вы получаете? Какой результат вы должны получить? Кроме того, ваш $privateXmlKey выглядит неправильно, в этих XML-данных отсутствует много информации. Какую версию "phpseclib\Crypt\RSA" вы используете? И не используйте магические константы, такие как 2, а вместо этого используйте определенные константы, такие как CRYPT_RSA_PRIVATE_FORMAT_XML и CRYPT_RSA_SIGNATURE_PKCS1. Как проверить подпись?

Progman 25.02.2019 20:49

xml является закрытым, поэтому я не могу показать его здесь, я его очистил. Результаты различаются между двумя функциями после подписания, я имею в виду функцию $sign из php и result из java с одинаковыми privatexmlkey и входной строкой. CRYPT_RSA_PRIVATE_FORMAT_XML и CRYPT_RSA_SIGNATURE_PKCS1 определяются из phpseclib.

ytdm 26.02.2019 00:30

@ytdm - тем не менее, это сделало бы код более читаемым, если бы вы использовали константы вместо чисел, которые они разрешают.

neubert 26.02.2019 02:53

@ytdm - ваш код Java больше похож на C#. В любом случае, я бы сказал (1) переименовать ваш вопрос, если мое предположение о С# действительно верно, и (2) сгенерировать закрытый ключ, которым вы готовы поделиться, который воспроизводит проблему. Опубликуйте его и подпись, которую вы получите как с кодом C#/Java, так и с кодом PHP. При использовании CRYPT_RSA_SIGNATURE_PSS следует помнить, что подпись будет отличаться каждый раз, когда используется рандомизированное заполнение.

neubert 26.02.2019 03:14

Спасибо, @neubert, ты напомнил мне, что подпись каждый раз будет разной. Таким образом, код подтверждения будет работать. Сейчас я не могу запустить код Java, чтобы убедиться, что оба работают одинаково.

ytdm 26.02.2019 13:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
159
0

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