как зашифровать открытый текст с помощью открытого ключа rsa, созданного С#.net, и расшифровать в С#

Пример кода в php с использованием phpseclib с RSA XML FORMAT PUBLIC AND PRIVATE KEY:

ПРИМЕЧАНИЕ. В этом ПРИМЕРЕ PHP: ОБЩИЙ И ЗАКРЫТЫЙ КЛЮЧ ФОРМАТ RSA XML, созданный c#.net, и данные успешно расшифрованы в этом примере php.

include 'vendor/autoload.php';
$rsa = new \phpseclib\Crypt\RSA();

//extract($rsa->createKey());

$publickey1 = "<RSAKeyValue><Modulus>sNBrh+HL35mYAxWwd7nGOWkrj7If39+kzlUv3L+OSIHkZd0zocyyt8qkhLoN5RsgrqFyHXHScyZPA7A/eGjRYOGrpQZt8BU9PIv7CN6vDdSXyhb60xyhBGDLkVD0Z0898oCYEmQpHs+8KPNOIVbOJUqH38S+/G3zzJrEUUijU877Gr21E/0sqzZGWsuZdmccPGQeiyFcyghzVL5R5jwJNsNO+lm5VW0YmknMrbg2JOGV8Iv6olcrdskRYD9iZkJrWq4y/jES/1tjvIaaI16HUDSCSoico/xbWLNgQaIAGs9tf2nspyaPT3h17MCR0BkzgMkhhv/DYywYp5AQ7o8HdomO8PnlouV2yESu65hNNvEjHxsTt4iA+avxYX1YB2kjSg0aiinRBhoqW/65iW6+yQm2//LfSw0fzfowhS207vvX1b+nFHsZTLlhMrAfH7V5pSS2ProrgXIGduKTfmTmfNz3X3DKeOuGRbA4gcA20gNN1smj/LPT1LlaIiwytKbdvn4evBYJIJsf2+9xnYeqrPuJDROLrdaCXX/rsAbKEID3zds/nZevpE9jN0DJSCwsr+2eDMz3AgYA0Ihn8RIj46ba/GRCd8TGs/O0Q78bB41nvBVgZ3xPVZgL+ObJiIw0n3OGDAfMR7yabsk3aMYSfKLuFWtqooGei5PKZ7LXnL+8OG/fy8KIsNSPEHu0t+SutI2LNIfkk0iOw9G1DPFdwY5VwPfMf1ao3ZXnJxrixuP0w4lHpKMhckPyoqYrblVkMHXP8Vdpc5YwamXMXb/Zo2xxjpY8cPi1oUjJRMt7GzuKDFK9wH1CSIXZlAyLzB4ijK3kK81um9plUguCJHYzrw==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

$privatekey1 = "<RSAKeyValue><Modulus>sNBrh+HL35mYAxWwd7nGOWkrj7If39+kzlUv3L+OSIHkZd0zocyyt8qkhLoN5RsgrqFyHXHScyZPA7A/eGjRYOGrpQZt8BU9PIv7CN6vDdSXyhb60xyhBGDLkVD0Z0898oCYEmQpHs+8KPNOIVbOJUqH38S+/G3zzJrEUUijU877Gr21E/0sqzZGWsuZdmccPGQeiyFcyghzVL5R5jwJNsNO+lm5VW0YmknMrbg2JOGV8Iv6olcrdskRYD9iZkJrWq4y/jES/1tjvIaaI16HUDSCSoico/xbWLNgQaIAGs9tf2nspyaPT3h17MCR0BkzgMkhhv/DYywYp5AQ7o8HdomO8PnlouV2yESu65hNNvEjHxsTt4iA+avxYX1YB2kjSg0aiinRBhoqW/65iW6+yQm2//LfSw0fzfowhS207vvX1b+nFHsZTLlhMrAfH7V5pSS2ProrgXIGduKTfmTmfNz3X3DKeOuGRbA4gcA20gNN1smj/LPT1LlaIiwytKbdvn4evBYJIJsf2+9xnYeqrPuJDROLrdaCXX/rsAbKEID3zds/nZevpE9jN0DJSCwsr+2eDMz3AgYA0Ihn8RIj46ba/GRCd8TGs/O0Q78bB41nvBVgZ3xPVZgL+ObJiIw0n3OGDAfMR7yabsk3aMYSfKLuFWtqooGei5PKZ7LXnL+8OG/fy8KIsNSPEHu0t+SutI2LNIfkk0iOw9G1DPFdwY5VwPfMf1ao3ZXnJxrixuP0w4lHpKMhckPyoqYrblVkMHXP8Vdpc5YwamXMXb/Zo2xxjpY8cPi1oUjJRMt7GzuKDFK9wH1CSIXZlAyLzB4ijK3kK81um9plUguCJHYzrw==</Modulus><Exponent>AQAB</Exponent><P>5YtctO1LF3/S8cbDqyKFK0SXT0xNSJ/IQ8hLzRG5okx52U8/pbirFa37yjkmtlMCfOHfFm5zD5OdmP4Rsdbs9WanSgkBt/rEBfokvuBuJoa77RsO8JhFqg/yvkcA+7uKeEwwc9ONLLRcull3fvCm0qiAea2eaG5Aur5WBOi9jMdTwJrXoWdCQljITcH6c+7ymthGzcWTWCxcc2j+wx/72LWn1ar9iWa83Nl9E8ohwsOpRXBV2O/IKFQK+G3XNIeoDQVXIuxT3h1yqM40Fq3+DOF6jblfOTzkKReN76Ij5Glayn7JjmE5aC/OFX5D4EgbDdprBztrW+irsHNNi/Hv3u2kgneRHzs/ZgI0fBf0MP4yVZH/LziXal0XKCODe2deyWH/EyqUOFPRFwFQERlj6eGv/JKVKJRXgkSOzGGyjrc=</P><Q>xTFEmuXayX3UmXKyuhUM/aztTssl/DpTHqerfgKcG6ldbakrPLVjohFKzHtyttWwNXPgh3bBP51vrocYK9pUBSvMmVpemsCECQQHlyQpfgHsM/g27wAVxkvJMfLCW5iIbj4MPr0opxEsrvvKs8sN9MQu10DS5VQU4or7aiMtBK5wLgknY4I3bth3DACEFLN9/Qmh6w9mKqZo/3vcDbSteQ6ByBRoGBH7/W8+aIoNVlz9WaEXRjyj5UEEUa29eth5LgSJKK+0Hc9GwJtE3D78Lsq1loIu86nX/TKBLNjKlnrj7pXQJV14PnNzgEciMWNYJWirk1xa1XdyMbQmYvfzT00/hSlbECp53cRXVWMvNGsz7pHvyhUQv02XjY+hLNVXjxjRKuQEzfO8+ByYFA1J0jJ921AyfUljtcLvGDbXCsk=</Q><DP>mi8rHWiK2QUGN1rwkaJFWxPeoug4vUB+b3E54Uw3qdm+uwYtVW6elJhiGaqb4zoM4L+DbvjPlrXr1RlL323jis7iLauxGNh7FRy50/DCbGRyFMjpFxjhKmM+BSuCcJS/ZSCgJx0BpfaclpuD1aNmGvgOHC1PywvLtOQmuXNv5wD4s9YOYx8N9azXFsvmJDtrgDEoFg3RdBeQHgF3pq90JlOWocISPVniIGKCTmmmlcGBkN/s+iPOCbCyEb8OH/3DFsPwjMe7aeXT36lqeZVzoUlPXaUXXkYVZ7inoUAC5ekSkBPr5RRPUDlUL0G57AvjCEIfRCNYcMrvkD1S6F6hZdeweeZAd37/jdCLWpNodgQ44RuJEjnsEwjmhhKcvaZol9KYWFJwbwl12AMMuf+ZCj+LS5dWU4SY5yqP1J8HJi8=</DP><DQ>aClALfogebKH7I5TrkuUUyNXLvnMFNHSOi0jPyqtv0bVXSmw9x5xhJhRxHWpAL8blwCgp62pIqtM5QnjULbBDwI1zwOXWXM7y29fewzVBgSJ+mGw0spetiIuIr4ywCNwXZtU6IcOxEEkM0I5roMh2hsPCxDo1c52QbxcVZJDI2fpRcf8EGomUdzx9VsIac7uTA0chIfb1ceVSu7oLC02PO3WzBNLcPt++j4a3ymdJfN0uDWJj8ZUZLLVTzfREOTsDczDjsRRBjYJD5B07Uov95+ID/qwRnF+7/YPmdriGF7Nq6djDXm0HHjrl+T7QM9TLl990hdEu+GeZnbcmAaVdVw+o15XBdEKEoS2BRqhQrUl920LFtnNwN+BoHswDfibibD4PAm6J/gJ551jD6R9TBTzujdAlEGB8+8GUOoW6VE=</DQ><InverseQ>ZFoiU0pJDAkv6A/wPCTy+VotM13sKEUoLELlDpbYZlWbux/16r8/D8pGhmvfBLqM7bDDCJaBsCRCswpAAGdNcGhC0C1eMSohmzdTv9Md5/Ep0vtNjuy0mNZ00DUP1Y6KuSP0c5L2vDnjNoARk6B57E/NKZqpNoz7oPwjwV8+/3HSW7bcl/yYXatmBxMlKuUwe4GHzMVBrdoHaWDVoHbtvcTb8gqAf5eSJAiAs2T1gCahK8Sy5/CbtHtCbtBi5sm7sISWSLpg0sO6JRchC3JRKpoygPxT2dyKvOqUjZzvzB6bjWP+1eT8h13DUVmsWydfqE+vzcbMjjKxzX8LuN+qMl4YZ6teGvSTFr+EE2zIsfv83+AfmMdCKQU7mWibk7X5iu8dWSatUGkAny4Mx0XBQc+2mgw1Hs3R8HmkOljoYd0=</InverseQ><D>IsHl0YFWhW75DeoulWqEh/afpJC8aVLaX+EpFnjlbGV0U33nT3Ag1bZVHu5AGwB5LTr5ZsZgO1iVgcEcyPu55RSXnEomRGK4dfWCdJzpxos7B3P6/JMNKAIrIjbKxKA0Kj6TJlJgLvlhIJ+rhSw+O+Bp01gmvxKSMW9fFid0S95NSFVwiixjooh5zhFl6nucdlasFmeJiQGeQlNjYCH/Ia/FD7uhjiRzCKlnPeMPabKauf2aWF1QYvplmwj6u+Vkmx/RUFyvQllhwsam+Dr12JNp5WLzf9z0y/v++Qfyg1KxULGu3rDazSF99Ptp7oF1uWRQXexbKVyawB225l5hdjDWU5KcTKhU8EtoI1H+I8XFRLEa8CI6UFo3ihWMv3AwircGt5A+0bdFCm6JZHXLtVNekPPaZzN+RAxhi1yPy8aMJPrs5h/tgMWdzW9Gl1aR362h8d6jKtQCTIXl50txiRFaOvZTRgdf5dZQAzcTv1/kIbqptebQWShTRGAX/CIERT0Bq4+U+lgY4a8f9rGAU5W9w8JliJd307cF8JqTrGzqoeNCEP05LpK2a3GTgKtb0Zsmp8gW/jkbZ5Ir3UgpJcbM9Rd5wUYLRXVUsUHTRWMjjNzoWAm0UCc8Bk/QJPR96eOecaoTRjyTgieC1ipTfHydv8g2Z1EX/Q3Q9qWa/UefV1rMI5HFaCt5/FmzZMMvt748psbYD2hOhVj2iwVcOWsT/mJE9WG6jWLT2KQl0wIYV7qzP+sSmk63QLCAavzUlKCCwyRA9kaukgsgoXll854RQXz92qxTxzdEj4Y+v5VpSBRiK8MU9I/BUfYX43+z9Q4e3B/x9UXFrnkmNkJdkQ==</D></RSAKeyValue>";

$plaintext = "invoice_number=1,100.00";

$rsa->setEncryptionMode(2); // encryption mode

$rsa->loadKey($publickey1);

$ciphertext = $rsa->encrypt($plaintext);

$rsa->loadKey($privatekey1);

echo $rsa->decrypt($ciphertext);

и далее шифрование данных с открытым и закрытым ключом rsa, отличным от xml, созданным c#.net

в этом примере шифрование и дешифрование данных становятся пустыми.

include 'Crypt/RSA.php';
$rsa = new Crypt_RSA();
//extract($rsa->createKey());
// when upper line make uncomment and below $privatekey and $publickey variable commented then this code encrypt and decrypt data successfully.

$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

$publickey = "-----BEGIN PUBLIC KEY----- BgIAAACkAABSU0ExAAQAAAEAAQAnh6FFs6kYe/gmb9dzqsQKmtjFE9mxNAe9mEU3OwOEEfyIwkAx0/8dwh12fuP4wzNbdZAq4mmqCE6Lo8wTNNIJVNYEhKq5chHg1+hPDgfETFgtEO54JZSg3cBZWEV/Tq3LHEX8CaLvHZxMEfFXbTfliFYMLoJ+YK1mpg9GYcmbrQ== -----END PUBLIC KEY-----";

$privatekey = "-----BEGIN RSA PRIVATE KEY----- BwIAAACkAABSU0EyAAQAAAEAAQAnh6FFs6kYe/gmb9dzqsQKmtjFE9mxNAe9mEU3OwOEEfyIwkAx0/8dwh12fuP4wzNbdZAq4mmqCE6Lo8wTNNIJVNYEhKq5chHg1+hPDgfETFgtEO54JZSg3cBZWEV/Tq3LHEX8CaLvHZxMEfFXbTfliFYMLoJ+YK1mpg9GYcmbrVmMAKSoOgETkkiJJzYmXftO3KOveBtvkAzjHxxSS1yP/Ba10BzeIleH96SbTuQtQRLXwRykdX9uazK+YsiSud9/PyLbgy5TI+o28OHq5P+0y5+a9IaAQ/92UwlrkHUYfhN/xTVlUIxKlTEdUQTIf+iHif8d4ABb3OdYJXZOW6fGeUP10jMyvbnrEoPDsYy9qfNk++0/8UP2NeO1IATszuZYg1nEXOW/5jmUxMCdiFydp9ES211kpEZ4XcvjGaDlaQ+bLWj05i2m/9aHYcBrfcxxvlMa/9ZvrX4DfPWeydUDDDQ4+ntpT50BunSvmyf7cUk76Bf2sPgLXUQFoufEQ5g1Qo/v1uyhWBJzh6OSUO/DDXN/s8ec/tN05RQQFZQ0na+v0hOCrV9IuRqtBuj4WAj1I/A1JjwyyP9Y/6yWFPM6EcS/6lyPy30lJPoULh7G29zkn7NVdTEkDtthdDjtX7Qhgd9qWvm5ADlmnvsS9A5m7ToOgQyOxtJoSlLitLbf/09LRycl/cdIzoMOCEdPe3DQcyEKqUPsghAq+DKw3uZpXwHzwTdfqlHSWAnHDggFKV1HZuWc1c4rV4k4b513TqE= -----END RSA PRIVATE KEY-----";

$plaintext = 'terrafrost';

$rsa->loadKey($publickey);
$ciphertext = $rsa->encrypt($plaintext);

$rsa->loadKey($privatekey);
echo $rsa->decrypt($ciphertext);

c#.net генерирует открытые и закрытые ключи rsa, отличные от xml:

 CspParameters cspParams = new CspParameters { ProviderType = 1 };
 System.Security.Cryptography.RSACryptoServiceProvider rsa = new                 System.Security.Cryptography.RSACryptoServiceProvider(1024, cspParams); 
 // Generate a new 2048 bit RSA key

 String public_key = Convert.ToBase64String(rsa.ExportCspBlob(false));
 String private_key = Convert.ToBase64String(rsa.ExportCspBlob(true));

Пожалуйста, помогите мне, почему данные не шифруются и не расшифровываются в php с использованием открытых и закрытых ключей С#.


person test comp    schedule 12.10.2015    source источник


Ответы (1)


  1. Вы используете две разные версии phpseclib. Для расшифровки вы используете ветку 1.0, а для шифрования вы используете ветку 2.0 или master.

    Итак, первое, что я бы порекомендовал, это использовать одну и ту же версию для обоих.

  2. Также было бы хорошо использовать константы вместо целых чисел, которым они соответствуют. например. не делай $rsa->setEncryptionMode(2) - делай $rsa->setEncryptionMode(Crypt\RSA::ENCRYPTION_PKCS1). По крайней мере, для вашего первого фрагмента кода с рабочим кодом.

  3. Для вашего второго фрагмента кода, где вы используете версию phpseclib, отличную от версии первого фрагмента кода... ваши ключи недействительны.

    Тот факт, что они начинаются с BgIAAACkAAB и BwIAAACkA... Ключи, начинающиеся с -----BEGIN PUBLIC KEY----- или -----BEGIN RSA PRIVATE KEY-----, должны начинаться с MIICXAIBAAKB или MIGfMA0GC. https://stackoverflow.com/a/21289989/569976 дает более подробное объяснение того, почему это так.

    Формат, в котором кажутся ваши ключи (и который вы, похоже, пытались вручную изменить в формат, поддерживаемый phpseclib), на самом деле является BLOB-объектом Microsoft Key. Я написал предварительный декодер здесь:

    https://stackoverflow.com/a/32486709/569976

    Было бы неплохо расширить это и включить в ядро ​​phpseclib, но посмотрим.

person neubert    schedule 12.10.2015
comment
Можете ли вы сказать мне, пожалуйста, что открытый и закрытый ключи RSA, сгенерированные С#, неверны, так как первые 2 символа закрытого ключа rsa и открытого ключа не совпадают. Вот почему phpseclib не может шифровать и расшифровывать данные. но эти же открытые и закрытые ключи rsa отлично работают в С#. пожалуйста помогите мне.. - person test comp; 13.10.2015
comment
Существует множество различных форматов ключей. phpseclib обрабатывает некоторые из них, но не все. Ключ BgIAAACkAAB... имеет формат, который phpseclib не поддерживает. Так что в отношении phpseclib это недействительно. И похоже, что вы пытались превратить ключ BgIAAACkAAB... в тот, который будет поддерживать phpseclib, добавив -----BEGIN PUBLIC KEY----- к ключу. Что, если это так, похоже на попытку преобразовать BMP в JPEG, изменив расширение файла. - person neubert; 13.10.2015
comment
Кроме того, как я уже сказал в своем посте, я проделал некоторую предварительную работу по поддержке формата ключа, который вы, похоже, используете. Вы можете увидеть эту работу на stackoverflow.com/a/32486709/569976 . Я могу расширить эту работу, но пожертвование PayPal или что-то в этом роде было бы неплохо. Вы можете пожертвовать на [email protected]! - person neubert; 13.10.2015
comment
@testcomp — основная ветка phpseclib теперь имеет встроенную поддержку MSBLOB. См. github.com/phpseclib/phpseclib/blob/master/phpseclib/Crypt/RSA/ . Имейте в виду, что ветка master находится в пространстве имен и требует автозагрузчика. - person neubert; 28.10.2015