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 плюс данные об этих ключах. Сертификаты X.509 используются в SSL, но не обязательны для использования RSA.