2017-06-02 4 views
0

Ich habe Code in Javascript https://notepad.pw/codeherejsJavascript PHP - RSA verschlüsselt mit Modul und Exponenten

var c = 'd3bcef1f00424f3261c89323fa8cdfa12bbac400d9fe8bb627e8d27a44bd5d59dce559135d678a8143beb5b8d7056c4e1f89c4e1f152470625b7b41944a97f02da6f605a49a93ec6eb9cbaf2e7ac2b26a354ce69eb265953d2c29e395d6d8c1cdb688978551aa0f7521f290035fad381178da0bea8f9e6adce39020f513133fb'; 
var f = '10001'; 
var g = new RSAKey; 
    g.setPublic(c, f); 
    var result = g.encrypt(password) 

Es fein arbeiten. Und gib mir Ergebnis ist result = 1e2738d762382f82f8412b87e9dd9a18aaa52ea28f6b204bb0f1e0f710a973aaa417e533d39127fd1d8959c553ae53dd83738e4eb6544cb77fd08438afd33594c42ff7e5186bd23908b642188b82b7552140af82f7bd5d768770cd9305573640739be4a70bbc2bd190c5a192685ab88c5a612680005eff2f37944c8e24803ea2

ich den Code zu PHP conver, ich benutze phpseclib

$fm_modulus = 'd3bcef1f00424f3261c89323fa8cdfa12bbac400d9fe8bb627e8d27a44bd5d59dce559135d678a8143beb5b8d7056c4e1f89c4e1f152470625b7b41944a97f02da6f605a49a93ec6eb9cbaf2e7ac2b26a354ce69eb265953d2c29e395d6d8c1cdb688978551aa0f7521f290035fad381178da0bea8f9e6adce39020f513133fb'; 

$fm_exponent = '10001'; 

$rsa = new Crypt_RSA(); 
$modulus = new Math_BigInteger(base64_decode($fm_modulus), 256); 
$exponent = new Math_BigInteger(base64_decode($fm_exponent), 256); 

$rsa->loadKey(array('n' => $modulus, 'e' => $exponent)); 
$pass_ok = $rsa->encrypt($pass); 

PHP Rückkehr für mich das Symbol, ich weiß nicht, wie es in einfachen Text (gleiches Ergebnis konvertieren in Javascript). Ich versuche base64, Hash sha256 sha512. Alle falsch, bitte helfen Sie mir

+0

Die Verschlüsselung gibt Bytearray zurück. Was JS zeigt, ist eine hexadezimale Darstellung des Byte-Arrays. Anscheinend wandelt PHP es direkt in die Zeichenkette um. Sie sollten also etwas Common verwenden - Base64 sollte gut sein, versuchen Sie auch, das JS-Array in base64 zu konvertieren, um das Ergebnis zu sehen. – gusto2

+0

Ich versuche bin2hex, und Ergebnis habe ich von PHP nicht gleich Javascript :( –

+0

Das Ergebnis der Verschlüsselung mit einer sicheren Chiffre * soll * immer anders sein: Die Ergebnisse sind randomisiert. Sie sollten durch Verschlüsselung mit einer Laufzeit und entschlüsseln mit überprüfen Die andere Laufzeit: Sie können versuchen, bis die Welt endet, um das gleiche Byte-Array nach der Verschlüsselung zu erstellen * sogar auf der gleichen Plattform *. –

Antwort

0

$fm_modulus und $fm_exponent sind nicht Base64-codiert noch sind sie in der Basis-256. Sie sind hex-codiert und das war's. Also versuchen Sie dies:

$rsa = new Crypt_RSA(); 
$modulus = new Math_BigInteger($fm_modulus, 16); 
$exponent = new Math_BigInteger($fm_exponent, 16); 

Ich konnte dies durch die Tatsache erkennen, dass $fm_exponent ist 10001. 10001 ist die Hex-Codierung von 65537, die ein ziemlich verbreiteter RSA Exponent ist.

Ich vermute auch, dass der Füllmodus, den phpseclib verwendet, möglicherweise nicht korrekt ist. Möglicherweise müssen Sie $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_NONE); oder $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); tun.

Es ist tatsächlich etwas schwierig zu wissen, da Sie den privaten Schlüssel nicht veröffentlicht haben, so dass das Ergebnis nicht entschlüsselt werden kann. Sie haben auch nicht den Klartext von dem gepostet, was Sie verschlüsseln möchten. Wie Maarten Bodewes sagte, mit guten Padding-Modi, wird der verschlüsselte Text jedes Mal anders sein, wenn Sie versuchen, denselben Klartext zu verschlüsseln, aber es ist möglich, dass Ihre JS-Bibliothek keinen guten Padding-Modus verwendet. phpseclib verwendet standardmäßig OAEP, das eine randomisierte Ausgabe hat, aber "Lehrbuch RSA" verwendet kein randomisiertes Padding (oder wirklich kein Padding).

Verwandte Themen