OK, ich bin mir nicht sicher ob es in den Anfängerbereich gehört.
Was ich mache wahrscheinlich nicht, was ich will aber wahrscheinlich doch. =)
Kleine Projektbeschreibung:
- AES-verschlüsselte Daten werden von meinem Javaprogramm (NetBeans IDE) über JPC (von NetModule) an die PLC Steuerung (TwinCat) übergeben.
- Danach werden sie in der PLC über ein Readermodul auf einen TAG geschrieben
- Auf Anfrage des Javaprogramms, liest das Readermodul die Daten wieder aus und schickt sie mittels JPC wieder in mein Javaprogramm.
Problem:
- Die erhaltenen Daten sind fehlerhaft
- Weiterverarbeitung ist nicht möglich
Beispiel:
hier werden die Daten geladen:
So sehen die Daten aus:
`,‡Ørä`Àñ³H¥y4ze:O*xæœÙÆ?hô<
So kommen sie in der PLC an:
96 44 14 135 216 114 228 96 14 192 241 179 72 165 121 21 52 122 101 58 79 160 120 4 230 156 217 198 63 104 244 60
Wie man sieht, alles schöner ASCII-Code (zum Vergleich: ASCII-Code)
Zurück hol ich sie mir als Bytes, deswegen erhöhe ich alles unter 0 um 256 und verwandel es dann in ein char. (alles über 128 sind negative Zahlen)
Nach der Umwandlung in char erhalte ich nun folgendes im System.out:
`,?Ørä`Àñ³H¥y4ze:O*xæ?ÙÆ?hô<
Damit wären wir bei Problem 1:
Wie man sieht sind 2 Zeichen (‡ und œ) fehlerhaft, obwohl sie als Integer noch dem ASCII-Wert entsprechen. Was mach ich hier falsch?
Kann NetBeans oder System.out die Zeichen evtl nicht darstellen?
Nun zu Problem 2:
hiermit entschlüssle ich die Daten:
Lade ich die Daten direkt mit loadWriteData() in die decrypt(byte[] dataIn), funktioniert alles Problemlos.
Bei der jetztigen Implementierung wirft mir decrypt() aber eine Exception.
Das leuchtet mir auch irgendwie ein, denn ich verwandel die Daten ja von long -> byte -> char -> byte.
Trotzdem weiß ich nicht, was ich direkt anders machen sollte, denn als char kann ich sie nicht übergeben und auch der 1. byte Wert liefert die Exception.
Die Frage ist also, wie ich die wiedererhaltenen Daten, korrekt als byte[] in die decrypt() bekomm.
Vielen Dank schon mal im vorraus, sich durch meinen CodeWirrwar zu wühlen. :X
Was ich mache wahrscheinlich nicht, was ich will aber wahrscheinlich doch. =)
Kleine Projektbeschreibung:
- AES-verschlüsselte Daten werden von meinem Javaprogramm (NetBeans IDE) über JPC (von NetModule) an die PLC Steuerung (TwinCat) übergeben.
- Danach werden sie in der PLC über ein Readermodul auf einen TAG geschrieben
- Auf Anfrage des Javaprogramms, liest das Readermodul die Daten wieder aus und schickt sie mittels JPC wieder in mein Javaprogramm.
Problem:
- Die erhaltenen Daten sind fehlerhaft
- Weiterverarbeitung ist nicht möglich
Beispiel:
hier werden die Daten geladen:
Java:
public byte[] loadWriteData()
{
try
{
DataInputStream readEncrypted = new DataInputStream(new FileInputStream("C:/***/Tests/Encrypted.txt"));
int blablup = readEncrypted.readInt();
byte[] encrypted = new byte[blablup];
readEncrypted.read(encrypted, 0, blablup);
readEncrypted.close();
return encrypted;
}
catch (Exception e)
{
System.err.println("Verschlüsselte Daten konnten nicht gelesen werden");
return null;
}
}
So sehen die Daten aus:
`,‡Ørä`Àñ³H¥y4ze:O*xæœÙÆ?hô<
So kommen sie in der PLC an:
96 44 14 135 216 114 228 96 14 192 241 179 72 165 121 21 52 122 101 58 79 160 120 4 230 156 217 198 63 104 244 60
Wie man sieht, alles schöner ASCII-Code (zum Vergleich: ASCII-Code)
Zurück hol ich sie mir als Bytes, deswegen erhöhe ich alles unter 0 um 256 und verwandel es dann in ein char. (alles über 128 sind negative Zahlen)
Java:
for (int i = 0; i < loadWriteData().length; i++)
{
byte y;
char x;
if ((JpcItemToolkit.getItemValueAsLong("/PRG_MAIN.ReaderLogic1./HMISabyDownData["+i+"]")).byteValue() < 0)
{
x = (char)((JpcItemToolkit.getItemValueAsLong("/PRG_MAIN.ReaderLogic1./HMISabyDownData["+i+"]").byteValue()) + 256);
}
else
x = (char)(JpcItemToolkit.getItemValueAsLong("/PRG_MAIN.ReaderLogic1./HMISabyDownData["+i+"]")).byteValue();
System.out.println(x);
y = (byte) x;
toDecrypt[i] = y;
}
Nach der Umwandlung in char erhalte ich nun folgendes im System.out:
`,?Ørä`Àñ³H¥y4ze:O*xæ?ÙÆ?hô<
Damit wären wir bei Problem 1:
Wie man sieht sind 2 Zeichen (‡ und œ) fehlerhaft, obwohl sie als Integer noch dem ASCII-Wert entsprechen. Was mach ich hier falsch?
Kann NetBeans oder System.out die Zeichen evtl nicht darstellen?
Nun zu Problem 2:
hiermit entschlüssle ich die Daten:
Java:
public String decrypt(byte[] dataIn) throws Exception
{
byte[] encrypted = dataIn; //load encrypted data
//load keys
ObjectInputStream readPrivateKey = new ObjectInputStream(new FileInputStream("C:/***/Tests/PrivateKey.txt"));
Key privateKey = (Key) readPrivateKey.readObject();
readPrivateKey.close();
DataInputStream readWrappedKey = new DataInputStream(new FileInputStream("C:/***/Tests/WrappedKey.txt"));
int length = readWrappedKey.readInt();
byte[] wrappedKey = new byte[length];
readWrappedKey.read(wrappedKey, 0, length);
readWrappedKey.close();
//decrypt
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.UNWRAP_MODE, privateKey);
Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
//ausgabe decrypt
byte[] decrypted = cipher.doFinal(encrypted);
String originalString = new String(decrypted);
System.out.println("Original string: " + originalString + " " + asHex(decrypted));
return originalString;
}
Java:
try
{
System.out.println("ergebnis: " + new String(decrypt(toDecrypt).getBytes()));
}
catch(Exception o)
{
System.out.println("iwas ist schief gelaufen");
}
Lade ich die Daten direkt mit loadWriteData() in die decrypt(byte[] dataIn), funktioniert alles Problemlos.
Bei der jetztigen Implementierung wirft mir decrypt() aber eine Exception.
Das leuchtet mir auch irgendwie ein, denn ich verwandel die Daten ja von long -> byte -> char -> byte.
Trotzdem weiß ich nicht, was ich direkt anders machen sollte, denn als char kann ich sie nicht übergeben und auch der 1. byte Wert liefert die Exception.
Die Frage ist also, wie ich die wiedererhaltenen Daten, korrekt als byte[] in die decrypt() bekomm.
Vielen Dank schon mal im vorraus, sich durch meinen CodeWirrwar zu wühlen. :X