Interessant! Verschlüsselung in Java, Charset in der JVM?

Status
Nicht offen für weitere Antworten.

guni

Bekanntes Mitglied
Hallo,

ich habe ein externes Programm, dass über einen Algorithmus einen 32-Zeichen langen String erzeugt und damit Dateien mit einem bitwise xor verschlüsselt.
Das programm ist in C geschrieben.
Meine Aufgabe ist es nun, in Java ein Programm zu schreiben, dass diese Dateien wieder entschlüsselt...

Soweit, sogut.
Ich habe in meinem Programm den gleichen Algorithmus geschrieben, der auch in C den Schlüssel erzeugt, lese die verschlüßelte Datei blockweise ein, durchlaufe das erhaltene byte-Array und verknüpfe jedes Zeichen per XOR mit dem zugehörigen Zeichen aus dem Schlüssel.

das funktioniert auch soweit, solang mein Schlüssel keine besonderen Zeichen enthält.
erzeuge ich in C/Java allerdings einen komplexeren Schlüssel, kann mir java meine Dateien nicht mehr entschlüsseln.
die erzeugten Zahlen stimmen überein; sobald ich in java ein
Java:
(char)pwdint
mache, erhalte ich nicht immer die selben Zeichen, die ich in c mit dem gleichen befehl erhalte.
Während mein c-kompliertes Programm in der Kommandozeile nette Sonderzeichen wie Smileys oder mathematische Symbole im Key anzeigt, stellt mein Java einen großteil der Sonderzeichen nur als Fragezeichen da.

Jetzt hab ich mir gedacht, vielleicht läuft die JVM unter einem anderen Charset wie windows ...
kann das sein? Wie könnte ich da draufkommen?
Woran könnte es sonst liegen?
(Wie gesagt: die int-Werte sind noch die gleichen; d.h. mein Algorithmus ist gleich!)

mfg, guni
 

guni

Bekanntes Mitglied
hmm ... vielleicht muss ich mein problem ein bisschen konkretisieren um eine antwort zu bekommen.

im prinzip funktioniert die verschlüsselung ja so, dass ich einen key mit beliebiger zeichenlänger erzeuge und dann mit xor bitwise mit meinem text verschlüssle.
nehmen wir folgendes Beispiel:

Schlüssel: SCHLUESSEL123
Text: Franz jagt im komplett verwahrlosten Taxi quer durch Bayern
Java:
Verschlüsselung (XOR):
F XOR S -> (char)21
r XOR C -> (char)49
a XOR H -> (char)41
n XOR L -> (char)34
z XOR U -> (char)47
  XOR E -> (char)101
j XOR S -> (char)57
a XOR S -> (char)50
g XOR E -> (char)34
t XOR L -> (char)56
  XOR 1 -> (char)17
i XOR 2 -> (char)91
m XOR 3 -> (char)94
  XOR S -> (char)115
k XOR C -> (char)14
o XOR H -> (char)39
m XOR L -> (char)33
p XOR U -> (char)37
l XOR E -> (char)41
e XOR S -> (char)54
t XOR S -> (char)39
t XOR E -> (char)49
...

sehen wir uns die 1. Zeile genauer an:
der Buchstabe des Schluessels ist ein 'S', der Buchstabe des Textes ein 'F'. S hat in der ASCII-Tabelle einen Wert von 70, S hat 83. Diese beiden Werte weren per XOR verknüpft -> wir erhalten 21 (genaugenommen das Zeichen, das in der ASCII-Tabelle diesen Wert hat).
Das tolle ist, dass ich - sofern ich den Schlüssel kenne - aus meinem verschlüsselten Text per XOR auch wieder den Klartext ermitteln kann:
nehmen wir an, mein Programm stößt auf das Zeichen des Wertes 21. Verknüpfe ich es mit dem zugehörigen Buchstaben meines Schlüssels ('S' mit Wert 83), so erhalte ich wieder den ursprünglichen Wert ('F' mit Wert 70).
ich kann also mit der gleichen Methode, mit der ich VERSCHLÜSSELT habe auch wieder entschlüsseln.

so. und jetzt zum eigentlichen Problem:
mein Schlüssel wird natürlich über einen Algorithmus erzeugt; nehmen wir zum Beispiel folgende Funktion (ich schreibe hier jetzt irgendwas unsinniges für die Erzeugung des Buchstabens):

Java:
private String keygen() {
   StringBuffer key = new StringBuffer();
   for (int i=0; i<32;i++) {
      int k = i*2-4%8
      key.append((char)k)
   }
   return key.toString();
}

der Schlüssel besteht natürlich nicht nur aus "schönen" Zeichen, er hat irgendwelche abgefahrenen Sonderzeichen dabei.
den Algorithmus kann ich natürlich nicht ändern, weil es ihn ja auch im C-Programm schon gibt! mein Problem ist, dass JAVA mit der Entschlüsselung nicht ganz zurechtkommt. Manche Zeichen sind anders. Der int-Wert k ist aber natürlich gleich; ich habe ja den gleichen Algorithmus.
Jetzt verstehe ich nicht ganz, womit das zusammenhängen kann.
Ich könnte mir vorstellen, dass unterschiedliche char-sets vielleicht manche Sonderzeichen anders belegen -> ?.
dann wäre die Lösung, die ich mir irgendwie vorstellen könnte, das charset der JVM mit dem charset meines C-Programmes gleichzusetzen.
Keine Ahnung ob das geht / ob das Problem überhaupt daran liegt.

Hätte irgendwer da eine Idee?! Wenn ihr keine Lösung habt wäre ich auch schon über einen Ansatz dankbar, mit dem ich das Problem finden / beweisen kann ;-)

danke!
guni
 

faetzminator

Gesperrter Benutzer
Ich gehe davon aus, dass es einfach die Konsole (warscheinlich in Eclipse oä?) anders ausgibt. Mach es mal im Systemterminal, und du solltest die gleiche Ausgabe bekommen.
 

guni

Bekanntes Mitglied
... ja. das hab ich mir auch schon gedacht. aber die konsole gibt mir auch etwas anderes aus :-(
 

guni

Bekanntes Mitglied
nein ... ich erzeuge meinen Key mit einem StringBuffer.
dann returned die Funktion ein stringbuf.toString();

das gibt ich dann mit System.out.println aus ...
 

ice-breaker

Top Contributor
Java verwendet für die Chars UTF-16 also 2 Byte, du solltest abklären was das C-Programm nutzt.
Ich vermute mal ASCII oder UTF-8
 
S

Spacerat

Gast
Warscheinlich liegt der Hund darin begraben, wie der Key in der eigentlichen Anwendung erstellt wird. Verwendet man dort "new String(bytes[] array, int offset, int length)" oder "somestring.getBytes()" hat man ein Problem (...eben dieses hier). Bei den internen Umwandlungen wird die Klasse "StringCoding" verwendet. Will man den Umstand umgehen (sprich: unabhängig Wandeln), muss man selbst implementieren:[highlight=java]byte[] binarystringToBytes(String binarystring)
{
// ACHTUNG: äusserste Vorsicht!! Strings welche Zeichen oberhalb von UTF-8
// beinhalten werden "verfälscht"!
byte[] rc = new byte[text.length()];
for(int c = 0; c < text.length(); c++) rc[c] = (byte) (text.charAt(c) & 0xFF);
return rc;
}

String bytesToBinaryString(byte[] buffer)
{
StringBuffer() rc = new StringBuffer();
for(int c = 0; c < buffer.length; c++) rc.append((char) (buffer[c] & 0xFF));
return rc.toString();
}[/highlight]
 

guni

Bekanntes Mitglied
@spacerat.
habe deine funktionen jetzt mal in meine funktionen "eingeflochten" ...
tja: kaum macht man's richtig gehts ;-)
danke für eure tipps *gg*
 

ice-breaker

Top Contributor
Hmm, gerade so als Gedanke:
Könnte man nicht auch die getBytes(Charset c) verwenden? Man müsste ja nur sagen, dass er UTF-8 nutzen soll.
Dann würden auch UTF-16 Zeichen in der UTF-8 Notation funktionieren.
 
S

Spacerat

Gast
War mir bisher schlicht zu blöd, damit viel rumzuexperimentieren. Daher weis ich das nicht. Ich kann mir jedoch auch gut vorstellen, das beim Wandeln der utf-16 nach utf-8 auch irgend etwas verfälscht wird z.B. aus zwei Bytes nur eines wird.
 

ice-breaker

Top Contributor
neija nen UTF-16 Zeichen in UTF-8 wird zu 2 Bytes, jup, aber die werden eben durch spezielle UTF-Sequenzen verbunden, das jeder der UTF-8 parsen kann, weiß, dass die 2 Byte eigentlich 1 Zeichen ist.
 
S

Spacerat

Gast
...Mit anderen Worten: Da wird in der Byte-Sequenz (den Binärdaten) etwas verändert. Deswegen steht dort auch das "ACHTUNG" im gepostetem Text. Ein mit "bytesToBinaryString()" codierter String wird definitiv auch wieder genau das Bytearray welches es vorher war. Anders siehts mit Strings aus, die UTF-16 enthalten.
 

ice-breaker

Top Contributor
Ja ich meinte nur wenn man es zu nem UTF-8 Byte Array macht, kann man ganz normal die Verschlüsselung nutzen.
Unser String mit 8 Zeichen ist dann eben nicht mehr 8 Byte lang sondern 8 - 16 Byte, aber die Operationen funktionieren alle dadrauf, da wir ein UTF-16 korrekt zu UTF-8 umgeformt haben.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
D Eigener Key bei AES Verschlüsselung Allgemeine Java-Themen 4
T Verschlüsselung von Dateien Allgemeine Java-Themen 8
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
J Problem mit Dateien/XOR-Verschlüsselung Allgemeine Java-Themen 5
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
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben