Announcement

Collapse
No announcement yet.

RSA=> String zu Key konvertieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • RSA=> String zu Key konvertieren

    hallo!

    ich habe folgendes Problem. Ich will über eine TCP-Verbindung einen Public Key verschicken. Da man via TCP aber keine Java-Objekte (Key) versenden kann sondern nur Strings (oder Byte-Code) würde ich nun gerne wissen, wie ich aus einen String einen Key machen kann.

    hier ein kleines kommentiertes Beispiel dazu:
    Code:
    //ich erstelle die keys
    KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
    ...
    //sende via TCP den key 
    String publicKey = keyPair.getPublic().toString();
    ....
    //empfange den key (publicKey)
    //hier mein problem- so wäre es wenn ich das keyPair hätte:
    cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
    //und das funktioniert nicht!!
    cipher.init(Cipher.ENCRYPT_MODE,(Key) publicKey);
    Zuletzt editiert von mlux82; 27.05.2011, 19:02.

  • #2
    Ev.
    http://webcache.googleusercontent.co...=www.google.de
    Zuletzt editiert von Christian Marquardt; 29.05.2011, 17:20.
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Danke ich kenne das Beispiel. Habe es selbst vor einem Tag via Google gefunden. Leider ist es nicht exakt das was ich will. Denn im Beispiel schreibe ich das Objekt(Key) in ein File und lese aus dem File in das Objekt.

      Ich möchte aber von einem String das Objekt (Key) erstellen. - Also ohne FileOutput(Input)Stream. Denn via TCP kann ich ja nur Strings senden/empfangen und keine Files.
      Zuletzt editiert von mlux82; 28.05.2011, 22:34.

      Comment


      • #4
        Nun, die Quelle dürfte doch keine Rolle spieln, die dort geschilderte Technik solltest du auch mit einem String nutzen können
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          Nun, die Quelle dürfte doch keine Rolle spieln, die dort geschilderte Technik solltest du auch mit einem String nutzen können
          und wie?
          Key => String ist einfach:
          String s = keyPair.getPublic().toString();


          aber wie bekomme ich aus dem String (s) nun ein Key-Objekt?
          bzw. um auf das Beispiel von dir zurückzukommen: wie baue ich folgende FKT dafür um? (s enthält den String, aus dem ich gerne das Key-Objekt erstellen will.
          Code:
          private static Key readObj(String s) throws Exception{
                  ObjectInputStream in = new ObjectInputStream(new FileInputStream(s));
                  Key key = (Key)in.readObject();
                  in.close();
                  return key;
              }

          Comment


          • #6
            [highlight=java]
            String test="asdadadadasdaededc sefafdaced";
            try
            {
            ObjectInputStream obin=new ObjectInputStream(new ByteArrayInputStream(test.getBytes()));
            }
            catch(IOException ex)
            {
            ex.printStackTrace();
            }

            [/highlight]
            Christian

            Comment


            • #7
              DANKE vielmals!

              Comment


              • #8
                Originally posted by Christian Marquardt View Post
                [highlight=java]
                String test="asdadadadasdaededc sefafdaced";
                try
                {
                ObjectInputStream obin=new ObjectInputStream(new ByteArrayInputStream(test.getBytes()));
                }
                catch(IOException ex)
                {
                ex.printStackTrace();
                }

                [/highlight]

                ich bekomme in folgender zeile
                Code:
                    	ObjectInputStream in=new ObjectInputStream(new ByteArrayInputStream(s.getBytes()));
                immer folgende Exception:
                Code:
                java.io.StreamCorruptedException: invalid stream header: 74657374
                egal mit welchem String ichs probiere!

                Comment


                • #9
                  Ist noch etwas komplizierter:

                  Der Fehler kommt daher, das ja die Bytes alleine kein serialisiertes String-Object darstellen. Es sind halt nur die reinen Bytes.Darum müssen wir erst noch den korrekten Header erzeugen. Das geht man besten, in dem man das Java machen lässt und das in ein ObjectOutputStream schreibt

                  Folgendes funktioniert jedenfalls:

                  [highlight=java]
                  String test="asdadadadasdaededc sefafdaced";
                  ByteArrayOutputStream baos=new ByteArrayOutputStream();
                  ObjectOutputStream oos=new ObjectOutputStream(baos);
                  oos.writeObject(test);
                  oos.close();
                  InputStream is=new ByteArrayInputStream(baos.toByteArray());
                  ObjectInputStream obin=new ObjectInputStream(is);
                  String neu=(String)obin.readObject();
                  System.out.println(neu);

                  [/highlight]

                  Befürchte allerdings, dass das bei dir Ärger macht, da du ja einen String bekommst und jetzt den Header eines Key-Objektes brauchst...Obiger Link zeigt, wie das geht
                  Zuletzt editiert von Christian Marquardt; 29.05.2011, 17:21.
                  Christian

                  Comment


                  • #10
                    Originally posted by Christian Marquardt View Post
                    Ist noch etwas komplizierter:
                    ich glaube ich bin schon sehr nahe drann an einer Lösung. Habe so etwas ähnliches ein einem alten Codefragment gefunden und daraus ein Beispiel gebastelt, dass ich einen private-key als string speichere und weider einlese. Jetzt bekomme ich aber immer folgende Fehlermeldung:
                    Code:
                    Exception in thread "main" java.security.InvalidKeyException: Neither a public nor a private key
                    Grund ist, dass ich hier nicht genau weiß, welchen Algorithmus ich eintragen muss
                    Code:
                    javax.crypto.spec.SecretKeySpec(Base64.decode(s),"RSA");

                    Das ganze Beispiel ist im Anhang!
                    Vielleicht kann mir jetzt jemand weiterhelfen?! Wenn das BSP läuft, dann hab ich die Lösung!

                    das jar-file wird benötigt: (wäre zu groß gewesen um hier hochzuladen)
                    http://www.bouncycastle.org/download...-jdk16-146.jar

                    lg
                    Attached Files

                    Comment


                    • #11
                      Ich kann hier jetzt keine Anhänge ansehen..

                      Neither a public nor a private key
                      Die Klasse von der der Key erzeugt werden soll muss entweder PublicKey pder PrivateKey sein.
                      Christian

                      Comment


                      • #12
                        Originally posted by Christian Marquardt View Post
                        Ich kann hier jetzt keine Anhänge ansehen..



                        Die Klasse von der der Key erzeugt werden soll muss entweder PublicKey pder PrivateKey sein.
                        ja ich weiß. das ist genau mein Problem. im zuvor gezeigten Konstruktor muss ein Algorithmus - String eingegeben werden. Ich weiß aber nicht was ich da für RAS-Pubic- bzw. Private für einen String eingeben muss? "RSA" alleine reicht eben nicht. Ich hab auch schon im zugehörigen Javadoc geschaut - dort wird auf ein Dokument verwiesen, das mir leider auch nicht weiterhalf. Vielleicht kannst dus dir ja mal ansehn - falls du wann Zeit hast und den Anhang öffnen kannst.

                        Comment


                        • #13
                          Du hast

                          Cipher cipher=Cipher.getInstance("RSA");

                          inititalisiert. Somit braucht

                          cipher.init(Cipher.DECRYPT_MODE,key);

                          einen privaten oder öffentlichen Schlüssel. Mit

                          SecretKeySpec(Base64.decode(s),"RSA")

                          erzeugst du eine Klasse vom Typ SecretKeySpec. Die kann keinen privaten oder öffentlichen Schlüssel erzeugen. Au0erdem ERZEUGT die Klasse einen Schlüssel aus dem ByteArray. Das ist nicht was du willst. Du hast den Schlüssel wohl schon und willst keinen neuen
                          Christian

                          Comment


                          • #14
                            Originally posted by Christian Marquardt View Post
                            Du hast

                            Cipher cipher=Cipher.getInstance("RSA");

                            inititalisiert. Somit braucht

                            cipher.init(Cipher.DECRYPT_MODE,key);

                            einen privaten oder öffentlichen Schlüssel. Mit

                            SecretKeySpec(Base64.decode(s),"RSA")

                            erzeugst du eine Klasse vom Typ SecretKeySpec. Die kann keinen privaten oder öffentlichen Schlüssel erzeugen. Au0erdem ERZEUGT die Klasse einen Schlüssel aus dem ByteArray. Das ist nicht was du willst. Du hast den Schlüssel wohl schon und willst keinen neuen

                            ja stimmt -danke, du hast recht! Ja bei dem Beispiel verwendete ich eigentlich ein AES - Verschlüsselungsverfahren.
                            Gibt es keine Lösung wie ich einfach einen String in einen Key-Objekt speichern kann? Das Beispiel vom Link half mir leider auch nicht. Hier wurde nur ein Key selbst erstellt. Ich will ihn aber von Java erstellen lassen.

                            Hatte das Problem wirklich noch niemand? kann ich mir ja kaum vorstellen. Ich fände es nämlich super, dass ich via TCP die Public-keys austausche und dann "sicher" kommunizieren kann. Oder gibts eine andere Verschlüsselungsart die ich für TCP nutzen kann?? Weil wenn das eh nicht geht bzw. so komplex ist, muss ich mir was anderes überlegen. So komme ich leider nicht weiter....

                            Comment


                            • #15
                              ich glaub ich habs gelöst.
                              zuerst public key in file schreiben, dann via tcp versenden, dort public key aus file lesen und in key-objekt schreiben.

                              ist zwar mit dem file-workaround nicht 100% schön aber es funktioniert und was besseres/schöneres gibts anscheinend eh nicht.

                              hab die einzelnen teile so getestet und es funktioniert so. also werde ich es so in mein projekt einbauen

                              Comment

                              Working...
                              X