. NET'te şifresini PHP RSA şifreleme

2 Cevap php

PHP ben. NET uygulama tarafından çözülebilecek bir mesaj şifreleme RSA değilim ... ama. NET bir "Bad Key" istisna elde tutmak ....

RSA şifreleme için, ben Crypt_RSA-> ben. NET'te şifreleme sistemi çalışan olsun (bir modül olan, üs çift) genel anahtar ile şifreleyerek ARMUT sınıfını kullanıyorum ...

Ben kolay soru> olmak "Bad Key" bu olursa olsun mesajı deşifre etmek mümkün değildir anlamına gelmez sanırım? IE, doğru şifreli değil mi?

Zor soru->. NET ve PHP arasındaki tuhaflıklar neden RSA şifreleme hakkında özel bir şey var mı?

2 Cevap

Eğer openssl uzantısını gerektirmeyen bir çözüm kullanmak istiyorsanız, phpseclib en Crypt_RSA deneyin. Örnekler izleyin:

Decryption with PKCS#1 padding:

openssl rsautl-INKEY privatekey.txt-şifreleme-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'));
?>

Encryption with PKCS#1 padding:

<?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-şifresini-in ciphertext.txt-out plaintext.txt

Decryption with OAEP padding:

openssl rsautl-INKEY privatekey.txt-şifreleme-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'));
?>

Encryption with OAEP padding:

<?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-şifresini-OAEP-in ciphertext.txt-out plaintext.txt

phpseclib http://phpseclib.sourceforge.net/ indirebilirsiniz

İyi şanslar!

PEAR üzerinde Crypt_RSA PKCS # 1 kodlaması kullanılarak değildir. Ben. NET size bir hata mesajı veriyor neden olduğunu sanıyorum.

Bu kırılma bir örnek olarak, (Ben anahtar yükleme gösteren atlarsınız) dizesini "1234567" şifrelemek için Crypt_RSA kullanarak bir php komut dosyası oluşturulur:

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

Bunun çıktısını alarak ve openssl komut satırı aracı aracılığıyla boru aşağıdaki hatayı veriyor:

$ ./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 varsayılan PKCS # 1 dolgu beklediğini, ancak openssl için-ham (hiçbir doldurma) bayrağı ekleme ya da yardımcı olmuyor.

Php openssl uzantısını kullanarak uygun padding (PKCS # 1 varsayılan, mevcut diğerleri) verir:

$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";
}

Ve php şifresini kod:

$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 bağlamında Sertifikalar bu anahtarlar hakkında RSA anahtarları artı veriler X.509 sertifikaları vardır. X.509 sertifikaları SSL kullanılır, ancak RSA kullanmak için gerekli değildir.