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に私の公開鍵と暗号文取る:私はこれを実行すると、$cleartext
がnull
ある
$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はデコードに問題があるようです。
なしでは十分ではなかったですRSAとbase64はどのような順序で動作しますか? javascriptがbase64で最初にエンコードしてから暗号化すると、PHPは逆の処理を行い、提供されたフォーマットでは動作しないため、デコード/復号化は 'null'を返します。 – Glubus
私はJSバージョン私は、暗号化、信じてbase64エンコードと思います。結果出力は確かにbase64です。その後、PHPでは、関数は通常、バイト列の入力を受け取ります。したがって、base64は、decryptメソッドに入れる前に手動でデコードします。私は両方のライブラリで、これらが入力と出力のフォーマットであることを検証しようとしました。 – DAB
Alrighty(あなたの質問にこれを編集したいと思うかもしれません)、cyphertextの送信がうまくいっていることを確認しましたか? '$ cyphertext'が設定されていますか? (頼むのは申し訳ありません)。また、符号化前の暗号文が復号後の暗号文と等しいかどうかを検証する。 – Glubus