2012-12-10 5 views
1

J'ai essayé de faire le cryptage/décryptage en Javascript/PHP en utilisant PKCS # 1. J'ai les variables suivantes:Cryptage en Javascript, décryptage PHP en utilisant PKCS # 1

e: Public exponent (for encryption) 
d: Private exponent (for decryption) 
n: modulus 

J'utilise cette librairie javascript pour décrypter: http://www-cs-students.stanford.edu/~tjw/jsbn/rsa.js comme ceci:

var rsa = new RSAKey(); 

    rsa.setPublic(n, e); 

    var cipherText = rsa.encrypt(plainText); 

Pour décrypter en PHP J'utilise la bibliothèque PHPSec:

Question1 : Comment puis-je convertir d et n en une clé privée à utiliser dans phpseclib?

Question2: Comment convertir la sortie du code Javascript en une forme utilisable avec phpseclib?

+5

Juste une suggestion: peut-être que vous devriez aussi faire du chiffrement en PHP, via un appel ajax. De cette façon, vous n'aurez pas besoin du fichier rsa.js et n'auriez aucun problème :) – povilasp

+1

Pertinent: http://www.youtube.com/watch?v=M7kEpw1tn50 (pas pour OP, mais toute personne intéressée par le fonctionnement de RSA –

+4

@povilasp Vous voulez dire ... envoyer les données ** en texte brut ** sur le réseau, non cryptées, afin qu'elles puissent être cryptées et renvoyées au client, afin qu'elles puissent être envoyées "en toute sécurité" cryptées au serveur ? Comment ce commentaire a-t-il obtenu trois upvotes? – meagar

Répondre

0

Pour javascript/interopérabilité PHP vérifier ceci:

http://area51.phpbb.com/phpBB/viewtopic.php?f=84&t=33024&start=0

Il fait PKCS # 1 v2.1 RSAES-OAEP (qui est censé offrir une meilleure sécurité que PKCS # 1 v2.1 RSASSA- PKCS1-v1_5).

$ rsa-> LoadKey ( tableau ( 'e' => new Math_BigInteger ('... ' 256), 'n' => new Math_BigInteger (' ...', 256) ) );

Si cela ne fonctionne pas faites le moi savoir.

Sinon, vous pouvez essayer:

http://www.frostjedi.com/phpbb3/viewtopic.php?p=331621#p331621

(voir le deuxième bloc de code)

Pour convertir la sortie js à un format PHP pourrait utiliser ... la preuve de concept I lié à passe la sortie à char2hex():

function char2hex(source) 
{ 
    var hex = ""; 
    for (var i = 0; i < source.length; i+=1) 
    { 
     temp = source[i].toString(16); 
     switch (temp.length) 
     { 
     case 1: 
      temp = "0" + temp; 
      break; 
     case 0: 
      temp = "00"; 
     } 
     hex+= temp; 
    } 
    return hex; 
} 

Bonne chance!

0

Je suppose que vous avez déjà trouvé une solution pour votre problème puisque, mais voici un petit examle utiliser RSA entre Javascript et PHP pour ceux qui sont toujours à la recherche d'une solution (par exemple):

<?php 
$path = 'phpseclib'; 
set_include_path(get_include_path() . PATH_SEPARATOR . $path); 
include_once('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_RAW); 
$key = $rsa->createKey(512); 
$e = new Math_BigInteger($key['publickey']['e'], 10); 
$e = $e->toHex(); 
$n = new Math_BigInteger($key['publickey']['n'], 10); 
$n = $n->toHex(); 
function decrypt($msg, $key) { 
    $rsa = new Crypt_RSA(); 
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
    $rsa->loadKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); 
    $s = new Math_BigInteger($msg, 16); 
    return $rsa->decrypt($s->toBytes()); 
} 
?> 
<script type="text/javascript" src="javascript/jsbn.js"></script> 
<script type="text/javascript" src="javascript/prng4.js"></script> 
<script type="text/javascript" src="javascript/rng.js"></script> 
<script type="text/javascript" src="javascript/rsa.js"></script> 
<script> 
<?php 
echo "var n='".$n."';"; 
echo "var e='".$e."';"; 
?> 
function encrypt() { 
    var rsa = new RSAKey(); 
    rsa.setPublic(n, e); 
    document.getElementById('enc_text').value = rsa.encrypt(document.getElementById('plaintext').value); 
} 
</script> 

Plain Text:<br/> 
<input id='plaintext' name='plaintext' type="text" size="40"/><br/> 
<input type="button" onclick="encrypt()" value="Encrypt"/><br/> 
Encrypted Text:<br/> 
<form action="" method="post"> 
<input id="enc_text" name='enc_text' type="text" size="40"/><br/> 
<?php 
echo '<input id="key" name="key" type="hidden" size="40" value="'.urlencode($key['privatekey']).'"/><br/>'; 
?> 
<input name="submit" type="submit" value="Submit" size="10"/> 
</form> 
<?php 
if(isset($_POST['submit']) && ($_POST['enc_text'] != 0)) { 
echo decrypt($_POST['enc_text'], urldecode($_POST['key'])); 
} 
?> 

Si vous avez besoin d'autres exemples, visitez le site officiel de la documentation à l'adresse: http://phpseclib.sourceforge.net/new/rsa/examples.html

ou

http://bestmike007.com/2011/08/secure-data-transmission-between-pure-php-and-javascript-using-rsa/