Verschlüsselung von Dateien

Status
Nicht offen für weitere Antworten.

TeKo

Mitglied
Moin,
Also ich möchte ne Datei mit XXTEA verschlüsseln, wenn ich die Datei einfach in ein Byte Array einlese, läuft alles.
Jetzt lese ich die Datei Stückweise ein und die Ausgabe ist einfach ca. 1kb kleiner als die Original Datei.

Was mache ich hier falsch?
Einlesen:
Code:
byte[] bytes = new byte[1024];

		int i = 0;
		int j = 0;

XXTEA xxtea = new XXTEA(); 
			while (j <= file.length()) {
				if (i < 1024 && i < file.length()) {
					bytes[i] = (byte) fis.read();
					i++;
					j++;
				} else {
					i = 0;
					fos.write(xxtea.encrypt(bytes,key));
				}
			}


Wenn ihr den TEA code braucht, bescheid sagen, aber ist halt einfach ne funktion, die nen Byte Array übergeben kriegt, dies dann in ein Int Array umwandelt, verschlüsselt und wieder als Byte Array ausgibt.
 
S

SlaterB

Gast
fos.write() wird nur bei i = 1024 durchgeführt,
wenn die Datei aber nur 950 lang ist oder zumindest der letzte Abschnitt der Datei nicht auf ganze 1024 kommt,
dann wird der letzte Teil nicht bearbeitet,

lasse dir den Wert i nach der while-Schleife ausgeben, um so viel wird die Datei kleiner sein,
du musst nach der while-Schleife je nach i-Stand den Rest bearbeiten

-----

Vorsicht mit tausend- oder millionenfachen Aufruf von file.length(),
mit etwas Pech ist da jedes Mal ein Dateizugriff nötig,

wenn du weißt, dass sich die Datei nicht ändert, dann speichere diesen Wert in einer Variablen,

genauso ist fis.read() einzeln ganz schön langsam, verwende lieber einen BufferedInputStream
und lies gleich tausende Bytes auf einmal ein, das spart evtl. auch Festplattenzugriffe

wenn du einen Buffer von 1024 nimmst, dann kannst du gleich die Schleife vereinfachen:
immer 1024 lesen und gleich speichern,
du wirst weiterhin das Problem haben, dass die Dateilänge nicht unbedingt genau durch 1024 teilbar ist, aber etwas einfacher wirds auch bei dieser Sache
 

TeKo

Mitglied
Erstma Danke für die schnelle Antwort.

Den Teil mit der länge < 1024 habe ich doch damit:
Code:
if (i < 1024 && i < file.length())
abgefangen oder nicht?

Werde mir mal den BufferedIS angucken, habe bis jetzt wenig mit solchen Sachen gearbeitet.

Wegen den vielen aufrufen von file.length(), um sowas habe ich mich erstmal gar nicht gekümmert, ich wollte erstmal, dass es überhaupt funktioniert und dann kann ich gucken, wie ich es schneller oder Speicher schonender mache.[/code]
 
S

SlaterB

Gast
> if (i < 1024 && i < file.length())

kommt in 99,9% aller Schleifendurchläufe dran, ja, aber damit wird nur das Array beschrieben,

der EINE else-Fall mit dem
> fos.write(xxtea.encrypt(bytes,key));
ist doch viel interessanter, der fehlt und deswegen ist die Datei zu kurz

-----

"i < file.length()" könntest du im if gar weglassen, die while-Bedingung verhindert dies genauso

-------

vielleicht möchtest du eine Schleife
if (i < 1024 && (i+1) < file.length())

versuchs mal damit

allerdings musst du aufpassen, dass du keine Endlosschleife erhälst,
wenn immer in den else-Fall gesprungen wird, j sich nie erhöht,

außerdem darfst du nicht das ganze Array schreiben, es ist nur teilweise gefüllt
bzw. enthät, noch schlimmer, teilweise alte, nicht überschriebene, Daten
 

TeKo

Mitglied
habe file.length() mal in nen int geschrieben, hattest wohl recht geht 100mal so schnell.

das mit dem (i+1) hat nichts verändert eine 1.272kb datei ist nur 1.271kb groß


Mit der Endlosschleife verstehe ich nicht ganz, ich möchte j ja auch nur ehöhen, wenn wirklich was in das Array geschriebenen wurde.

Aber jetzt weiß ich glaube ich, was mein Fehler war.
Wenn die Datei z.B. 1025 bytes hat, dann werden die ersten 1024 geschrieben, dann kommt das 1025te an Stelle 0 des Arrays, wird aber nicht mehr geschrieben, da i nicht 1024 ist.

Wie mache ich dass denn am besten mit dem nicht leeren Array, nach jedem schreiben neu initialisieren ist ja iwie nicht das wahre.

Aber ich müsste denke ich bei dem letzten Teil der Datei, welcher wohl nicht immer genau 1024 groß ist das Array kürzen und dann zum schreiben weiter geben.
 
S

SlaterB

Gast
stimmt, i+1 macht wenig sinn, da i eh ständig auf 0 gesetzt wird,
die Idee besser nicht weiter verfolgen,

-----

das einfachste wäre, alles so wie bisher zu lassen und am Ende nach der Schleife nochmal das verbleibende Array zu speichern,

was du an
xxtea.encrypt() übergeben kannst/ darfst/ musst/ solltest kann ich nicht beurteilen,
vielleicht kürzt du das Array, ja,
dann musst du auch nicht neuinitialisieren
 

TeKo

Mitglied
Habe da mal gerade was zusammen geschmissen:
also wenn die länge- bis jetzt gelesene Bytes < 1024 ist, also das Array nicht voll werden würde.
wird ein neues Array erstellt, mit der länge der restlichen Zeichen, liest diese ein und schreibt sie.

Beim nochmal drüber gucken habe ich gesehen, das es ne endlos schleife geben müsste, wenn die länge durch 1024 teilbar ist, aber das lässt sich ja abfangen.
Oder doch nicht, da die Überprüfung ja i<1024 ist, also kommt er bei genau 1024 in den unteren Teil und beendet dann auch die endlosschleife.

Ist irgendwie murx, und ich habe das gleiche Problem wie vorher.

Code:
XXTEA xxtea = new XXTEA();
			while (true) {
				if (length-j > 1024) {
					if (i < 1024) {
						bytes[i] = (byte) fis.read();
						i++;
						j++;
					} else {
						i = 0;
						fos.write(xxtea.encrypt(bytes, key));
					}
				}
				else{
					byte[] bytes1 = new byte[length-j];
					while(j < length){
						bytes1[i] = (byte) fis.read();
						j++;
					}
					fos.write(xxtea.encrypt(bytes1, key));
					break;
				}
			}
 
S

SlaterB

Gast
stell dir vor, du hast eine 1600 bytes-Datei,
es wird 576x per Zeile 5 in das Array geschrieben und dann kommt Zeile 14 dran,
die restlichen 1024 Bytes werden übertragen, die ersten 576 aber ganz weggelassen,

so vermute ich das im Moment, mit System.out.println usw. zu testen,
logge zumindest jede Durchführung von Zeile 10 und Zeile 19

"schreibe nun 1024 Bytes in Zeile 10"
"schreibe nun 1024 Bytes in Zeile 10"
usw.

----

Lösung falls es das ist: der Test length-j > 1024 ist schlecht,
berechne vorher length % 1024 und dann genau den Index k, ab dem der Rest gesonder zu behandeln ist,
im 1600er Beispiel ist das 1024, ist immer ein Vielfaches von 1024,

lasse erst eine while-Schleife oder auch eine for-Schleife mit ganzen Arrays arbeiten,
dann ab Index k beginnt eine zweite Schleife, die sich um die restlichen Bytes kümmert
 

TeKo

Mitglied
Boa steh echt aufem Schlauch ;)
Wenn man da die ganze Zeit draufguckt.

Also jetzt scheint es zu funktionieren:
Code:
XXTEA xxtea = new XXTEA();
			while (true) {
				if (length - j > 1024) {
					while (i < 1024) {
							bytes[i] = (byte) fis.read();
							i++;
							j++;
					}
					i = 0;
					fos.write(xxtea.encrypt(bytes, key));
				} else {
					byte[] bytes1 = new byte[length - j];
					while (j < length) {
						bytes1[i] = (byte) fis.read();
						j++;
					}
					fos.write(xxtea.encrypt(bytes1, key));
					break;
				}
			}

Werde decrypt jetzt auch mal so umbaun, dann sehen ich ja, ob alles richtig gelesen und geschrieben wurde.

Also die Datei wird gelesen, verschlüsselt geschrieben und dann wieder entschlüsselt, leider ist die .rar Datei dann nicht mehr lesbar ;)


EDIT: Habe jetzt einmal die Datei direkt schreiben lassen ohne verschlüsselung, da kommt, wenn ich die .rar öffne "Der Dateikopf ist beschädigt".
Da muss ich wohl nochmal genau gucken.


Danke für die Mühe, hast mir super geholfen.
Hatte bei dem letzten Code einfach bei dem 2ten j++ das i++ vergessen.
Läuft jetzt so auch mit der Verschlüsselung und allem.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Problem mit Dateien/XOR-Verschlüsselung Allgemeine Java-Themen 5
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
X Verschlüsselung Allgemeine Java-Themen 18
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
R Verschlüsselung falsch Allgemeine Java-Themen 3
R Verschlüsselung funktioniert nicht Allgemeine Java-Themen 5
J Passwort Verschlüsselung hash Allgemeine Java-Themen 2
D AES Verschlüsselung / Wirklich AES 128-Bit? Allgemeine Java-Themen 4
I Best Practice Verschlüsselung mit SALT Allgemeine Java-Themen 4
A Mehrfache XOR Verschlüsselung Allgemeine Java-Themen 11
Thallius Moderne sichere synchrone Verschlüsselung mit Java? Allgemeine Java-Themen 3
Ananaskirsche Verschlüsselung mit AES Allgemeine Java-Themen 4
E Verschlüsselung Allgemeine Java-Themen 4
F Schlüsselworte RSA Verschlüsselung implementieren Allgemeine Java-Themen 5
S Key (für AES-Verschlüsselung) aus String Allgemeine Java-Themen 4
M Serialisierung & Verschlüsselung Allgemeine Java-Themen 2
K Problem mit Salted - Verschlüsselung Allgemeine Java-Themen 4
Z Java E-Mail Client mit End-to-End-Verschlüsselung Allgemeine Java-Themen 4
J Verschlüsselung von Text? Allgemeine Java-Themen 2
K Vigenere- Verschlüsselung Allgemeine Java-Themen 13
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
T AES-Verschlüsselung mit eigenem 256 Bit Schlüssel Allgemeine Java-Themen 12
DStrohma Verschlüsselung: SALT aus Passwort generieren? Allgemeine Java-Themen 3
G AES Verschlüsselung nur bis 63 Zeichen Länge Allgemeine Java-Themen 2
M Verschlüsselung mit Cipher Allgemeine Java-Themen 5
B XOR Verschlüsselung Allgemeine Java-Themen 7
S Framework für symetrische und asymetrische Verschlüsselung Allgemeine Java-Themen 3
lumo Verschlüsselung Allgemeine Java-Themen 2
H Verschlüsselung mit Blowfish Allgemeine Java-Themen 14
C Interpreter-Fehler AES verschlüsselung mit MD5 key Allgemeine Java-Themen 6
S AES Verschlüsselung - File Headers korrupt Allgemeine Java-Themen 10
A Datei, UTF-8, NTRU-Verschlüsselung Allgemeine Java-Themen 3
B "Verschlüsselung" mit Passwort (XOR bzw. Modulo) Allgemeine Java-Themen 7
B String Verschlüsselung Allgemeine Java-Themen 6
M Verschlüsselung anwenden Allgemeine Java-Themen 6
J Verschlüsselung Allgemeine Java-Themen 22
T MD5 Verschlüsselung Nullen fehlen? Allgemeine Java-Themen 2
L [Exception] RSA Verschlüsselung. Allgemeine Java-Themen 16
C javamail signatur und verschlüsselung Allgemeine Java-Themen 2
R 128 Bit Verschlüsselung/Entschlüsselung in Java? Allgemeine Java-Themen 6
F RSA-Verschlüsselung Allgemeine Java-Themen 4
S Verschlüsselung in Java Allgemeine Java-Themen 2
G Interessant! Verschlüsselung in Java, Charset in der JVM? Allgemeine Java-Themen 14
D Eigener Key bei AES Verschlüsselung Allgemeine Java-Themen 4
S Verschlüsselung - IllegalBlockSizeException Allgemeine Java-Themen 3
G Problem mit RSA Verschlüsselung bei .net und Java Allgemeine Java-Themen 1
D Caesar und Vigenère Verschlüsselung Allgemeine Java-Themen 2
alexpetri Verschlüsselung Allgemeine Java-Themen 13
@ [Sicherheit] Speicherung von Keys für Verschlüsselung Allgemeine Java-Themen 4
P Verschlüsselung in PHP -> Entschlüsselung in Java Allgemeine Java-Themen 2
Lazybone Caeser Verschlüsselung Allgemeine Java-Themen 6
S Verschlüsselung mit Cipher Allgemeine Java-Themen 8
S Verschlüsselung Allgemeine Java-Themen 15
G RSA-Verschlüsselung Allgemeine Java-Themen 1
P HMACMD5- Verschlüsselung entschlüsseln Allgemeine Java-Themen 2
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
J Probleme bei XOR verschlüsselung ! Allgemeine Java-Themen 5
G Verschlüsselung in Java Allgemeine Java-Themen 9
M RSA Verschlüsselung Allgemeine Java-Themen 7
J Verschlüsselung von Daten Allgemeine Java-Themen 21
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Unterschiedliche jar Dateien zusammen führen Allgemeine Java-Themen 8
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
d.lumpi JDA eclipse dateien versenden Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
L Dateien richtig auslesen Allgemeine Java-Themen 6
L Eclipse Runnable Jar mit Dateien Allgemeine Java-Themen 8
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
I Java als exe veröffentlichen inkl. kompletter Dateien Allgemeine Java-Themen 4
M Drucken von Dateien Allgemeine Java-Themen 10
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
N Temporäre Dateien Allgemeine Java-Themen 3
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
M Dateien schneller kopieren Allgemeine Java-Themen 1
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
V Eclipse .class Dateien Allgemeine Java-Themen 9
B Download von dateien Allgemeine Java-Themen 2
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
C Dateien in Jar aufrufen Allgemeine Java-Themen 14
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben