Jörg Reinholz: Javascript PHP ver und entschlüsseln - Fehler von Google

Beitrag lesen

Ich habe mal meine obigen Einschränkungen / Verbesserungen umsetzen wollen und bin darauf gekommen, dass Googles crypto-js - Bibliothek zu openssl "nicht wirklich" kompatibel ist.

Sowas ist für mich GENAU der Grund, mich mehr auf die Basics zu verlassen und ein wenig mehr selbst zu schreiben. Ich habe lange gebraucht, um die Inkompatibilitäten - die hier Googles Fehler sind (kann aber auch an der Dokumentation von Google liegen, die den Weg des Verschlüsselns mit JS und des Entschlüsselns mit OpenSSL gerade - und warum wohl - nicht zeigt) - zu finden.

Die mühselig erkannten Probleme und deren Lösung:

Erst einmal fehlt dem verschlüsseltem String ein Zeilenumbruch am Ende.

Dann muss die Ausgabe im konkretem Fall noch in Zeilen von maximal 76 Zeichen Länge gespalten werden. Sonst geht es nur mit kurzen Strings. Das ist natürlich erst spät aufgefallen.

Diese sind nun gelöst.

Für das Wegschreiben der decodierten Daten kann sich der interessierte Kopierer selbst was einfallen lassen. Ich gebe die für das Beispiel natürlich nur im Browser aus.

Hier also der aktuelle Version:

myEncrypt.html:

  
<html>  
<head>  
<meta http-equiv="content-type" content="text/html; charset=utf-8">  
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>  
<script>  
  function myCrypt() {  
    pass=document.getElementById('pass').value;  
    encrypted = CryptoJS.AES.encrypt(document.getElementById('data').value, pass);  
    document.getElementById('data').value=encrypted;  
    document.forms[0].submit();  
  }  
  
</script>  
</head>  
<body>  
<form action="myDecrypt.php" method="post">  
  <textarea name="data" id="data" style="width:80%"></textarea><br>  
  <input type="text" id="pass"><br>  
  <input type="button" value="verschluesseln und senden" onclick="myCrypt()" />  
</form>  
</body>  
</html>

Das Passwort 'ganz geheim' muss nun eingegeben werden.

myDecrypt.php:

<?php  
$pass="ganz geheim";  
header('content-type:text/plain;charset="UTF-8");  
# Daten chunken und Zeilenbruch anhängen!  
$data=chunk_split($_POST['data'])."\n";  
system("echo '".$data."' | openssl enc -d -aes-256-cbc -a -pass pass:'".$pass."' 2>&1;");  

Bitte die Kodierung (heißt "charset" nicht wörtlich übersetzt "Zeichensatz"?) entsprechend anpassen!

Jörg Reinholz