Announcement

Collapse
No announcement yet.

Gibt es eine Umkehrfunktion zu getEncoded() ???

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

  • Gibt es eine Umkehrfunktion zu getEncoded() ???

    Hallo,
    hier mein Problem:

    Ich habe einen Public Key.

    <b>RSAPublicKey key_before</b>

    Um diesen zu Serializieren, wandle ich ihn in Bytecode

    <b>byte[] bKey=key.getEncoded();</b>

    Jetzt mache ich irgendwas ... in Datei schreiben, an anderer Stelle wieder in byte[] einlesen ... ich habe also wieder

    <b>byte[] bKey</b>

    Aber wie bekomme ich jetzt wieder meinen Public Key ?

    <i>... vielleicht sowas: RSAPublicKey key_after = (RSAPublicKey) ???(publicKey);</i>

    Hoffe jemand kann helfen! Danke i.V.

    Gruß,
    Andi

  • #2
    Hallo Andi,

    <PRE>
    byte[] bKey = //einlesen
    X509EncodedKeySpec spec = new X509EncodedKeySpec(bKey);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    RSAPublicKey key = (RSAPublicKey)factory.generatePublic(spec);
    </PRE>

    Gruß,

    Alwi

    Comment


    • #3
      Danke Dir, werds gleich ausprobieren! :-

      Comment


      • #4
        Habe jetzt leider eine Exception ....

        java.security.spec.InvalidKeySpecException: Unknown key spec

        Was nun?
        Danke i.V.

        AND

        Comment


        • #5
          Hallo Andi,

          Hab eben mal folgenden Code getestet (unter JDK 1.4.2). Läuft bei mir ohne Exceptions und gibt dreimal "true" aus:

          <PRE>
          KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
          KeyPair pair = generator.generateKeyPair();
          RSAPublicKey oldKey = (RSAPublicKey)pair.getPublic();
          byte[] encoded = oldKey.getEncoded();
          X509EncodedKeySpec spec = new X509EncodedKeySpec(encoded);
          KeyFactory factory = KeyFactory.getInstance("RSA");
          RSAPublicKey newKey = (RSAPublicKey)factory.generatePublic(spec);
          System.out.println(oldKey.getPublicExponent().equa ls(newKey.getPublicExponent()));
          System.out.println(oldKey.getModulus().equals(newK ey.getModulus()));
          System.out.println(oldKey.toString().equals(newKey .toString()));
          </PRE>

          Du mußt aufpassen, das Du nicht versehentlich getPrivate, generatePrivate (oder irgendwas mit private keys) machst. Das klappt nur mit PKCS8EncodedKeySpec anstatt X509EncodedKeySpec.

          Gruß,

          Alwi

          Comment


          • #6
            Danke Dir ... habe es getestet!

            Mit PKCS8EncodedKeySpec klappt es nur, wenn ich den Bytestream nicht in/aus File schreibe/lese!

            Ansonsten: java.security.spec.InvalidKeySpecException: Key spec not RSA.

            Gruß,
            ANDI

            P.S. ... lese bytes[] folgendermaßen aus:

            FileInputStream fis = new FileInputStream(in);
            BufferedInputStream bis = new BufferedInputStream(fis);
            byte[] privateKey = new byte[bis.available()];
            bis.read(privateKey,0,bis.available())

            Comment


            • #7
              Hallo Alwin,

              es klappt jetzt alles wunderbar! Ich danke Dir vielmals ... Du hast mir echt geholfen!!!

              Viele Grüße,
              AND

              Comment

              Working...
              X