Zum Inhalt springen

opensource Verschlüsselungsprojekt


Empfohlene Beiträge

Hatte in einer schlaflosen Nacht eine Idee, für ein gutes (oder halt nicht) Verschlüsselungsprogramm! Es ist in Perl programmiert.

Und mich würde mal eure Meinung interessieren!

Hab die Frage in mehreren Foren gestellt, aber bis jetzt keine wirklich brauchbaren Meinungen gehört! Da das Forum hauptsächlich für Entwickler ist, denke ich das ich hier mehr Lob/Kritik/ Vorschläge bekomme :)

Also hier das opensourcescript (Nur Beta! Wenn es gut ist, werde ich es ausbauen!):


use Math::BigInt;



$Secret	= ''; # Text der Verschlüsselt werden soll

$Pw	= ''; # Passwort, mit dem der Text verschlüsselt werden soll



### Verschlüsseln



@a1 = unpack("C*", $Secret);

@b1 = unpack("C*", $Pw);


foreach (0..$#a1) {

	$a2	 = sprintf "%b ", $a1[$_];

	$a3	.= sprintf "%0.8d", $a2;

}

foreach (0..$#b1) {

	$b2	 = sprintf "%b", $b1[$_];

	$b3	.= sprintf "%0.8d", $b2;

}

$a4 = length($a3);

$b4 = length($b3);


foreach (0..$a4) {

	push(@a5, substr($a3,$_,1));

}

foreach (0..$b4) {

	push(@b5, substr($b3,$_,1));

}


$a6 = 1;

$b6 = 1;


foreach (0..$#a5) {

	if ($a5[$_] == 1) {

		$a7 = Math::BigInt->new($a7 +$a6);

	}

	$a6 = Math::BigInt->new($a6 *2);

}

foreach (0..$#b5) {

	if ($b5[$_] == 1) {

		$b7 = Math::BigInt->new($b7 +$b6);

	}

	$b6 = Math::BigInt->new($b6 *2);

}


$c1 = Math::BigInt->new($a7 *$b7);


print "Geheimer Text:\n$Secret\nGeheimer Text verschlüsselt:\n$c1\n";

Hier mal ein Beispiel eines verschlüsselten Textes:

24649059559914228040074776339397578491076898909796429013633625039696593296804955933603074728073652257713043442525994158590870566829652593246739054056111785649319942739646954034334033424596012200058461286770553470427242375087851195329885972320251137329295778974730361995333619640482946979223573962650257873461487825475839095853826666841589420784159414645603132446417676

Zeilenumbrüche ignorieren! Hab ich nur gemacht, um das Forum nicht zu verunstalten!

Werde das Script später noch erweitern, damit der verschlüsselte Text nurnoch halb so gross wird! ;) Also was haltet ihr davon?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

wie wärs, wenn Du deinen Algorithmus mal in "menschenlesbarer" Form veröffentlichst oder zumindest vernünftig kommentierst? Da ich wenig Drang verspüre das Perl-Skript auseinanderzupflücken, hier nur mein erster Eindruck:

0. Die "Sicherheit" basiert nur auf der Multiplikation von zwei Zahlen (eine wird aus dem Schlüssel, die zweite aus dem Klartext generiert). Damit kann ich - sofern ich ein Stück Klartext kenne (sollte kein Problem sein, siehe 2) - problemlos auf den Schlüssel schliessen.

1. Du hast keine "Entschlüsselungsroutine" mit angegeben.

2. Die Performance dürfte bei "größeren" Datenmengen (256 Bytes) sehr schlecht werden, da Du mit Integer-Arithmetik und sehr großen Zahlen arbeitest. D.h. Du kannst nur kleine Datenblöcke verschlüsseln, die einen identischen Chiffretext ergeben und damit sehr leicht zu identifizieren sind.

3. Der verschlüsselte Text ist länger als der Originaltext (deutet auf sehr viel Redundanz hin).

Alles in allem auf den ersten Blick sehr viele Schwachstellen!

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen


use Math::BigInt;



$Secret	= ''; # Zu Verschlüsselnder Text

$Pw	= ''; # Passwort zum verschlüsseln



### Verschlüsseln



@a1 = unpack("C*", $Secret); # Umformen von Zeichen in Zahlen

@b1 = unpack("C*", $Pw);


foreach (0..$#a1) {

	$a2	 = sprintf "%b ", $a1[$_]; # Zahlen in Binärsystem umwandeln

	$a3	.= sprintf "%0.8d", $a2; # Gegebenenfalls auf 8 Zahlen erweitern mit Nullen und zu einer Variable zusammenfügen

}

foreach (0..$#b1) {

	$b2	 = sprintf "%b", $b1[$_];

	$b3	.= sprintf "%0.8d", $b2;

}


$a4 = length($a3); # Länge der Variable herausfinden

$b4 = length($b3);


foreach (0..$a4) {

	push(@a5, substr($a3,$_,1)); # $Variable splitten und zwar nach jeder Zahl

}

foreach (0..$b4) {

	push(@b5, substr($b3,$_,1));

}


$a6 = 1;

$b6 = 1;


foreach (0..$#a5) {# Schleife geht alle Nullen uns Einsen durch

	if ($a5[$_] == 1) {

		$a7 = Math::BigInt->new($a7 +$a6); # aktuelle Potenz wird mit $a7 addiert

	}

	$a6 = Math::BigInt->new($a6 *2); # $a6 wird bei jedem Schleifendurchlauf mit 2 Potenziert

}

foreach (0..$#b5) {

	if ($b5[$_] == 1) {

		$b7 = Math::BigInt->new($b7 +$b6);

	}

	$b6 = Math::BigInt->new($b6 *2);

}


$c1 = Math::BigInt->new($a7 *$b7); # Einmaliger Passwort "Hash" wird mit dem einmaligen Text "Hash" multipliziert.


print "Geheimer Text:\n$Secret\nGeheimer Text verschlüsselt:\n$c1\n";

0. "sofern ich ein Stück Klartext kenne" --> Stimmt nicht

1. Ist zur Zeit noch uninteressant

2. Performence ist wohl das grösste Problem. "sehr leicht zu identifizieren sind. " --> stimmt nicht

3. länger: ja, Redundanz: nein

Wie schon gesagt, durch ein paar Zeilen QUellcode, kann man den verschlüsselten Text halb so gross machen.

PS: Es ist - MEINER MEINUNG NACH - in "menschenlesbarer" Form! Halt ohne Kommentare

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Wenn Du durch ein "ein paar Zeilen Quellcode" den verschlüsselten Text "halb so groß machen" kannst, heisst dass, das der verschlüsseltet Text Redundanzen enthält (schliesslich geht ja kleinerlei Information verloren).

Abgesehen davon reicht ein einfaches Programm nicht aus, um einen vernünftigen Algorithmus zu entwerfen. Kryptographie ist eine Teilgebiet der Mathematik. Dein Algorithmus muss vor einer Implementierung klar definiert sein und den üblichen Angriffsmethoden standhalten!

Zu 1: Warum ist die Entschlüsselung nicht von Bedeutung? Soll niemand in der Lage sein, die verschlüsselten Texte wieder zu entschlüsseln?

Zu 2: Die Performance bezieht sich bei Dir auf die Länge der Eingabe, damit kannst Du nur kleine Eingaben verschlüsseln. Längere Texte müssen also gesplittet und separat behandelt werden (gleiche Blöcke ergeben gleiche Chiffretexte --> Known-Plaintext). Warum sind Deiner Meinung nach die Datenblöcke nicht leicht zu identifizieren?

Zu 3: Siehe oben.

Verschlüsselungsverfahren beruhen auf der Tatsache, dass ein Klartext mit einem Schlüssel verknüpft wird, woraus der Chiffretext entsteht. Die einzige Stelle in Deinem Programm ist die letzte Zeile, in der Du Schlüssel und Klartext miteinander multiplizierst (daran ändert auch nichts die Tatsache, dass Du die interne Repräsentation vorher änderst).

Eine Multiplikation ist umkehrbar, kenne ich einen Cyphertext und einen Plaintext, kann ich daraus den Schlüssel berechnen.

Worin liegt - ausser in der Multiplikation - die Sicherheit Deines Algorithmus?

Welche Art der Verschlüsselung möchtest Du denn überhaupt implementieren? Stream- oder Blockcypher, symmetrisch oder asymmetrisch oder doch ein Hashing (wozu dann der Schlüssel und warum muss der Hash länger als der Plaintext sein)?

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

SCHIE WINDOOF! DARF JETZT ALLES NOCH MAL NEUSCHREIBEN *GRMPF*

Wenn Du durch ein "ein paar Zeilen Quellcode" den verschlüsselten Text "halb so groß machen"

kannst, heisst dass, das der verschlüsseltet Text Redundanzen enthält (schliesslich geht ja

kleinerlei Information verloren).

--> 1:0 Für dich

Abgesehen davon reicht ein einfaches Programm nicht aus, um einen vernünftigen Algorithmus zu

entwerfen. Kryptographie ist eine Teilgebiet der Mathematik. Dein Algorithmus muss vor einer

Implementierung klar definiert sein und den üblichen Angriffsmethoden standhalten!

--> Bis auf Bruteforce sind mir keine anderen "angriffmöglichkeiten" bekannt.

Zu 1: Warum ist die Entschlüsselung nicht von Bedeutung? Soll niemand in der Lage sein, die

verschlüsselten Texte wieder zu entschlüsseln?

--> Ich sagte ja: ZURZEIT! Was willst du mit der Entschlüsselungsroutine, wenn du das Script eh

schice findest? So kommt es mir jedenfalls vor!

1.

Zu 2: Die Performance bezieht sich bei Dir auf die Länge der Eingabe, damit kannst Du nur kleine

Eingaben verschlüsseln. Längere Texte müssen also gesplittet und separat behandelt werden (gleiche

Blöcke ergeben gleiche Chiffretexte --> Known-Plaintext).

2.

Warum sind Deiner Meinung nach die Datenblöcke nicht leicht zu identifizieren?

--> 1. Habe ich oben schon gesagt, das du mit der Preformence recht hattest!

2. Weil es nur EINEN Datenblock gibt! Das Passwort ist bei $a7 EINDEUTIG! Es gibt KEINE andere

Zeichenkombination, welches die gleiche Zahl ergeben würde! Genauso wie mit dem Text bei $b7.

Der verschlüsselte Text ist ein einziger Block! Es wird nciht Zeichenweise, Wortweise oder

Satzweise gearbeitet, sondern der ganze Text!

Verschlüsselungsverfahren beruhen auf der Tatsache, dass ein Klartext mit einem Schlüssel

verknüpft wird, woraus der Chiffretext entsteht. Die einzige Stelle in Deinem Programm ist die

letzte Zeile, in der Du Schlüssel und Klartext miteinander multiplizierst (daran ändert auch

nichts die Tatsache, dass Du die interne Repräsentation vorher änderst).

Eine Multiplikation ist umkehrbar, kenne ich einen Cyphertext und einen Plaintext, kann ich daraus

den Schlüssel berechnen.

--> Wieso Klartext? Passwort und Klartext werden gleich berechnet. "Eine Multiplikation ist

umkehrbar", dann entschlüssel doch meinen Text oben, wenn dus so einfach findest. "Cyphertext und

Plaintext" sagt mir nichts. --> Dann berechne mal!

Worin liegt - ausser in der Multiplikation - die Sicherheit Deines Algorithmus?

--> An der Multiplikation von 2 eindeutigen grossen Zahlen. Was braucht man mehr? Kennst du die

eine Zahl nicht, so kommst du nciht andere auch nicht und je länger das Passwort ist, dessto

sicherer wird der Text auch!

Beispiel:

16 777 216 (16^6) Kombinationen hat mein PC etwa eine Stunde gebraucht allerdings waren das alle

möglichen Farbwerte (00 00 00 - FF FF FF)

Ein Passwort mit 8 Zeichen und 256 möglichen zeichen, würden schon:

18 446 744 073 709 551 616

was dann 1099511627776 Stunden Arbeit wäre an einem 2200Mhz Pc.

Oder fändest du folgendes sicherer?:

x * sin alpha wuzel /xyz,...

oder

e*d=1(mod (p-1)*(q-1))

?

Kommt doch genau auf das gleiche, wenn es opensource ist! DIe Rechnungen kann man ebenso

rückgängig machen!

Welche Art der Verschlüsselung möchtest Du denn überhaupt implementieren? Stream- oder

Blockcypher, symmetrisch oder asymmetrisch oder doch ein Hashing (wozu dann der Schlüssel und

warum muss der Hash länger als der Plaintext sein)?

--> Sagt mir alles nichts, da ich von dem Gebiet eigentlich keine grosse Ahnung habe! Hatte nur

eine Idee und wollte wissen, ob das wirklich so gut/shclecht ist, wie ich es mir gedacht hatte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo FF,

wenn du dich mal allgemein in die Kryptographie und die Verfahren einlesen möchtest, kann ich dir ein sehr gutes Sonderheft von Spektrum der Wissenschaft empfehlen.

Das kann man für 8,90 EUR auch immer noch nachbestellen.

Folge diesem Link.

In diesem Heft werden alle gängigen Verfahren beschrieben und vor allem auch mathematisch geklärt, was nun sicher oder unsicher ist...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Bis auf Bruteforce sind mir keine anderen "angriffmöglichkeiten" bekannt.

Brute Force ist die schlechteste aller Methode, da sämtliche Kombinationen durchgerechnet werden müssen. Es gibt jedoch noch eine Reihe weitere Angriffsmöglichkeiten, die wesentlich effizienter sind: Cyphertext-Only, Know-Plaintext, Chosen-Cyphertext, Social Engineering, usw. "Cyphertext Only" bedeutet dabei, dass nur der verschlüsselte Text bekannt ist, um das Verfahren zu brechen.

An der Multiplikation von 2 eindeutigen grossen Zahlen. Was braucht man mehr? Kennst du die eine Zahl nicht, so kommst du nciht andere auch nicht und je länger das Passwort ist, dessto sicherer wird der Text auch!

Es ist zwar richtig, dass gerade im Bereich der Public-Key Algorithmen mit der Multiplikation sehr grosser Zahlen gearbeitet wird, allerdings sollte die dahinterstehende Zahlentherorie mit berücksichtigt und adäquat angewendet werden (Stichwort: Faktorisierung, Primzahlen).

Die Zerlegung in die Divisoren (in Deinem Beispiel 3456) benötigt ca. 2.5 Minuten, die eigentliche "Entschlüsselung" unter einer Sekunde. Dabei habe ich auf keinerlei Verfahren zurückgegriffen, die beispielsweise mit Häufigkeitsverteilungen arbeiten (die im letzten Schritt einen grossen Speedup bringen sollten, jedoch auf Grund der sehr geringen Laufzeit und des simplen Umstellens der Daten irrelevant sind). Wie bereits erwähnt liegt die einzige "Sicherheit" Deines Programms in der Multiplikation zweier Zahlen, die davorliegenden Schritte (Umkehren der Bitvektoren) spielt keinerlei Rolle und erhöht auch in keinster Weise die Sicherheit, sondern kostet nur unnötige Rechenzeit.

Damit konnte nicht nur der Originaltext wieder hergestellt werden sondern auch gleichzeitig der Schlüssel. D.h. weitere Nachrichten, die mit diesem Schlüssel verschlüsselt wurden können direkt rekonstruiert werden!!

e*d=1(mod (p-1)*(q-1))

Darauf basiert der Public Key Algorithmus RSA. Wenn Du Dich ernsthaft mit Kryptographie beschäftigen möchtest, solltest Du dir das Buch "Angewandte Kryptographie" von Bruce Schneier zulegen (das ist das Standardwerk in diesem Bereich).

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm ist das Thema wohl viel komplizierter, als ich gedacht habe! :rolleyes: :eek:

@roaxius: Hab des mal Bestellt.

@nic_power: "Die Zerlegung in die Divisoren (in Deinem Beispiel 3456) benötigt ca. 2.5 Minuten, die eigentliche "Entschlüsselung" unter einer Sekunde." --> Wärst du so nett, das genauer zu Schildern? Ich versteh nämlich immernoch nicht, wie du das geschaft hast :confused: Wäre es viel schwerer gewesen, wenn der QUellcode des Scriptes nciht bekannt gewesen wäre??

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Ohne den Algorithmus zu kennen, wäre es deutlich aufwändiger gewesen. Allerdings sollte man Algorithmen die nicht öffentlich sind, keine weitere Beachtung schenken. In diesem Fall ist nicht überprüfbar, ob sie wirklich sicher sind. Abgesehen davon, müssen die Algorithmen beim Sender/Empfänger vorhanden sein, wenn sie verwendet werden sollen (Notfalls also über ein Reverse Engineering des Codes).

Zum Verschlüsseln der Daten multiplizierst Du zwei Zahlen miteinander:

a) Verschluesselter Text=Schluessel x Klartext

D.h., dass ich den Schluessel (und auch den Klartext) durch einfaches Umstellen ermitteln kann:

B) Schluessel=Verschluesselter Text/Klartext bzw.

c) Klartext=Verschluesselter Text/Schluessel

Da es normalerweise keine eindeutige Lösung für das Problem gibt, muss man also alle ganzzahligen Teiler suchen, für die a) gilt. In dem von Dir geposteten Beispiel gibt es genau 3456 Teiler für die Zahl. Einer dieser Teiler ist der Klartext, ein weiterer der Schlüssel. Diese Teiler läßt man nun einfach "rückwärts" durch das von Dir verwendete Verfahren zum Umstellen des Bitvektors laufen. Alternativ könnte man auch vorher schon nach Eigenheiten (Bitverteilungen, die mit Buchstabenwahrscheinlichkeiten übereinstimmen, bestimmten Bitmustern, zweier-Potenzen entsprechen einem einfachen Shift und können daher wegfallen, usw.) suchen.

Dabei solltest Du beachten, dass Du im unguenstigsten Fall zwei Primzahlen erzeugst, es also eine eindeutige Lösung für das Problem gibt (da Schlüssel und Klartext eindeutig sind). In diesem Fall hast Du bereits nach der Zerlegung in die beiden Teiler den Schlüssel und den Klartext ermittelt.

Kryptografie ist eines der komplexesten Gebiete der Mathematik, es gibt weltweit nur wenige Leute, die in der Lage sind, neue Verschlüsselungsalgorithmen zu entwerfen.

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm daran habe ich nciht gedacht :eek:

Naja war auch nur eine Idee! Bin auch nicht wirklich ein Informatiker :)

Informatik ist eher ein grosses Hobby von mir! Ich weiss vielleicht viel, aber vielles nicht tief genug, wie sich eben gezeigt hat :D

PS: Mal eine Frage, so neben bei: Wie alt bist Du (wenn ich Fragen darf)?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast mir die Antwort zwar per PM geschickt, weil du meintest, das würde langsam richtung Off Topic gehen, doch meine Frage mit dem Alter hatte schon seine Gründe :)

Bin selber erst 18 jahre alt. Du bist ja um einiges älter!

Mir scheint aber das dieses Thema höhere Mathematik bräuchte! Bin schon 2 Jahre in der Berufsschule und nach den Sommerferien werde ich nie wieder Mathe als Fach haben. Das letzte Thema war Quadratische Gleichungen.

Nun wollte ich Wissen:

1. Hätte jeder Anfänger son Script programmieren können, oder scheint das Script doch ein gewisses "etwas" zu haben?

2. Lohnt es sich überhaupt bei meinem Mathematischem Wissenstand weiter zu machen? =)

Wie würde die Sicherheit aussehen, wenn ich folgende Formel nehmen würde?:

C = (T+1-P)^2

Wahrscheinlich sagt dir das eh nichts, werde es später aber mal programmieren,...

PS: für was steht das mod in "e*d=1(mod (p-1)*(q-1))"???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

um sich wirklich ernsthaft mit Kryptographie (Analyse vorhandener Algorithmen auf Schwachstellen, Entwurf neuer Algorithmen usw.) sollten man _mindestens_ ein Mathematik-Studium hinter sich gebracht haben, möglichst mit einem entsprechenden Schwerpunkt wie Kryptographie oder Kombinatorik. Desweiteren sollte man einige Jahre intensiv auf diesem Gebiet (theoretisch) gearbeitet haben.

Ich persönlich halte das Skript für sehr umständlich programmiert, die komplette Bignum-Arithmetik läßt sich problemlos durch wesentlich effizientere und einfachere Algorithmen ersetzen (im Endeffekt drehst Du Deinen String nur auf Bitebene um). Hinzu kommt, dass dieses Verfahren keinerlei Auswirkung auf die Sicherheit hat und daher auch weggelassen werden kann.

Ich denke, Du solltest Dich erstmal mit einem der beiden Literaturtipps von oben intensiv auseinander setzen, da dort die Basisverfahren und Grundlagen erklärt werden.

für was steht das mod in "e*d=1(mod (p-1)*(q-1))"

In diesem Fall steht das mod für den modularen Kehrwert (die Grundlagen dazu sind ebenfalls im Buch von Bruce Schneier zu finden).

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Pff son Witz!

Hab jetzt entlich das Heft von Spektrum bekommen!

Das Heft selber kostet 8.90,- was schon recht teuer ist und jetzt verlangen die im ernst insgesamt 19.55€ Die haben doch eine an der Waffel :confused:

Zahl ich ja mehr für Versand als fürs Heft --> Das find ich schon ziemlich derb!

Link zu diesem Kommentar
Auf anderen Seiten teilen

"Die Auslands-Versandkosten beinhalten die Kosten für Transport und Verpackung sowie die dafür abzuführende Mehrwertsteuer. "

Stimmt schon. Wohne in der Schweiz. Aber das des soo teuer wird hät ich aber aucht nicht gedacht,... "Verpackung" Hmm war halt ein stinknormaler etwas grösserer Brief.

Die Rechnung ist auch irgndwie komisch! Irgendwie sone quadratische mischung zwischen A4 und A3 :confused:

--> Voll professionell :uli :rolleyes:

Werde aber nochmal nachfragen.

Sollange les ich mir das mal durch. Scheint noch recht Interessant zu sein!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...