Java und VB.Net Verschlüsselung

  • Java

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Twometer.

    Java und VB.Net Verschlüsselung

    Hi Leute,
    Ich bin an einem größeren Projekt dran und arbeite auch mit Client/Server. Der Server ist in Java geschrieben, weil der auf Linux laufen muss und der Client in VB.Net.Dafür brauche ich auch asymmetrische Verschlüsselung. Wenn ich jetzt aber den Code mit der Verschlüsselung von RSA (Asymetrische Verschlüsselung) Probleme nehme, muss ich die Keys im XML-Format haben. Mein Problem ist nun, dass ich nicht weiß, wie ich in Java asymmetrische Verschlüsselung mit XML-Keys verwenden kann. Habe schon gegoogelt und nix brauchbares gefunden.Wäre cool wenn jemand helfen könnte :thumbup:

    LG
    Twometer
    An Error 404 occurred while loading signature...
    Hi,
    Das mit Mono werde ich probieren. Ich habe aber auch den Code von Stackoverflow verwendet. Wenn ich als Keysize (in VB) 2048 angebe kommt, wenn ich das in Java entschlüsseln will, eine Exception:
    Spoiler anzeigen

    Quellcode

    1. javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes
    2. at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)
    3. at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    4. at javax.crypto.Cipher.doFinal(Cipher.java:2165)
    5. at de.twometer.vectordata.test.cipher.CipherTestMain.decrypt_impl(CipherTestMain.java:84)
    6. at de.twometer.vectordata.test.cipher.CipherTestMain.Cipher(CipherTestMain.java:109)
    7. at de.twometer.vectordata.test.cipher.CipherTestMain.start(CipherTestMain.java:31)
    8. at de.twometer.vectordata.test.cipher.CipherTestMain.main(CipherTestMain.java:24)
    9. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    10. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    11. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    12. at java.lang.reflect.Method.invoke(Method.java:497)
    13. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)



    Wenn ich als Keysize = 512 angebe, kommt ein kürzerer verschlüsselter String raus, aber dann kommt die Exception
    Spoiler anzeigen

    Quellcode

    1. javax.crypto.IllegalBlockSizeException: Data must not be longer than 64 bytes
    2. at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)
    3. at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    4. at javax.crypto.Cipher.doFinal(Cipher.java:2165)
    5. at de.twometer.vectordata.test.cipher.CipherTestMain.decrypt_impl(CipherTestMain.java:84)
    6. at de.twometer.vectordata.test.cipher.CipherTestMain.Cipher(CipherTestMain.java:109)
    7. at de.twometer.vectordata.test.cipher.CipherTestMain.start(CipherTestMain.java:31)
    8. at de.twometer.vectordata.test.cipher.CipherTestMain.main(CipherTestMain.java:24)
    9. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    10. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    11. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    12. at java.lang.reflect.Method.invoke(Method.java:497)
    13. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)



    Sorry aber ich check das nicht. Erst kürzer als 256 und jetzt isses kürzer und dann kommt kürzer als 64 ?!?
    Hoffe ihr wisst was das soll.

    LG
    Twometer
    //EDIT: Wenn ich in Java verschlüssele und in VB.NET entschlüsseln will, kommt in VB ne Exception
    Ein Ausnahmefehler des Typs "System.Security.Cryptography.CryptographicException" ist in mscorlib.dll aufgetreten.

    Zusätzliche Informationen: Fehler beim Decodieren von OAEP-Padding.
    An Error 404 occurred while loading signature...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Twometer“ ()

    Hi,
    Danke für die Hilfe ich habe es jetz herausbekommen.
    1. Als Algorithmus muss man "RSA/ECB/OAEPWithSHA-1AndMGF1Padding" angeben
    2. Wenn ich entschlüsseln will, muss ich den Base64 verschlüsselten String erst wieder in nicht-Base64-Bytes konvertieren.
    Funktioniert jetzt Perfekt :thumbup:

    Hier noch der ganze Code, wer ihn braucht:
    Spoiler anzeigen

    Java-Quellcode

    1. private String[] parsePrivateKey(String xml) throws IOException {
    2. String modulus = "";
    3. String exponent = "";
    4. String d = "";
    5. BufferedReader bufReader = new BufferedReader(new StringReader(xml));
    6. String line = null;
    7. while ((line = bufReader.readLine()) != null) {
    8. line = line.trim();
    9. modulus = line.split("<Modulus>")[1].split("</Modulus>")[0];
    10. exponent = line.split("<Exponent>")[1].split("</Exponent>")[0];
    11. d = line.split("<D>")[1].split("</D>")[0];
    12. }
    13. return new String[]{modulus, exponent, d};
    14. }
    15. private String[] parsePublicKey(String xml) throws IOException {
    16. String modulus = "";
    17. String exponent = "";
    18. BufferedReader bufReader = new BufferedReader(new StringReader(xml));
    19. String line = null;
    20. while ((line = bufReader.readLine()) != null) {
    21. line = line.trim();
    22. modulus = line.split("<Modulus>")[1].split("</Modulus>")[0];
    23. exponent = line.split("<Exponent>")[1].split("</Exponent>")[0];;
    24. }
    25. return new String[]{modulus, exponent};
    26. }
    27. public String decrypt_impl(String encrypted, String privateKeyXml) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException, BadPaddingException, IllegalBlockSizeException {
    28. String[] parsedKey = parsePrivateKey(privateKeyXml);
    29. byte[] expBytes = Base64.decodeBase64(parsedKey[1].trim());
    30. byte[] modBytes = Base64.decodeBase64(parsedKey[0].trim());
    31. byte[] dBytes = Base64.decodeBase64(parsedKey[2].trim());
    32. byte[] encryptedNoBAse = Base64.decodeBase64(encrypted);
    33. System.out.println(encryptedNoBAse.length);
    34. BigInteger modules = new BigInteger(1, modBytes);
    35. BigInteger exponent = new BigInteger(1, expBytes);
    36. BigInteger d = new BigInteger(1, dBytes);
    37. KeyFactory factory = KeyFactory.getInstance("RSA");
    38. Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
    39. String input = encrypted;
    40. RSAPrivateKeySpec privSpec = new RSAPrivateKeySpec(modules, d);
    41. PrivateKey privKey = factory.generatePrivate(privSpec);
    42. cipher.init(Cipher.DECRYPT_MODE, privKey);
    43. byte[] decrypted = cipher.doFinal(encryptedNoBAse);
    44. return new String(decrypted);
    45. }
    46. public String encrypt_impl(String message, String publicKeyXml) throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
    47. String[] parsedKey = parsePublicKey(publicKeyXml);
    48. byte[] expBytes = Base64.decodeBase64(parsedKey[1].trim());
    49. byte[] modBytes = Base64.decodeBase64(parsedKey[0].trim());
    50. BigInteger modules = new BigInteger(1, modBytes);
    51. BigInteger exponent = new BigInteger(1, expBytes);
    52. KeyFactory factory = KeyFactory.getInstance("RSA");
    53. Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
    54. String input = message;
    55. RSAPublicKeySpec pubSpec = new RSAPublicKeySpec(modules, exponent);
    56. PublicKey pubKey = factory.generatePublic(pubSpec);
    57. cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    58. byte[] encrypted = cipher.doFinal(input.getBytes());
    59. return Base64.encodeBase64String(encrypted);
    60. }


    Dann einfach decrypt_impl und encrypt_impl verwenden.


    LG
    Twometer
    An Error 404 occurred while loading signature...