2009-03-04 12 views
7

के साथ संगत आरएसए एन्क्रिप्शन/डिक्रिप्शन मैं जावास्क्रिप्ट में एन्क्रिप्ट करना चाहता हूं और फिर PHP में डिक्रिप्ट करना चाहता हूं। जावास्क्रिप्ट और PHP के लिए आरएसए कार्यान्वयन हैं लेकिन वे संगत नहीं हैं। मैं PHP में डिक्रिप्ट नहीं कर सकता जो मैंने जावास्क्रिप्ट से एन्क्रिप्ट किया था।जावास्क्रिप्ट और PHP

क्या किसी को लाइब्रेरी/कोड पता है जो जावास्क्रिप्ट और PHP दोनों के साथ काम करेगा?

धन्यवाद।

+1

ऐसा लगता है जैसे आप इस पर विचार कर रहे हैं एक ग्राहक और सर्वर के बीच संवेदनशील डेटा के एन्क्रिप्शन के लिए। आपको चेतावनी दी जाती है कि यह एक मैन-इन-द-बीच हमले के खिलाफ किसी भी सुरक्षा की पेशकश नहीं करेगा जहां से गुजरने वाले किसी भी डेटा से समझौता किया जाएगा। सुरक्षित, प्रमाणीकृत अंत-टू-एंड एन्क्रिप्शन के लिए HTTPS का उपयोग करें। – deed02392

उत्तर

1

यदि आप SSL का उपयोग करने के लिए अपना सर्वर सेट अप करते हैं तो आप https का उपयोग करके AJAX के माध्यम से एन्क्रिप्टेड ट्रांसमिशन कर सकते हैं। यह जावास्क्रिप्ट और PHP के बीच डेटा एन्क्रिप्ट करने का शायद सबसे अच्छा तरीका है। यदि आप इसे स्वयं बनाना चाहते हैं तो आप कहीं भी खराब हो जाएंगे और सिस्टम सुरक्षित नहीं होगा।

Google आपके सर्वर के लिए https सेट अप करने के तरीके पर Google।

0

मुझे लगता है कि आपके पास https स्वयं करने के अलावा अन्य करने का एक वैध कारण है, इसलिए मैं कहूंगा कि यदि आप मानकों से चिपके रहते हैं तो आप इन मानकों का समर्थन करने वाली किसी भी तकनीक के साथ आसानी से डिक्रिप्ट करने में सक्षम होना चाहिए: यानी इसे काम

उदाहरण के लिए यदि आप PKCS # 7 प्रारूप में अपने डेटा को एन्क्रिप्ट, सुनिश्चित करें कि आपके php पुस्तकालय जानता है कि कि इनपुट डेटा # 7 PKCS है।

यह भी सुनिश्चित करें कि आपकी एन्क्रिप्शन कुंजी सर्वर और क्लाइंट के बीच scrambled नहीं है। क्या आपने अपने डेटा को अपनी जावास्क्रिप्ट लाइब्रेरी से डिक्रिप्ट करने का प्रयास किया था?

आशा इस मदद कर सकते हैं ...

0

शायद तुम कोड तुम दोनों js और php के लिए उपयोग कर रहे हैं डालकर कर सकते हैं।

इसके अलावा, हो सकता है आप क्यों आप जे एस और php उपयोग करने की आवश्यकता के बारे में अधिक विशिष्ट हो सकता है। हो सकता है कि आप केवल php, और AJAX (उसी php फ़ंक्शन से पूछने के लिए) का उपयोग कर सकें जहां आप जेएस का उपयोग कर रहे थे।

+0

मुझे लगता है कि ओपी एक एन्क्रिप्टेड रूप में सर्वर के लिए पासवर्ड की तरह कुछ भेजने की कोशिश कर रहा है। यदि आप AJAX का उपयोग करके एक php फ़ंक्शन में पासवर्ड भेज देंगे, तो आप अभी भी AJAX कॉल में पासवर्ड सादा पाठ भेज रहे होंगे और फिर इसे php विधि में एन्क्रिप्ट करने से अब कोई अर्थ नहीं आएगा – lugte098

7

यहाँ एक जावास्क्रिप्ट RSA एन्क्रिप्शन पुस्तकालय है: http://www.ohdave.com/rsa/

और मैं तुम्हें उत्पन्न एन्क्रिप्टेड स्ट्रिंग डिक्रिप्ट करने के लिए इस वर्ग की तरह कुछ इस्तेमाल कर सकते हैं लगता है - http://www.phpclasses.org/browse/package/4121.html

मुझे पता है अगर आप एक साथ इस काम मिल का प्रबंधन करते हैं, क्योंकि मैं खुद को इस विषय में देख रहा हूं (मुझे वास्तव में यह पोस्ट खुद को इस उत्तर की तलाश में मिला: पी)।

संपादित करें: देखिए, मैं यह भी पाया है इस - http://www.sematopia.com/?p=275 - पिछले दो रूप में अच्छी तरह से संबंधित है ...

0

मैं एक मेरे अपने सींग हार्न करने के लिए नहीं कर रहा हूँ, लेकिन मैं github.com पर एक परियोजना है यह इस कार्यक्षमता को निष्पादित करेगा।

कोई निजी कुंजी सर्वर पर उत्पन्न होता है, एक सार्वजनिक कुंजी और PKCS # 7 प्रमाण पत्र भी निजी कुंजी से ली गई है। सार्वजनिक कुंजी क्लाइंट को भेजी जाती है जिस समय निर्दिष्ट फॉर्म के साथ आवंटित प्रत्येक फॉर्म तत्व सर्वर पर सबमिट करने से पहले एन्क्रिप्ट किया जाता है।

यह 100% OpenSSL संगतता के रूप में यह पीएचपी OpenSSL विस्तार, उत्पन्न एन्क्रिप्ट और डेटा को डिक्रिप्ट करने का उपयोग करता है।

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

इस परियोजना पीजीपी के रूप में के रूप में सुरक्षित है क्योंकि जावास्क्रिप्ट पर हस्ताक्षर करेंगे नहीं और ईमेल एन्क्रिप्ट प्रपत्र डेटा सर्वर के लिए भेजा जाता है जब तक है, लेकिन प्रपत्र डेटा है कि एन्क्रिप्ट होने के लिए और या हस्ताक्षर किए एन्क्रिप्टेड है नहीं है सर्वर पर भेजे जाने से पहले आरएसए सार्वजनिक कुंजी एन्क्रिप्शन का उपयोग करना।

फिर से परियोजना प्रमाणीकरण और ईमेल हस्ताक्षर के मामले में पूर्ण नहीं है, लेकिन सार्वजनिक कुंजी का उपयोग करके सामान्य रूप एन्क्रिप्शन के लिए यह बहुत अच्छी तरह से काम करता है।

5

निम्नलिखित सरल उदाहरण आज़माएं।

यह एक खुला स्रोत जावास्क्रिप्ट पुस्तकालय https://github.com/ziyan/javascript-rsa

HTML/जावास्क्रिप्ट उपयोग कर रहा है:

<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 

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); 
} 
?> 

का आनंद लें!

+1

भावी पाठकों के लिए: David.Ask इस जवाब में एक अस्वीकृत संपादन में सुझाव दिया गया है कि इसे सिर में भी जोड़ा जाना चाहिए: '' – Tieme

+0

PHP के साथ इस प्रोजेक्ट का उपयोग करें anwser मेरे लिए एक आकर्षण की तरह काम करता है https://github.com/travist/jsencrypt/ –

0

मुझे यह जेसनक्रिप्ट लाइब्रेरी (http://travistidwell.com/jsencrypt) मिलती है, 2 दिन बाद मुझे अपना समाधान मिल गया।

मुझे एकमात्र समस्या है जब मैं एक लंबा पाठ भेजता हूं। ऐसा इसलिए है क्योंकि आरएसए, परिभाषा के अनुसार, सीमित लंबाई के तारों का समर्थन करता है।

https://security.stackexchange.com/questions/33434/rsa-maximum-bytes-to-encrypt-comparison-to-aes-in-terms-of-security/33445#33445

आरएसए, के रूप में PKCS # 1 द्वारा परिभाषित, सीमित आकार के "संदेश" एन्क्रिप्ट करता है। सामान्यतः "v1.5 पैडिंग" और 2048-बिट आरएसए कुंजी के साथ, अधिकतम डेटा का आकार जिसे आरएसए के साथ एन्क्रिप्ट किया जा सकता है, 245 बाइट्स है। अब और नहीं।

अर्थात अगर मैं 1024 के private_key_bits का उपयोग मैं

"José compró en Perú una vieja zampoña. Excusándose, Sofía tiró su whisky al desagüe de la banqueta." 

कुछ भी नहीं रह गया है भेज सकते हैं। अगर मैं 512 के private_key_bits का उपयोग मैं

"José compró en Perú una vieja zampoña. Excusánd" 

कुछ भी नहीं रह गया है भेज सकते हैं।

लंबे तार JavaScript कंसोल रिपोर्ट पर: "संदेश आरएसए के लिए बहुत लंबा"

तो अगर आप लंबे तार आप सेक चाहिए एन्क्रिप्ट करना चाहते हैं और उन्हें जावास्क्रिप्ट एन्क्रिप्शन से पहले और डिक्रिप्शन के बाद शामिल होने और php पर विस्तारित, मुझे लगता है कि विभाजित zlib विभाजन/जुड़ने के लिए एक अच्छा समाधान है क्योंकि यह जावास्क्रिप्ट और PHP पर समर्थित है।

<?php 
    //------------------------------------------------------------ 
    // Global Settings. 
    //------------------------------------------------------------ 
    ini_set('display_errors', 1); 
    error_reporting(E_ALL); 
    $directorio = "/path/to/key/directory/apache/writable/"; 
    $nombre_base = "llaves_php"; 

    //------------------------------------------------------------ 
    // Initialization. 
    //------------------------------------------------------------ 
    $encabezado_html = ""; 
    $cuerpo_html = ""; 

    //------------------------------------------------------------ 
    // Loading keys 
    //------------------------------------------------------------ 
    list($privateKey, $pubKey) = 
     cargar_llaves_RSA($directorio, $nombre_base); 

    //------------------------------------------------------------ 
    // Form that uses javascript to encrypt data. 
    // (it uses only the public key) 
    //------------------------------------------------------------ 
    $librerias_html = " 
     <script type='text/javascript' 
       src='https://ajax.googleapis.com/ajax/libs/". 
        "jquery/3.2.1/jquery.min.js'></script> 
     <script type='text/javascript' 
       src='lib/jsencrypt.js'></script> 
     "; 

    $pubKey_html = htmlentities($pubKey); 
    $datos_html = " 
     <h2>Cifrando con Javascript</h2> 
     <input type='text' id='mensaje' /> 
     <br /> 
     <button id='ENVIAR'>Enviar</button> 
     <br /> 
     <textarea id='pubkey' style='display: none;'>". 
     $pubKey_html. 
     "</textarea> 
     <script type='text/javascript'> 
      $('#ENVIAR').click(function() { 
       var codificador = new JSEncrypt(); 
       codificador.setKey($('#pubkey').val()); 
       var cifrado = codificador.encrypt($('#mensaje').val()); 
       window.open('?mensaje=' + encodeURIComponent(cifrado) 
          , '_top'); 
      }); 
     </script> 
     "; 

    //------------------------------------------------------------ 
    // Decrypting using php (it uses only the privateKey) 
    //------------------------------------------------------------ 
    if (isset($_REQUEST['mensaje'])) { 
     openssl_private_decrypt(base64_decode($_REQUEST['mensaje']) 
           , $descifrado 
           , $privateKey); 
     $datos_html.= " 
      <h2>Descifrando con PHP</h2> 
      ".$descifrado." 
      "; 
    } 

    //------------------------------------------------------------ 
    // HTML DISPLAY 
    //------------------------------------------------------------ 
    $encabezado_html.= "<title>Receptor de mensaje cifrado</title>" 
        . $librerias_html; 

    $cuerpo_html.= $datos_html; 

    $contenido = "<head>$encabezado_html</head><body>$cuerpo_html</body>"; 
    $contenido = "<html>$contenido</html>"; 
    print $contenido; 

//============================================================ 
//============================================================ 
// Functions 
//============================================================ 
//============================================================ 

    //------------------------------------------------------------ 
    function cargar_llaves_RSA($directorio, $nombre_base) { 
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    // PROPÓSITO: Genera o carga desde archivos las llaves RSA 
    // ENTRADAS: 
    // $directorio: Directorio donde se encuentran los archivos. 
    // $nombre_base: Nombre, sin extensión, de los archivos con 
    //    las llaves. 
    // SALIDAS: 
    //------------------------------------------------------------ 
     if ( !file_exists($directorio.$nombre_base.".crt") 
      || !file_exists($directorio.$nombre_base.".pub")) { 
      list($privateKey, $pubKey) = crear_llaves_RSA($directorio.$nombre_base); 
     } else { 
      //------------------------------------------------------------ 
      // CARGA DE LLAVES RSA ARCHIVADAS 
      //------------------------------------------------------------ 
      $privateKey = file_get_contents($directorio.$nombre_base.".crt"); 
     if (!$privKey = openssl_pkey_get_private($privateKey)) 
      die('Loading Private Key failed'); 
      $pubKey = file_get_contents($directorio.$nombre_base.".pub"); 
     } 

    return array($privateKey, $pubKey); 
    } 

    //------------------------------------------------------------ 
    function crear_llaves_RSA($ruta_base) { 
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    // PROPÓSITO: 
    // generacion de llaves RSA en php 
    // ENTRADAS: 
    // $ruta_base: Ruta de los archivos a generar sin extensión. 
    // SALIDAS: 
    // Se generarán dos archivos, uno con la llave privada con 
    // extensión .crt, el otro con llave pública con extensión 
    // .pub; la función retorna tanto la llave pública como la 
    // privada en un arreglo. 
    //------------------------------------------------------------ 
     $config = array(
      "private_key_bits" => 1024, 
      "private_key_type" => OPENSSL_KEYTYPE_RSA, 
     ); 

     $llavePrivadaCruda = openssl_pkey_new($config); 
     openssl_pkey_export_to_file($llavePrivadaCruda, $ruta_base.".crt"); 
     $privateKey = file_get_contents($ruta_base.".crt"); 
     openssl_pkey_export($llavePrivadaCruda, $privKey); 

     $pubKeyData = openssl_pkey_get_details($llavePrivadaCruda); 
     $pubKey = $pubKeyData["key"]; 
     file_put_contents($ruta_base.".pub", $pubKey); 
     openssl_free_key($llavePrivadaCruda); 

    return array($privateKey, $pubKey); 
    } 

    //------------------------------------------------------------ 
    function Mostrar($valor) { 
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    // PROPÓSITO: Genera el código HTML para presentar una 
    // variable embebida en la página. 
    // ENTRADAS: 
    // $valor: el valor a presentar. 
    // SALIDAS: código html que permite visualizar la variable. 
    //------------------------------------------------------------ 
     $retorno = htmlentities(stripslashes(var_export($valor, true))); 
     $retorno = "<pre>$retorno</pre>"; 
     return $retorno; 
    } 

?> 

निर्देशिका पेड़ चाहिए की तरह दिखता है:

मेरे काम के कोड इस प्रकार है

├── script.php 
└── lib 
    └── jsencrypt.js 

और एक नामी निर्देशिका के सार्वजनिक क्षेत्र के बाहर php द्वारा लिखने योग्य

/path/to/key/directory/apache/writable/ 

संबंधित मुद्दे