RSA Шифруют в PHP для дешифрования в.NET

В PHP я - RSA шифрование сообщения, которое будет дешифровано приложением.NET..., но я продолжаю получать "Плохое Ключевое" исключение из.NET....

Для шифрования RSA я использую ГРУШЕВЫЙ класс Crypt_RSA-> шифрующий с открытым ключом (который является модулем, парой экспоненты), я добираюсь от рабочей системы шифрования в.NET...

Я предполагаю, что самый легкий вопрос был бы->, действительно "Плохо Вводит", средний он не может дешифровать сообщение вообще? IE, это не шифруется правильно?

Более трудный вопрос->, там что-либо определенное относительно шифрования RSA, которое вызывает причуды между.NET и PHP?

9
задан neubert 4 July 2013 в 18:36
поделиться

2 ответа

Предупреждение системы безопасности : используйте OAEP, , а не PKCS # 1 .

Если вы хотите использовать решение, которое не требует расширения openssl, попробуйте Crypt_RSA phpseclib. Примеры:

Расшифровка с заполнением PKCS # 1:

openssl rsautl -inkey privatekey.txt -encrypt -in plaintext.txt -out ciphertext.txt

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
echo $rsa->decrypt(file_get_contents('ciphertext.txt'));
?>

Шифрование с заполнением PKCS # 1:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->loadKey($rsa->getPublicKey());
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
echo $rsa->encrypt('1234567890');
?>

openssl rsautl -inkey privatekey.txt -decrypt -in ciphertext.txt -out plaintext.txt

Расшифровка с заполнением OAEP:

openssl rsautl -inkey privatekey.txt -encrypt -oaep -in plaintext.txt -out ciphertext.txt

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
echo $rsa->decrypt(file_get_contents('ciphertext.txt'));
?>

Шифрование с заполнением OAEP:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->loadKey($rsa->getPublicKey());
echo $rsa->encrypt('1234567890');
?>

openssl rsautl -inkey privatekey.txt -decrypt -oaep -in ciphertext.txt -out plaintext.txt

phpseclib можно загрузить с http: //phpseclib.sourceforge. net /

Удачи!

14
ответ дан 4 December 2019 в 12:17
поделиться

Crypt_RSA на PEAR не использует кодировку PKCS # 1. Я подозреваю, что именно поэтому .NET выдает сообщение об ошибке.

В качестве примера взлома я создал php-скрипт, используя Crypt_RSA, чтобы зашифровать строку «1234567» (я пропущу показ загрузки ключа):

print $rsa_obj->encryptBinary("1234567", $key_pair->getPublicKey());

Получение вывода и передача его через командную строку openssl инструмент выдает следующую ошибку:

$ ./crypt | openssl rsautl -inkey privkey.pem -decrypt
RSA operation error
18437:error:04065084:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data too large for modulus:fips_rsa_eay.c:558:

openssl по умолчанию ожидает заполнения PKCS # 1, но добавление флага -raw (без заполнения) в openssl также не помогает.

Использование расширения openssl в php дает правильное заполнение (по умолчанию PKCS # 1, доступны другие):

$pem = file_get_contents("pubkey.pem");
$key = openssl_pkey_get_public($pem);

$encrypted = "";
if(openssl_public_encrypt("1234567", $encrypted, $key)) {
  print $encrypted;
} else {
  print "failed\n";
}

И код дешифрования в php:

$pem = file_get_contents("privkey.pem");
$key = openssl_pkey_get_private($pem);

$enc_data = file_get_contents("openssl.crypted");
$decrypted = "";
if(openssl_private_decrypt($enc_data, $decrypted, $key)) {
  print "$decrypted\n";
} else {
  print "failed\n";
}

Сертификаты в контексте RSA - это сертификаты X.509, которые ключи RSA плюс данные об этих ключах. ИКС.509 сертификаты используются в SSL, но не требуются для использования RSA.

3
ответ дан 4 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: