94451
Goto Top

Verschlüsseln und enschlüsseln

Hallo ich möchte mit Javascript ver- und entschlüsseln...

ich suche eine Methode die man über mehrere Programmiersprachen anwenden kann (ebenso brauch ich C# und PHP), aber vorerst mal Javscript.

Ich habe mir mcrypt angeschaut, allerdings finde ich nur "uralte" Bibliotheken und eher "mäßige" tutorials...
Ziel ist es mit einem Schlüssel (den beide / oder mehrere) System kennen gesichert Daten zu übertragen.

Vielen Dank für jeden Tipp <- HowTos wären natürlich auch nett

Gruß RoadRunner

Content-ID: 314856

Url: https://administrator.de/contentid/314856

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

colinardo
colinardo 09.09.2016 aktualisiert um 14:08:49 Uhr
Goto Top
Hallo Roadrunner,
für eine symmetrische Verschlüsselung bieten sich Standard-Mechnissmen wie AES an die sowohl mit JavaScript (z.B. Stanford Javascript Crypto Library) als auch unter C#/.NET (AESManaged, AESCryptoProvider) genutzt werden können.

Für eine asymmetrische Verschlüsselung mit Zertifikaten gibt es auch hier eine Lösung:

Hier noch ein Beispiel
http://www.codeproject.com/Articles/11479/RSA-Interoperability-between- ...

Grüße Uwe
Lochkartenstanzer
Lochkartenstanzer 09.09.2016 um 14:08:19 Uhr
Goto Top
Moin,

Suchst Du Algorithmen oder fertige Bibliotheken?

lks
94451
94451 09.09.2016 aktualisiert um 18:31:39 Uhr
Goto Top
@Lochkartenstanzer:
am liebsten was fertiges was ich einfach "verwenden" kann. Aber ich muss eben tun was ich tun muss ... <- nur das Rad will ich nicht Komplett neu erfinden (von HTTPs will ich ein bisschen "absehen" die Zertifikate sind mir zu teuer, zu umständlich und vorallem ist hier die Sicherheit sehr relativ [zugegeben, das AES ist sicher auch nicht komplett unknackbar, aber dennoch fühle ich mich damit sicherer])

@colinardo
Die "Stanford Javascript Crypto Library" macht eigentlich fast das was ich will... leider schaff ich es nicht etwas in JS zu verschlüsseln und in PHP wieder zu entschlüsseln :/ ... irgendwas mach ich da noch Falsch...
Da gibt es Cipher Parameters: CCM, OCB2, GCM
MCRYPT was ich in PHP z.B. verwende, verwendet den Parameter MCRYPT_MODE_CBC was wiederum so viel bedeutet wie -> inkompatibel :/

da meine PHP- Klasse echt "Klasse" funktioniert, suche ich jetzt was analog für JS...

anbei einfach mal meine Klasse:
class crpt {
	private $_salt;
	private $_key;
	private $_string;
	private $_cipher;
	
	public function salt( $salt ) {
		$this->_salt = $salt;
	}
	
	public function key( $key ) {
		$password = md5( $this->_salt.$key );
		$password = bin2hex( $password );
		$this->_key = pack( 'H*', $password );  
	}
	
	public function encrypt( $string ) {
		$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
		$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

		$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->_key, $string, MCRYPT_MODE_CBC, $iv);
		$ciphertext = $iv . $ciphertext;
		$ciphertext_base64 = base64_encode($ciphertext);
		return $ciphertext_base64;
	}

	public function decrypt( $crypt ) {
		$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
		$ciphertext_dec = base64_decode($crypt);
		$iv_dec = substr($ciphertext_dec, 0, $iv_size);
		$ciphertext_dec = substr($ciphertext_dec, $iv_size);

		$plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->_key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
		return $plaintext_dec;
	}

}

ich habe im bereich Kryptografie noch nicht so viel Ahnung...

... ich möchte ohne Zertifikatdateien arbeiten... ich will einfach nur mit einem Passwort verschlüsselt (Okay, SALT verwende ich noch) Texte, übermitteln! <- Das problem ist, "je nach Endgerät" verwende ich eine andere Sprache... vorerst für die Weboberfläche verwende ich PHP & HTML5

=> Prinzip ist einfach: Gerät X schreibt eine Nachricht, welche mit JS verschlüsselt wird zum Server übertragen und in eine Datenbank gespeichert. Gerät Y holt sich die Nachricht und entschlüsselt diese mit (z.B. C#)... jetzt gibt es aber auch noch Nachrichten an den Server (Steuerungsnachrichten) die er selbst entschlüsseln soll, hierfür soll das PHP einspringen! Ebenso soll jeder seine eigenen Nachrichten lesen können... Jeder hat den Schlüssel seines Kommunikationspartners und einen Eigenen!

Nachtrag: Crypto-JS habe ich auch bereits gefunden... da aber hier seit 2013 nichts mehr dran gemacht wurde, sehe ich das als "veraltet" an. <- ist dem so?

Vielen Dank für jeden Tipp
94451
94451 09.09.2016 um 18:47:36 Uhr
Goto Top
Okay, das ist jetzt Peinlich... die PHP-Klasse von mir, funktioniert leider nicht mit PHP7 face-sad ...

d.h. ich brauch auch für PHP was brauchbares
danielr1996
danielr1996 12.09.2016 um 00:26:25 Uhr
Goto Top
Wenns dir nur um die Verschlüsselung der Daten geht die du eh über HTTP überträgst versteht ich nicht warum du kein HTTPS nimmt, Zertifikate sind mit Lets Encrypt kostenlos und einfach erstellt und deine eigene Verschlüsselung wird wohl kaum besser sein als das lang erprobte HTTPS
94451
94451 12.09.2016 aktualisiert um 10:29:37 Uhr
Goto Top
@danielr1996

eigene Verschlüsselung wird wohl kaum besser sein als das lang erprobte HTTPS
Doch genau das ist es...

AES / AES2 ist nicht "meine eigene" Verschlüsselung... und mit Zertifikaten bin ich "IMMER" auf Zertifizierungsstellen angewiesen (was ich auch in den meisten Fällen auch gerne bin),... in diesen einem speziellen Fall möchte ich das aber umgehen und auf HTTPs verzichten!
Guenni
Guenni 05.10.2016 um 18:06:15 Uhr
Goto Top
Hi,

such mal im INet nach XOR-Verschüsselung. Da gibt es viele, viele interessante Seiten face-smile

Mal ein Beispiel:

Die Funktion en_de_code funktioniert in beide Richtungen:
text = "blablabla"
text_geheim = en_de_code(text, schluessel) - gibt den text verschlüsselt zurück
text_lesbar = en_de_code(text_geheim, schluessel) - gibt den verschlüsselten text wieder lesbar zurück, bei Verwendung des gleichen Schlüssels


<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<script src="jquery-1.10.1.js" type="text/javascript"></script>  
<script type="text/javascript">  
<!--
/*
* AlphaNummerische Zeichen
*/
var an_chars = "QWERTZUIOPASDFGHJKLYXCVBNMqwertzuiopasdfghjklyxcvbnm0123456789";  

/*
* Zufallszahl zwischen 0 und i
*/
function rand(i) {
  return (Math.floor(Math.random() * i));
}

/*
* Ein zufälliges Zeichen aus an_chars
*/
function getChar(an_chars) {
  return an_chars.charAt(rand(an_chars.length));
}

/*
* Zeichenkette mit Länge len aus zufälligen Zeichen (an_chars)
*/
function getKey(len){
 var key = "";  
 for(var i=0;i<len;i++){
  key += getChar(an_chars);
 }
 return key;
}

function en_de_code(t, s){
 var len = t.length;
 var text = "";  
 for(var i=0;i<len;i++){
  var unicode_t = t.charCodeAt(i);
	var unicode_s = s.charCodeAt(i);
	var ascii_code = unicode_t ^ unicode_s;
	text += String.fromCharCode(ascii_code);
 }
 return text;
}

$(document).ready( function(){
 var text = "Dieser Text ist eigentlich ein Geheimnis";  
 $("#text").html(text);  
 var schluessel = getKey(text.length);
 var text_geheim = en_de_code(text, schluessel);
 var text_lesbar = en_de_code(text_geheim, schluessel);
 $("#button1").click(function(){  
  $("#ausgabe").html(text_geheim);  
 });
 $("#button2").click(function(){  
  $("#ausgabe").html(text_lesbar);  
 });
});
// -->
</script>
</head>
<body>
<p id="text"></p>  
<button id="button1">Verschlüsseln</button>  
<button id="button2">Entschlüsseln</button>  
<p id="ausgabe"></p>  
</body>
</html>

Gruß
Günni