Javascript で暗号化してから、PHP で復号化したいと考えています。Javascript と PHP の RSA 実装がありますが、互換性がありません。Javascript で暗号化したものを PHP で正しく復号化できません。
Javascript と PHP の両方で動作するライブラリ/コードを知っている人はいますか?
ありがとう。
Javascript で暗号化してから、PHP で復号化したいと考えています。Javascript と PHP の RSA 実装がありますが、互換性がありません。Javascript で暗号化したものを PHP で正しく復号化できません。
Javascript と PHP の両方で動作するライブラリ/コードを知っている人はいますか?
ありがとう。
次の簡単な例を試してください。
オープンソースのJavaScriptライブラリhttps://github.com/ziyan/javascript-rsaを使用しています
HTML / JAVASCRIPT:
<script language="JavaScript" type="text/javascript" src="jsbn.js"></script>
<script language="JavaScript" type="text/javascript" src="rsa.js"></script>
<script language="JavaScript">
function encryptData(){
//Don't forget to escape the lines:
var pem="-----BEGIN PUBLIC KEY-----\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfmlc2EgrdhvakQApmLCDOgP0n\
NERInBheMh7J/r5aU8PUAIpGXET/8+kOGI1dSYjoux80AuHvkWp1EeHfMwC/SZ9t\
6rF4sYqV5Lj9t32ELbh2VNbE/7QEVZnXRi5GdhozBZtS1gJHM2/Q+iToyh5dfTaA\
U8bTnLEPMNC1h3qcUQIDAQAB\
-----END PUBLIC KEY-----";
var key = RSA.getPublicKey(pem);
element=document.getElementById('password');
element.value=RSA.encrypt(element.value, key);
}
</script>
<form method='POST' id='txtAuth' onsubmit='encryptData()'>
<input type='text' name='username'/>
<input type='password' name='password' id='password' placeholder="password"/>
<input name='submit' type='submit' value='Submit'>
</form>
PHP:
<?php
if (isset($_POST['password'])) {
//Load private key:
$private = "-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDfmlc2EgrdhvakQApmLCDOgP0nNERInBheMh7J/r5aU8PUAIpG
XET/8+kOGI1dSYjoux80AuHvkWp1EeHfMwC/SZ9t6rF4sYqV5Lj9t32ELbh2VNbE
/7QEVZnXRi5GdhozBZtS1gJHM2/Q+iToyh5dfTaAU8bTnLEPMNC1h3qcUQIDAQAB
AoGAcbh6UFqewgnpGKIlZ89bpAsANVckv1T8I7QT6qGvyBrABut7Z8t3oEE5r1yX
UPGcOtkoRniM1h276ex9VtoGr09sUn7duoLiEsp8aip7p7SB3X6XXWJ9K733co6C
dpXotfO0zMnv8l3O9h4pHrrBkmWDBEKbUeuE9Zz7uy6mFAECQQDygylLjzX+2rvm
FYd5ejSaLEeK17AiuT29LNPRHWLu6a0zl923299FCyHLasFgbeuLRCW0LMCs2SKE
Y+cIWMSRAkEA7AnzWjby8j8efjvUwIWh/L5YJyWlSgYKlR0zdgKxxUy9+i1MGRkn
m81NLYza4JLvb8/qjUtvw92Zcppxb7E7wQJAIuQWC+X12c30nLzaOfMIIGpgfKxd
jhFivZX2f66frkn2fmbKIorCy7c3TIH2gn4uFmJenlaV/ghbe/q3oa7L0QJAFP19
ipRAXpKGX6tqbAR2N0emBzUt0btfzYrfPKtYq7b7XfgRQFogT5aeOmLARCBM8qCG
tzHyKnTWZH6ff9M/AQJBAIToUPachXPhDyOpDBcBliRNsowZcw4Yln8CnLqgS9H5
Ya8iBJilFm2UlcXfpUOk9bhBTbgFp+Bv6BZ2Alag7pY=
-----END RSA PRIVATE KEY-----";
if (!$privateKey = openssl_pkey_get_private($private)) die('Loading Private Key failed');
//Decrypt
$decrypted_text = "";
if (!openssl_private_decrypt(base64_decode($_POST['password']), $decrypted_text, $privateKey)) die('Failed to decrypt data');
//Decrypted :)
var_dump($decrypted_text);
//Free key
openssl_free_key($privateKey);
}
?>
楽しみ!
JavaScript RSA 暗号化ライブラリは次のとおりです: http://www.ohdave.com/rsa/
そして、このクラスのようなものを使用して、生成された暗号化された文字列を解読できると思います - http://www.phpclasses.org/browse/package/4121.html
私自身がこの件について調べているので、この作業をまとめて管理できるかどうか教えてください(実際にこの投稿を見つけて、自分でこの回答を探していました:P)。
編集:ほら、私もこれを見つけました - http://www.sematopia.com/?p=275 - 前の2つにも関連しているようです...
SSL を使用するようにサーバーを設定すると、https を使用して ajax 経由で暗号化された送信を行うことができます。これはおそらく、javascript と php の間でデータを暗号化するための最良の方法です。自分で作成したい場合は、どこかで失敗し、システムが安全でなくなる可能性が高くなります。
サーバーに https を設定する方法については、Google を参照してください。
私は自分のホーンを宣伝する人ではありませんが、この機能を実行するプロジェクトがgithub.comにあります。
サーバー上で秘密鍵が生成され、公開鍵とpkcs#7証明書も秘密鍵から取得されます。公開鍵はクライアントに送信され、その時点で、指定されたフォームに関連付けられた各フォーム要素は、サーバーに送信される前に暗号化されます。
PHP OpenSSL拡張機能を使用してデータを生成、暗号化、復号化するため、OpenSSLと100%互換性があります。
https://github.com/jas-/jQuery.pidCrypt/
このプロジェクトは、フォームデータがサーバーに送信されるまでJavaScriptが電子メールに署名および暗号化しないため、PGPほど安全ではありませんが、暗号化または署名されるフォームデータは、送信前にRSA公開鍵暗号化を使用して暗号化されます。サーバーに。
この場合も、プロジェクトは認証と電子メール署名の点では完了していませんが、公開鍵を使用した通常のフォーム暗号化では非常にうまく機能します。
自分でhttpsを実行する以外に、それを行う正当な理由があると思います。したがって、標準に固執する場合、これらの標準をサポートするテクノロジーで簡単に復号化できるはずです。つまり、機能するはずです
たとえば、データを PKCS#7 形式で暗号化する場合は、入力データが PKCS#7 であることを PHP ライブラリが認識していることを確認してください。
また、暗号化キーがサーバーとクライアントの間でスクランブルされていないことを確認してください。JavaScript ライブラリを使用してデータを復号化しようとしましたか?
これが役立つことを願っています...
js と php の両方に使用しているコードを配置することで、役立つかもしれません。
また、js と php を使用する必要がある理由について、より具体的に説明できるかもしれません。おそらく、js を使用していた場所では、php と AJAX (同じ php 関数を照会するため) のみを使用できます。