8

Javascript で暗号化してから、PHP で復号化したいと考えています。Javascript と PHP の RSA 実装がありますが、互換性がありません。Javascript で暗号化したものを PHP で正しく復号化できません。

Javascript と PHP の両方で動作するライブラリ/コードを知っている人はいますか?

ありがとう。

4

7 に答える 7

8

次の簡単な例を試してください。

オープンソースの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);
}
?>

楽しみ!

于 2012-06-06T21:20:13.067 に答える
7

JavaScript RSA 暗号化ライブラリは次のとおりです: http://www.ohdave.com/rsa/

そして、このクラスのようなものを使用して、生成された暗号化された文字列を解読できると思います - http://www.phpclasses.org/browse/package/4121.html

私自身がこの件について調べているので、この作業をまとめて管理できるかどうか教えてください(実際にこの投稿を見つけて、自分でこの回答を探していました:P)。

編集:ほら、私もこれを見つけました - http://www.sematopia.com/?p=275 - 前の2つにも関連しているようです...

于 2009-04-20T22:14:15.050 に答える
1

SSL を使用するようにサーバーを設定すると、https を使用して ajax 経由で暗号化された送信を行うことができます。これはおそらく、javascript と php の間でデータを暗号化するための最良の方法です。自分で作成したい場合は、どこかで失敗し、システムが安全でなくなる可能性が高くなります。

サーバーに https を設定する方法については、Google を参照してください。

于 2009-03-04T10:45:39.763 に答える
0

私は自分のホーンを宣伝する人ではありませんが、この機能を実行するプロジェクトがgithub.comにあります。

サーバー上で秘密鍵が生成され、公開鍵とpkcs#7証明書も秘密鍵から取得されます。公開鍵はクライアントに送信され、その時点で、指定されたフォームに関連付けられた各フォーム要素は、サーバーに送信される前に暗号化されます。

PHP OpenSSL拡張機能を使用してデータを生成、暗号化、復号化するため、OpenSSLと100%互換性があります。

https://github.com/jas-/jQuery.pidCrypt/

このプロジェクトは、フォームデータがサーバーに送信されるまでJavaScriptが電子メールに署名および暗号化しないため、PGPほど安全ではありませんが、暗号化または署名されるフォームデータは、送信前にRSA公開鍵暗号化を使用して暗号化されます。サーバーに。

この場合も、プロジェクトは認証と電子メール署名の点では完了していませんが、公開鍵を使用した通常のフォーム暗号化では非常にうまく機能します。

于 2011-11-27T01:17:56.497 に答える
0

自分でhttpsを実行する以外に、それを行う正当な理由があると思います。したがって、標準に固執する場合、これらの標準をサポートするテクノロジーで簡単に復号化できるはずです。つまり、機能するはずです

たとえば、データを PKCS#7 形式で暗号化する場合は、入力データが PKCS#7 であることを PHP ライブラリが認識していることを確認してください。

また、暗号化キーがサーバーとクライアントの間でスクランブルされていないことを確認してください。JavaScript ライブラリを使用してデータを復号化しようとしましたか?

これが役立つことを願っています...

于 2009-03-04T10:49:39.847 に答える
0

js と php の両方に使用しているコードを配置することで、役立つかもしれません。

また、js と php を使用する必要がある理由について、より具体的に説明できるかもしれません。おそらく、js を使用していた場所では、php と AJAX (同じ php 関数を照会するため) のみを使用できます。

于 2009-03-04T13:09:55.953 に答える