[PHP] CryptFile Klasse

[PHP] CryptFile Klasse| Datum: 05.10.2009 - 17:10 | Author: Anonymous

Ein kleines nebenbei entstandenes PHP Script - um genau zu sein eine Klasse.
Weil ich auf einige Libs zurückgegriffen habe, die nicht überall verfügbar sind, wird das Script hier womöglich auch nicht überall funktionieren. Am allerwahrscheinlichsten nach auch nicht auf den bekannten Freehostern.

Das Script benötigt die MCrypt Erweiterung von PHP, mit der man auf Verschlüsselungsalgorithmen, wie mein geliebtes Rijndael (auch bekannt unter AES), zurückgreifen kann.

Hier ist ein Link zum Source mit [i:24d9lntg]funktionierendem[/i:24d9lntg] Syntax Highlight, deshalb hab ich dafür auf die bbcode-code tags verzichtet:
http://junemaster.ju.funpic.de/quote/index.php?id=1069

Das Script ist unter der GPL (GNU General Public License). Ihr dürft es also benutzen, verändern und verteilen. Die Lizenz dürft ihr natürlich nicht verändern.

Hier folgt ein kleines Beispiel.
Wer mit den Datei-Funktionen von PHP vertraut ist, der wird hiermit nur wenig Probleme haben.

Code


<?php

require('db.php');

//die DAtei wird autoamtisch erstellt, falls nicht vorhanden
$file = new CryptFile('neutest.db', 'abcdef');

//Daten in die Datei Schreiben:
$file->fwrite("Hallo Welt");

//Dateizeiger verschieben (Konstanten SSEK_SET, SEEK_CUR und SEEK_END sind hier auch möglich - selber effekt)
$file->fseek(0); //hier also zum Anfang der Datei springen

//Daten auslesen
$data = $file->fread(10); //10 Byte auslesen von der aktuellen Position des Zeigers.

echo $data;

$file->fclose(); //datei wieder ordnungsgemäß schließen

//wer die Datei Mit einem HExeditor öffnet wird feststellen, dass nirgends "Hallo Welt" zu finden ist. :)

?>





Es gibt durchaus das ein oder andere Problem mit der Klasse.
Weil ich es an "Sektoren" gebunden habe, wird bei einem Schreibprozess, auch wenn es nur ein einzelnes Byte ist - also ein einzelnes Zeichen ist - ein ganzer Sektor belegt.
So ein Sektor ist bei mir standardmäßig 512 Byte groß - ist also nicht die große Welt. Die zusatzdaten sind ne reihe Null-Bytes. Nur hat es zum Nachteil, dass das Lesen mit fread bis zum "Ende der Datei" mehr Daten ausgibt, als man zu beginn vielleicht hineingeschrieben hat.
fread ist deshalb mit einem zweiten Parameter ausgestattet, der Standardmäßig die Null-Bytes von rechts trimt (bsp. rtrim($data, "\0"); ). Setzt man den zweiten Parameter auf [i:24d9lntg]false[/i:24d9lntg], werden die überschüssigen Null-Bytes nicht entfernt.

Bei mir hatte es in den Paar testversuchen keinerlei Probleme gemacht.
Das ganze ist dann vergleichbar mit "AES-CBC-ESSIV". Wobei ich einige Dinge (besonderrs das ESSIV) wegen "null-plan" bissel angepasst hab.

Hier ein Paar wikilinks zu den verwendeten Techniken:
AES: http://de.wikipedia.org/wiki/Rijndael (der Teil ist in mcrypt vorhanden)
CBC: http://de.wikipedia.org/wiki/Cipher_Block_Chaining
ESSIV: http://de.wikipedia.org/wiki/ESSIV

mfg Balmung

Re: [PHP] CryptFile Klasse| Datum: 05.10.2009 - 17:10 | Author: Fazitas

Vielen Dank :D

Ich weiß zwar nicht wofür ich die Klasse verwenden könnte,
aber ich denke es wird dir sicher noch jemand sehr dankbar sein :)

Re: [PHP] CryptFile Klasse| Datum: 05.10.2009 - 18:10 | Author: PCFreund

ich weiß uch net wofür ...
da hättest dir ein richtig dickes pl+s verdient ...
warte ich schreib mal was an dhmh im was kann man noch verbessern thread ...

Re: [PHP] CryptFile Klasse| Datum: 05.10.2009 - 18:10 | Author: Anonymous

nun wofür oder nicht wofür... ehrlich gesagt hab ich auch kein plan, aber ich mag Verschlüsselungen jeder Art, und beim Speichern von Daten, besonders Beutzerdaten die unter Datenschutz stehen, kann man nie sicher gneug sein. :)
Mir hat es jedenfalls Spaß gemacht das Teil zu basteln xD
Ich überlege noch ob ich die Verschlüsselung AES (Rijndael) zusätzlich noch in PHP umsetze, damit man auf die mcrypt Lib verzichten kann... Optimal ist es zwar nicht, weil PHP da recht langsam ist, aber allein um mehr über AES zu erfahren durchaus wert mal auszuprobieren.

Re: [PHP] CryptFile Klasse| Datum: 05.10.2009 - 18:10 | Author: PCFreund

nein das computerboard ist schon langsam genug, dafür dass es aber auch wiederrum 2 mb bandbreite hat 0.o

Re: [PHP] CryptFile Klasse| Datum: 05.10.2009 - 18:10 | Author: Anonymous

Um gottes willen, sowas soll man doch nicht für ein Board benutzen xD
Ich bezweifle, dass das überhaupt einen Sinnvollen nutzen hat.
Die Benutzerdaten hier werden ja ohnehin in einer richtigen Datenbank gespeichert und sind somit generell vor Fremdzugriff geschützt.

Re: [PHP] CryptFile Klasse| Datum: 06.10.2009 - 14:10 | Author: SirZimt

Er will doch alles in ein Forum reinquetschen |(
Aber sowas könnte man doch dann au per JavaScript machen? oder nich? :angel:

Re: [PHP] CryptFile Klasse| Datum: 06.10.2009 - 14:10 | Author: PCFreund

dhmh will uns anscheinend gut genug versorgen, deswegen quetscht er alles noch in die letzten ecken rein, was da noch alles reinpasst
bis es nicht mehr funktioniert :/ dann helf ich ihm aber, genau sowie er mir hilft :)
<!--Back2Topic-->
also für was ist dieser script eigentlich gut !?

Re: [PHP] CryptFile Klasse| Datum: 06.10.2009 - 16:10 | Author: SirZimt

[quote="PCFreund":1jjrn944]dhmh will uns anscheinend gut genug versorgen, deswegen quetscht er alles noch in die letzten ecken rein, was da noch alles reinpasst
bis es nicht mehr funktioniert :/ dann helf ich ihm aber, genau sowie er mir hilft :)
<!--Back2Topic-->
also für was ist dieser script eigentlich gut !?[/quote:1jjrn944]

Ich meinte nicht DHMH! Ich meinte DICH!

Re: [PHP] CryptFile Klasse| Datum: 06.10.2009 - 16:10 | Author: PCFreund

ok vergiss es einfach !
<!--Back2Topic-->

Re: [PHP] CryptFile Klasse| Datum: 07.10.2009 - 15:10 | Author: Anonymous

[quote="SirZimt":30ljpfmv]Aber sowas könnte man doch dann au per JavaScript machen? oder nich? :angel:[/quote:30ljpfmv]
JavaScript? Bezweifle ich. 1. ist es nicht bei jedem aktiviert, 2. ist es schomn mit PHP recht langsam und javascript wird dann nur noch schlimmer... Außerdem kann man mit JavaScript keine Dateien schreiben :)

[quote="PCFreund":30ljpfmv]also für was ist dieser script eigentlich gut !?[/quote:30ljpfmv]
Für dich nochmal ganz genau (und jeder andere, der es nicht verstanden hat).

Wie gesagt, normal schreibt man in Dateien wie folgt:

Code


<?php
//w+ = schreib/lesemodus (datei wird dabei geleert)
$fp = fopen('datei.txt', 'w+');
//text schreiben
fwrite($fp, 'irgendwelcher zu schriebender Text');
//zu beginn der datei springen (beim schreiben wird der zeiger mit verschoben)
fseek($fp, 0);
//daten wieder aus der datei lesen
$data = fread($fp, 34);
//daten ausgeben
echo $data;
?>



Diese Daten werden in klarer Form gespeichert, d.h. mit jedem anderen Programm kann man es ebenfalls öffnen und nachschauen was drinne steht.
Mit einem Hexeditor betrachtet schaut der Inhalt der Datei "datei.txt" so aus:

Code


00000000 69 72 67 65 6E 64 77 65 6C 63 68 65 72 20 7A 75 irgendwelcher zu
00000010 20 73 63 68 72 69 65 62 65 6E 64 65 72 20 54 65 schriebender Te
00000020 78 74 xt



Man erkennt die Daten also ohne Probleme.

Meine Variante ist von der Verwendung ganz ähnlich:

Code


<?php
//die Datei mit Klasse einbinden
require('cryptclass.php');
//Neues Objekt erstellen, passwort angeben (Datei wird automatisch erstellt, wenn nicht vorhanden!)
$fc = new CryptFile('datei.txt', 'meinpasswort');
//Die gleiche Daten wie in der Normalen Version schreiben
$fc->fwrite('irgendwelcher zu schriebender Text');
//zu beginn der datei springen
$fc->fseek(0);
//daten wieder aus der datei lesen
$data = $fc->fread(34);
//daten ausgeben
echo $data;
?>



Wenn man die datei "datei.txt" JETZT mit einem Hexeditor betrachtet, bekommt man folgende Ausgabe:

Code


00000000 96 9E 13 55 27 DF 6A F6 8B 31 0F C0 F0 14 A2 5A ...U'.j..1.....Z
00000010 D7 E8 60 3A 8E 08 38 FC 29 4E B5 C0 29 93 23 48 ..`:..8.)N..).#H
00000020 32 28 CB C1 FD 1A 7D F2 C5 FA 76 D3 DE 26 AF A0 2(....}...v..&..
00000030 D6 2E BE 81 01 F0 EC DA 92 5A 91 D4 00 A9 03 E3 .........Z......
00000040 05 DD B7 C4 D8 1F 7E EB A0 40 04 14 F8 E3 21 8E ......~..@....!.
00000050 D8 41 35 D3 58 AF C2 57 D9 5B 34 08 95 0A 31 52 .A5.X..W.[4...1R
00000060 02 9A BC 11 FA BD 54 B0 7F 88 95 65 63 A1 AC D3 ......T....ec...
00000070 27 40 16 43 81 20 D9 C5 EC 36 18 3A 95 CB 94 F4 '@.C. ...6.:....
00000080 54 21 B4 A5 22 3B 9B C3 C2 E1 85 BC 9D AC 71 58 T!..";........qX
00000090 60 BC 0B DE E3 40 08 3F 89 6B A7 20 C7 AE 1A 50 `....@.?.k. ...P
000000A0 DC B6 8B 9A 23 D9 8B FD 1F 05 A1 E0 14 3F FB 99 ....#........?..
000000B0 A4 EC 0E 10 60 C4 C2 11 C0 11 B8 C2 20 5F 83 AA ....`....... _..
000000C0 F1 2E 7B D8 E3 4E 89 86 8C D0 72 B4 EB AC EC EE ..{..N....r.....
000000D0 40 3C 86 35 2E B5 32 ED 54 E4 F4 2D B1 E8 29 4D @<.5..2.T..-..)M
000000E0 6F E8 D5 55 E9 14 58 F0 CA 6B C7 FB B7 CF 2B 16 o..U..X..k....+.
000000F0 7B 22 C0 3B 88 73 EE 78 BA 4D 8D 22 55 DF 1D 55 {".;.s.x.M."U..U
00000100 9E 47 56 C7 FA F8 A0 B3 55 7C 18 87 49 8B 89 A5 .GV.....U|..I...
00000110 02 74 32 35 30 D2 56 A0 F5 DD B8 22 36 94 3F A3 .t250.V...."6.?.
00000120 28 A5 11 76 35 CE AC 30 EA 80 55 C8 44 9A 19 60 (..v5..0..U.D..`
00000130 9D 99 F2 AE D2 F5 AC EA 6C 42 D1 15 BE 96 4C F8 ........lB....L.
00000140 B9 84 07 D3 3D F9 9A 9B 3B 24 E4 91 85 F7 05 DF ....=...;$......
00000150 59 72 21 0C 59 B1 5D 31 55 94 68 75 DB 24 07 18 Yr!.Y.]1U.hu.$..
00000160 EA C7 1E 07 DC 55 FB 3E 2D E6 8F 6D 7F 43 0B 25 .....U.>-..m.C.%
00000170 FC 49 49 83 B0 44 D5 86 47 6C A1 25 96 98 D3 31 .II..D..Gl.%...1
00000180 B1 5B A4 93 D5 CC 01 44 D3 22 32 B4 0B CE E1 84 .[.....D."2.....
00000190 AA E6 21 88 DB 4C 50 1D 3F 91 53 3C 24 AE 9B C6 ..!..LP.?.S<$...
000001A0 DC EA D5 C5 1B 5F 58 4F 6C D8 EF 8C 57 BA 53 E1 ....._XOl...W.S.
000001B0 8E E3 49 58 A3 AC 33 3B 61 A1 42 A8 01 84 D6 F9 ..IX..3;a.B.....
000001C0 E8 A3 21 3A CE 95 17 F2 14 F6 C8 5E 31 1E 27 8A ..!:.......^1.'.
000001D0 4B B2 D6 52 57 10 85 33 C3 03 C1 33 9D 4C 5B 6C K..RW..3...3.L[l
000001E0 0B 72 A7 B4 62 47 BB E3 3C 7C 52 07 EE 83 43 79 .r..bG..<|R...Cy
000001F0 8F 2F 3B A2 AE AC 95 80 80 26 80 C6 E9 2D ED 32 ./;......&...-.2



Wie man sieht, sieht man nichts außer "Müll". Tatsache ist aber, dass der Text 'irgendwelcher zu schriebender Text' Dort drinne in den ersten 48(!) Byte Verschlüsselt wurde.

Hier werden 512 Byte automatisch belegt, deshalb "wirkt" es so groß. Es handelt sich dabei nicht um irgendeine Form von exponentiellem Wachstum. wenn 512 Byte geschrieben werden, werden auch nur 512 Byte belegt. beim 513ten Byte werden die nächsten 512 (also insgesamt 1024 Byte) mitbelegt. So verschlüsselt es sich einfacher.

mfg Balmung

Re: [PHP] CryptFile Klasse| Datum: 07.10.2009 - 18:10 | Author: PCFreund

achso ... *kapier*nicht gebrauchen kann*
für was verschlüsseln !?
ein php script wird auf einem server ausgeführt auf dem ohnehin nur der admin zugriff hat, für was soll dann jemand verschlüsseln wenn ja eh nur der admin da rein geht !?

Re: [PHP] CryptFile Klasse| Datum: 07.10.2009 - 20:10 | Author: SirZimt

Weils leute gibt die klauen dir diese Dateien wo nur der Admin zu sehen hat...
Kennst du Programme namens "Sniffer/Grabber"? Die Dinger sind genial!... und legal

Re: [PHP] CryptFile Klasse| Datum: 08.10.2009 - 20:10 | Author: Anonymous

Legal, wenn man sie nicht für illegales einsetzt.
@PCFreund, hab nie behauptet, dass man es tatsächlich einsetzen soll. Ich fand es lediglich interessant umzusetzen und wollte es niemandem vorenthalten.
Wer sowas brauch darf es nutzen. Warum auch immer.

Re: [PHP] CryptFile Klasse| Datum: 09.10.2009 - 16:10 | Author: SirZimt

Sowas ist schon interessant zum Beispiel für Leute die ein Forum basteln wollen ohne Datenbank da wäre sowas richtig gut!
Persönlich brauche ich es zwar nicht aber trotzdem! Richtig gute Idee Balmung ;)