2017-12-14 6 views
0

Mit all dem Wissen, das ich im Internet finden konnte, kam ich mit einer OpenSL-Funktion zum Verschlüsseln und Entschlüsseln von Salt. Es funktioniert 90% der Zeit, aber jedes Mal in einem Wile kehrt die Entschlüsselung mit einem leeren Stich oder zufälligen Bytes zurück, die nichts mit den verschlüsselten Daten zu tun haben. Der Code Ich verwende ist:PHP openssl_decrypt liefert merkwürdige Ausgabe ca. 10% der Zeit

function Encrypt($subject, $method, $saltLength, $key){ 
    if($method==0){ 
     $salt=random_bytes($saltLength); 
     $key=hash('sha256', $salt.$key); 
     $iv=random_bytes(16); 
     $encrypt=base64_encode(openssl_encrypt($subject, 'aes-256-ctr', $key, 0, $iv)); 
     $return=base64_encode("$method:$salt:$iv:$encrypt"); 
    } 
    return($return); 
} 
function Decrypt($subject, $key){ 
    $components = explode(':', base64_decode($subject)); 
    $method=$components[0]; 
    if($method==0){ 
     $salt=$components[1]; 
     $key = hash('sha256', $salt.$key); 
     $iv=$components[2]; 
     $encrypt=base64_decode($components[3]); 
     $return=(openssl_decrypt($encrypt, 'aes-256-ctr', $key, 0, $iv)); 
    } 
    return($return); 
} 

$testE=Encrypt('Test', 0, 20, 'Key0'); 
var_dump($testE); 
echo('<br><br>'); 
$testD=Decrypt($testE, 'Key0'); 
var_dump($testD); 
echo('<br><br>'); 
$testD=Decrypt($testE, 'Key0'); 
var_dump($testD); 
echo('<br><br>'); 

Und ein Beispiel für die fehlerhaften Ergebnisse für diesen Code wäre:

string(72) "MDrVsJAIE8OFjyM6y5dt+xkij5m/rTrHTnzeWs0IRrTKvNR1L7wfOmJrSlNRWFIzUFQwPQ==" 

string(1) "�" 

string(1) "�" 

Oder die Rückkehr eines völlig leeren String:

string(72) "MDrQ+5c83vJXnva1OjrbJ2RWGjU5ajrwCn+qCneIIOqh48Gt0JmbOllsZFVUMHRuUFQwPQ==" 

string(0) "" 

string(0) "" 

Der Grund, warum ich zweimal entschlüsselt habe, ist zu sehen, ob der Fehler in der Entschlüsselung oder der Verschlüsselung liegt. Die Ergebnisse zeigen eindeutig, dass die Verschlüsselung in irgendeiner Weise fehlerhaft ist.

Meine Frage ist, was verursacht diese fehlerhafte Verschlüsselung der Daten? & kann ich diese Methode verbessern und noch sicherer machen?

+0

Vielleicht möchten Sie Base64 codieren jedes Teil, Ihr Salz oder iv kann ein produzieren ':' –

+0

Tritt dieses Problem mit den gleichen Daten - dh: wenn Sie die Verschlüsselung/Entschlüsselung mit den gleichen Anfangsdaten für 100 Mal durchgeführt würde es ist in Ordnung? – RamRaider

+0

Ja, ich denke, das ist das Problem '0: հ Å #: ˗m": N | ZF'u /: bkJSQXR3PT0 = 'ist Ihre decodierte fehlgeschlagen. –

Antwort

1

Während nicht die Antwort, warum es passiert, oft ist das Ergebnis, was am wichtigsten ist.

Wenn das der Fall ist, dann, wenn Sie 90% Genauigkeit zu bekommen, wird eine while-Schleife erhalten Sie schnell auf dem Weg .....

while(strlen($testD) < 5) { 
    $testD=Decrypt($testE, 'Key0'); 
} 

Wenn Ihr Ziel ist, herauszufinden ist, welche Ursachen die kleinen Fehler, dann müssen Sie vielleicht viel tiefer in den Kern-Code schauen. In meiner Position, "mach es fertig und mach weiter" ist oft das, was die Chefs sagen, also ist es oft das, woran ich arbeiten muss, um eine funktionierende Lösung für das Sammeln der Informationen zu finden.