Speichern von RSA-Keys in Datenbank und SharedPreference

  • 1 Antworten
  • Letztes Antwortdatum
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
27
Guten Morgen / Mittag :flapper:,

in meiner App wird ein RSA-Schlüsselpaar generiert:
Code:
try
        {
            // Generate a 1024-bit RSA key pair
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            keyGen.initialize(1024);
            KeyPair keypair = keyGen.genKeyPair();
            privateKey = keypair.getPrivate().getEncoded();
            publicKey = keypair.getPublic().getEncoded();

            X509EncodedKeySpec puKE = new X509EncodedKeySpec(publicKey);
            publicKeyStr = puKE.getEncoded().toString();

            PKCS8EncodedKeySpec prKE = new PKCS8EncodedKeySpec(privateKey);
            privateKeyStr = prKE.getEncoded().toString();
        }
        catch (java.security.NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }

Anschließend soll der PublicKey per .php in eine MySQL-Datenbank eingetragen werden und der PrivateKey in eine SharedPreference. Das klappt auch soweit. Nur beim Entschlüsseln fängt er an, Exceptions zu werfen (Habe gerade leider kein LogCat dar, da der Code oben schon die 4. oder 5. Version ist, wo es nicht klappt).

Entschlüsseln:

Code:
SharedPreferences sp1 = PreferenceManager.getDefaultSharedPreferences(this);
        String privateKey = sp1.getString("privateKey", "");

        byte[] privateKeyByte = privateKey.getBytes();

        KeyFactory keyFactory;
        PrivateKey prKey;
        Cipher cipher;
        String decrypMessage = "";

        try
        {
            keyFactory = KeyFactory.getInstance("RSA");
            PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyByte);
            prKey = keyFactory.generatePrivate(privateKeySpec);
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, prKey);
            decrypMessage = cipher.doFinal(message.getBytes()).toString();
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (InvalidKeySpecException e1)
        {
            e1.printStackTrace();
        }
        catch (NoSuchPaddingException e2)
        {
            e2.printStackTrace();
        }
        catch (InvalidKeyException e3)
        {
            e3.printStackTrace();
        }
        catch (IllegalBlockSizeException e4)
        {
            e4.printStackTrace();
        }
        catch (BadPaddingException e5)
        {
            e5.printStackTrace();
        }

Verschlüsseln:

Code:
byte[] publicKeyByte = publicKey.getBytes();

                KeyFactory keyFactory;
                PublicKey puKey;
                Cipher cipher;

                try
                {
                    keyFactory = KeyFactory.getInstance("RSA");
                    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyByte);
                    puKey = keyFactory.generatePublic(publicKeySpec);
                    cipher = Cipher.getInstance("RSA");
                    cipher.init(Cipher.ENCRYPT_MODE, puKey);
                    encrypMessage = cipher.doFinal(strMessage.getBytes());
                }
                catch (NoSuchAlgorithmException e)
                {
                    e.printStackTrace();
                }
                catch (InvalidKeySpecException e1)
                {
                    e1.printStackTrace();
                }
                catch (NoSuchPaddingException e2)
                {
                    e2.printStackTrace();
                }
                catch (InvalidKeyException e3)
                {
                    e3.printStackTrace();
                }
                catch (IllegalBlockSizeException e4)
                {
                    e4.printStackTrace();
                }
                catch (BadPaddingException e5)
                {
                    e5.printStackTrace();
                }

Ich möchte mich nicht lange auf Fehlersuche / Verbesserung begeben, sondern kennt jemand eine Möglichkeit, wie man möglichst einfach Public- und PrivateKey auf den oben genannten Wegen speichern kann. Der PublicKey wird irgendwann vom Server geholt und in einer lokalen Android SQLite-Datenbank gespeichert.

Danke im Voraus,

L4E
 
Shared Preferences sind schon mit die "einfachste" Art, lokal Daten zu speichern.

Deine Encodeten Keys sind byte-Arrays. Mit byte[].toString bekommst du nicht einen String mit den bytes als Text, sondern eine Objekt-ID.

byte[]->String geht via new String(byte[],String encoding). Da kommt dann das nächste Problem: Deine bytearrays sind kein Asciitext, sondern wilde bytes. Die sollte man besser in Bytearray-Form belassen (das geht aber mit SharedPreferences auch).

Kann sein, dass in dem Code noch weitere Böcke versteckt sind. :D
 
  • Danke
Reaktionen: soma-web
Zurück
Oben Unten