В PHP я - RSA шифрование сообщения, которое будет дешифровано приложением.NET..., но я продолжаю получать "Плохое Ключевое" исключение из.NET....
Для шифрования RSA я использую ГРУШЕВЫЙ класс Crypt_RSA-> шифрующий с открытым ключом (который является модулем, парой экспоненты), я добираюсь от рабочей системы шифрования в.NET...
Я предполагаю, что самый легкий вопрос был бы->, действительно "Плохо Вводит", средний он не может дешифровать сообщение вообще? IE, это не шифруется правильно?
Более трудный вопрос->, там что-либо определенное относительно шифрования RSA, которое вызывает причуды между.NET и PHP?
Предупреждение системы безопасности : используйте 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 /
Удачи!
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.