2016-03-25 5 views
2

JSでブラウザのデータを暗号化し、PHPでバックエンドで復号化しようとしています。PHPでnpm-rsaによって作成されたデータをどのように復号化できますか?

JSでは、browserifyを使用して作成されたnpm-rsaを使用しています。 PHPで 、私はphpseclibに

私のJSを使用しています:

key = new rsa({ 
      environment: 'browser', 
      encryptionScheme: 'pkcs1_oaep', 
      signingScheme: 'pkcs1-sha256', 
      b: 2048 
     }); 

cleartext = 'this is a test'; 
console.log(key.encrypt(cleartext, 'base64')); 
console.log(this.key.exportKey('pkcs8-private-pem')); 

私は、PHPに私の公開鍵と暗号文取る:私はこれを実行すると、$cleartextnullある

$rsa = new RSA(); 
$rsa->load($privkey, 'pkcs8'); 
$cleartext = $rsa->decrypt(base64_decode($cyphertext)); 

を。 Xdebugを使用すると、$rsa->load($pubkey, 'pkcs8');は、modulus、指数、素数、係数などのフィールドに、$rsaを設定しているように見えます。

私はdecrypt()を呼び出す前に$rsa->setHash('sha256');を試してみましたが、ハッシュ方法は暗号化にのみ使用され、復号化には使用されません。

また、秘密鍵を共有しているため、これは安全ではないことを理解しています。私は2つのライブラリ間の互換性を検証しようとしています。

私は両方のライブラリを個別に暗号化して解読できることをテストしましたが、JS libからPHP libへの鍵をとって私は動作できません。

EDIT: エクスポートされた秘密鍵:

-----BEGIN PRIVATE KEY----- 
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDX7/224Phogd/B 
4DGOf81GeNAkE0bAWieN9Tmq6S1Xe0iMY56J9hJ86HveCcJcJCMNAJtGVPjOObNf 
HZ58CUrqyMoj6VJ8wXGVPZuwkvBQrVFg4k/h+8+b3p5Z0cb8J9m8WWpnL/hifoyt 
9O7aEiSnkvHBWBgEK6qxEYVLJKUPI94HlZe4B+ScCaflUMw1/uMfp1pVGxVUAfER 
f8URfCjCUY8cL+yFNQ5/CVNMQ8CTlb6HItpfS/QVBqTUD3wNf97oFZDPzbFfFCD7 
M50NbCal6CfRTaMBPoWrhsUGVab/Nj81qcY7dpoYEFyLLnJ80jHR6+o1fKDSinuQ 
KIYkQ9PxAgMBAAECggEBANKs7tgx/anYrDo3RaJFxjzvOgM4W1rnmpfBnRXGkdo8 
CbgOqWrojXkYSWGEHABRsXDKGrQvyt9JJFu0Rh+14UXXyH/o7/WPtgVpKjDH63aK 
4k6n/k/4ocDtHYl8RatWJfTBODKcdrWByjceNLrF4MUtdHiyPhwzjkFbWrTJd9Cf 
3wEh0aD83JT/wg1VkRYEOdJTPeq2kCpgoukBFXYAnGj9DYL2+Kityhnx/GB0RG/8 
GGpMyG8R72P6zYkXr0YfLhGLlW7+XbLT+WiPThjT9+e00uPAKMj7d0qaerKR6Asf 
NGSAg83eWG9ZKT1GXtn8mOP6p+15DcVLBbFXvPAA/cECgYEA7IYRWGNhEJ9l+XJH 
DYQVndS9KN8+zMx5OM/wy47v9FiiwGdAnwwHFAX3GyZe6eJ2sAX73tPm56QadRPK 
HGZFNnYx3BBdcl7WKT13DrmgpsH9CO6ish+2TwHfYDqOKs5EvT3yHJIG4T/Z50JM 
bUKSdrndV6LtOT2gplLxjUwastUCgYEA6bf23y5p8t9Unn55bIYKdFWj/5kLJdI1 
d/MBP3eZ405veVzZqvhs04JscElx1M0U1mTx7g96IWnBTuqsgkU9TLlXg8N5nLM0 
AWVlFlu657NwJaAc9zfmaamI4UKwNHCXDoxx+u2zJuzNOJwttPV3d7NTBWZOh+P+ 
DEgAzNYOEq0CgYEA42Oo/U7dnHuCMCTbhnT7yzchfE/UMlRKHoJbP3f13PXx0gPy 
LnYDwA5UGLf0++oKrQOzt/AEx6IPBYu2/UKdO9S57pWVIUVno1JCSdfQSUGqoJG7 
vH+cZ6ynMf5Ze3G+yCjrwOfq0VbviNNGYqxj3tylnYE3i5ZiAkUvkOYfrNkCgYBa 
rZBvyN88Zt+62pEbxOm7dxq46VUE6IjsL/EVAb9IDL99U8Pz7Iy0h06xRh2PFb52 
7BVdas3UtuZUSwKBTIHbCbHlomrFnFWaEQ/mW9KpYNorDvMOC7cu2aMM2sXooqJI 
976lP6IZgRiiVR36rp4aaA3W83mWiaOgejMtRgORxQKBgQDTMG0Wl3FbPZ57uqmi 
rE2Gwr1TiZ7LcYSEt4Z7KQV/u0Q7b9hyNXctaK2DzcEz+wA1eiAzioC9ZULOVVvW 
xZzVvj2D741A6EXMITa3E/Wv1XkbotNg8RXG8lvNY/IJ+35TZGBNzJ4gD+n0lOCK 
IrdIMYPrt9dcGIqqRE4wwaeLmA== 
-----END PRIVATE KEY----- 

暗号文:

mbPLBF3YNmyb5AD1vk6D8K0C9AiRU3C2a2aCKXpzDXb1uUCy7KYUFB3bOoU4ZhU7RXcWr9VHZq3APxtdyqKyEqr48NqVEPeBuYsDjcgDfPBFdPXf36f1FveeCJ7cFtHIvGy9/2EHIyNyXKy/6VaoakGRwBB3V14shXdqCDIW2FfEdUcfka5X8sAroq9pKrTGbN21hwtbiAjP2MmTHDYWu1zhDmrKxdcBbP6wdBgnZodCwGhBw11uXoEAnL1/yYFFqGZeKAhzxfjdPY2irvAuQOPN3U7UDBF0zhyMNF07JbCccCsNIguX4esferShw8w1mVzAxgwHzbjDpudko1/VSg== 

は、私は2つのファイル、privatekey.pemとcypher.textにこれらを救いました。これを復号化する

cat cypher.text | base64 --decode > -in cypher.bin 

と使用のopenssl:それから私は、暗号文を復号しBASE64

openssl rsautl -decrypt -inkey privatekey.pem -in cypher.bin -oaep 

これは私に平文を与えます!だから、phpseclibはデコードに問題があるようです。

+0

なしでは十分ではなかったですRSAとbase64はどのような順序で動作しますか? javascriptがbase64で最初にエンコードしてから暗号化すると、PHPは逆の処理を行い、提供されたフォーマットでは動作しないため、デコード/復号化は 'null'を返します。 – Glubus

+0

私はJSバージョン私は、暗号化、信じてbase64エンコードと思います。結果出力は確かにbase64です。その後、PHPでは、関数は通常、バイト列の入力を受け取ります。したがって、base64は、decryptメソッドに入れる前に手動でデコードします。私は両方のライブラリで、これらが入力と出力のフォーマットであることを検証しようとしました。 – DAB

+0

Alrighty(あなたの質問にこれを編集したいと思うかもしれません)、cyphertextの送信がうまくいっていることを確認しましたか? '$ cyphertext'が設定されていますか? (頼むのは申し訳ありません)。また、符号化前の暗号文が復号後の暗号文と等しいかどうかを検証する。 – Glubus

答えて

1

それは、ハッシュはBOTHで復号化方法で設定する必要があることが判明:私はsetHash()でそれを試してみましたが

$rsa->setMGFHash('sha1'); 
$rsa->setHash('sha1'); 

、それはあなたが知っているにもsetMGFHash()

関連する問題