Tag Archives: Java

Erkennen von Schwachstellen in verschlüsselten Daten

Dank einem entsprechenden Posting von SANS habe ich mir mal wieder ein paar Gedanken gemacht über die Thematik und den Einsatz von Entropy, also der Zeichendichte von einem String, einem Text oder einer gesamten Applikation.

Obwohl die Einsatzgebiete eigentlich recht umfassend sind, habe ich die Entropy eigentlich bisher nur zur Analyse von modifizierten Files unter Windows eingesetzt, wie in meinem Artikel über densityScout beschrieben. Doch eigentlich sind der Fantasie keine Grenzen gesetzt, da ich dank der Entropy eine einfache Anomaly-Detection auf jedem nur erdenklichen String durchführen kann, sei das nun ein Teil aus einem Text, ein Dateiname oder gar ein abgefragter DNS-Request.

Und so habe ich mir kurzerhand ein kleines Java-Tool genannt „entropyCalc“ geschrieben, womit ich genau die Problematik in dem SANS-Artikel angehen möchte: Ein verschlüsselter Text soll analysiert werden, ob er komplett verschlüsselt wurde, oder ob noch einzelne Textstellen unverschlüsselt erhalten sind:

A tool for dividing the input in X parts and calculating the entorpy of each. This can help analysing a file encrypted by a ransomware regarding its quality.

Call the prepared JAR passing the path of the file (path/to/file) and the number of parts (numb_of_parts) the file should be divided into. Optionally you can pass a max value for the entropy to display:

java -jar entorpyCalc.jar /path/to/file numb_of_parts [max_entorpy_val]

Zu finden gibts das ganze unter meinem GitHub-Account.

Wie die Beschreibung schon sagt, ist das Tool recht einfach gehalten: Ich kann ein File eingeben und die Anzahl an Parts bestimmen. Zusätzlich kann ich auch noch einen optionalen Filter setzen, damit mir nur Werte tiefer meiner gesetzten Marke angezeigt werden.

Wenn man damit nun das Test-File /res/test.bin mit initial 200 Parts analysiert, so interessiert mich vor allem mal die letzten 3 Zeilen mit der Zusammenfassung:

...
[039985 - 040188] 6.902040462088795
[040189 - 040392] 6.870033966927124
[040393 - 040596] 6.877924361409659
[040597 - 040800] 6.883538317427925
[040801 - 040943] 6.663231126927669

[Minimum] 4.425002256404638
[Maximum] 7.1385534526549055
[Average] 7.924522721343111

Da ich hier bereits grosse Abweichungen zwischen Minimum und Maximum sehe, weiss ich, dass da etwas noch in Echtform da sein muss. Also erhöhen wir einfach mal auf 1000 Parts und setzen 4.0 als die Obergrenze an Dichten für die angezeigten Parts:

[004161 - 004200] 2.885290338447572
[004201 - 004240] 0.9975846798245739
[004241 - 004280] 2.957351274437585
[004481 - 004520] 3.4607912955405005

[Minimum] 0.9975846798245739
[Maximum] 5.3219280948873635
[Average] 7.924522721343111

Und sofort ersichtlich wird, dass da garantiert noch etwas unverschlüsseltes drinstecken muss, denn eine Dichte von 0.99 ist sehr stark an einer normalen Sprache angelehnt. Weiter kann ich sehen, dass mein String irgendwo zwischen Zeichen 4161 und 4200 beginnen und zwischen Zeichen 4481 und 4520 enden muss, da hier auch noch eine tiefere Dichte erzielt wurde.

Was ich aktuell noch nicht bieten kann, ist eine Methodik zum Eingrenzen des genauen Strings, aber daran arbeite ich noch und vielleicht kommt mir ja die zündende Idee noch.

Memory für Eclipse: Out of Memory Exception

Für Performance-Messungen beim Abfüllen, Durchsuchen oder Löschen von Listen, Trees oder Maps habe ich ein kleines Java-Programm geschrieben, welches alle Aktionen misst und ausgibt. Eigentlich nichts grosses, doch bei den 10 Millionen Instanzen, welche ich für ein aussagekräftiges Resultat brauche, kommt meine Maschine schnell ans Limit und Reklamiert mit einem Runtime-Error in Form einer „Out of Memory Exception“. Das liegt daran, dass Eclipse einem Programm nur sehr begrenzt Memory zur Verfügung stellt (ich glaube gerade mal 256 MB) und dies bei 10 Millionen Instanzen nicht ganz ausreicht.

Also muss ich auf meinem Mac das Programm mit mehr Memory starten, und das geht ganz einfach und unkompliziert über Eclipse. Einfach unter Run > Run Configurations folgende Werte eintragen:

memory

Nun, nochmals ausführen und schon läuft alles durch. Das Programm werde ich samt Ergebnis vielleicht auch noch kurz veröffentlichen, mal schauen, was rauskommt.

Schiffe versenken in Java

Als Prüfungsvorbereitung kämpfe ich mich zur Zeit ein kleinwenig mit Java ab. Zum Glück noch nichts mit GUI, etc, einfach Java Basics, wie in den letzten zwei Büchern, die ich vorgestellt hatte. Im Zuge dieser Vorbereitung ist ein Programm entstanden, dass ich euch nicht vorenthalten möchte, vielleicht gibt es ja die eine oder andere Verbesserung oder Kritik, oder es hilft sonst jemandem auf seinem Weg.

Das Projekt besteht aus drei Klassen: Game, für die Hauptklasse, Schiffe, für die Schiffe und Feld, für die einzelnen Felder.
Die Schiffe-Klasse beinhaltet einen Namen und da Arrays immer so viel Vorplanung voraussetzen, eine Arraylist:

import java.util.ArrayList;

public class Schiffe {
	int name;
	ArrayList<Feld> position = new ArrayList<Feld>();
}

Auch die Feld-Klasse ist ganz schlicht, nur mit einem zusätzlichen Konstruktor:

public class Feld {
	int x;
	int y;
	int orientation;
	
	public Feld(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

Interessant wird es in der Game-Klasse. Es gibt eine Methode positioning(), welche die Schiffe setzt. Darin werden auch gleich doppelt belegte Felder geprüft. Weiter gibt es eine Methode play(), welche für die Spieler 1 und 2 nacheinander die Methode shoot() aufruft, und darin gleich die Referenzen auf die Feld- und zum Schluss auch noch auf die Schiff-Objekte löscht. Ist ein Schiff versenkt, so wird die Methode win() aufgerufen, welche checkt, ob jemand gewonnen hat und bei bedarf, das Spiel unterbricht. Gar nicht so kompliziert oder? 😉

Read more

Android App – Entwicklungsumgebung

android

Artikelserie: Android App – Entwicklungsumgebung

Vor kurzem habe ich mir das neue Samsung Galaxy Tab mit Android 2.2 zugelegt und wollte mich nun mal ein bisschen schlau machen betreffend App-Programmierung für Android.
Ich habe mir vorgenommen in einer Artikelserie über meine Fortschritte und ersten Apps zu berichten.

Somit fange ich hier mal an über die Installation der Entwicklungsumgebung und erste Informationsquellen zu berichten.

Die Installation ist auf der Google-Seite sehr gut beschrieben, jedoch ausschliesslich in englischer Sprache.
Jedoch ist alles sehr einfach gehalten, weshalb ich mir nicht mehr die Mühe mache, alles noch zu übersetzen.

Im Gegensatz zur Apple-App-Entwicklung (Achtung flame 😉 ) gefällt mir hier sehr gut, dass auf Windows, Mac und Linux entwickelt werden kann und man sich nicht zuerst noch einkaufen muss…

Nachdem nun die Entwicklungsumgebung eingerichtet ist, müssen mehr Informationen her!
Zum Einstieg halte ich mich an das Buch Android von Arno Becker und Marcus Pant, welches als eBook hier gratis heruntergeladen werden kann.
Zwar behandelt dieses Buch noch die alte 1.5er Version von Android, jedoch für den Einstieg wird es seinen Zweck erfüllen. Und da ich kein besseres Buch kenne zur Zeit, muss das reichen…

Somit wäre der erste Meilenstein zur eigenen Android App gelegt, was mir nun noch fehlt, ist eine gute Idee… Vorschläge? 🙂

Das Sieb des Eratosthenes

Wenn man den Titel so liest, werden sich wahrscheinlich die wenigstens etwas darunter vorstellen können…

Mir ging es genauso! Zuerst habe ich an Mathematik wie Satz des Pythagoras u.ä. gedacht, doch damit hat dies nun nicht viel zu tun, obwohl es um Mathematik, wenn auch einfache, geht!

Nun was ist dieses Sieb nun:

Das Sieb des Eratosthenes beschreibt ein Vorgang um aus einer Zahlenkette alle Primzahlen herauszulesen.

Eine Primzahl ist eine natürliche Zahl mit genau zwei natürlichen Zahlen als Teiler, nämlich der Zahl 1 und sich selbst

sponsored by Wikipedia

Eratosthenes macht sich dabei das Wissen zunutze, dass jede Nicht-Primzahl ein Vielfaches einer Primzahl ist. So wird jede zahl genommen und mit allen x-Reihen (2er-Reihe, 3er-Reihe, …, 1234er-Reihe) verglichen.

Gibt eine Zahl dann ein Positives Feedback, sprich sie ist ein Vielfaches einer andern, ist es keine Primzahl mehr und kann ausgeschlossen werden.

So kann man, wenn man genügend Rechenleistung hat, Primzahlen mit mehreren Millionen Stellen generieren lassen.

Der Code zum ganzen, habe ich in Java geschrieben. Er ist sicherlicht nicht gerade der kürzeste und beste, doch ich hoffe ihr verzeiht mir, wenn ich euch sage, dass ich gerade eben erst angefangen habe Java zu programmieren.

Ach ja: Programmiert wurde das ganze in Eclips unter Ubuntu 8.04 🙂

  • Lösungsbeispiel – TXT
  • Lösungsbeispiel – Java