Verschlüsselung/Entschlüsselung mit AES/ECB/NoPadding

Folgenden sind meine ver - /entschlüsseln-Methoden:

private String decrypt_data(String encData) 
                throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
    {
        String key = "bad8deadcafef00d";
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");

        cipher.init(Cipher.DECRYPT_MODE, skeySpec);

        System.out.println("Base64 decoded: "+Base64.decode(encData.getBytes()).length);
        byte[] original = cipher.doFinal(Base64.decode(encData.getBytes()));
        return new String(original).trim();     
    }

    private String encrypt_data(String data) 
                throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
    {
        String key = "bad8deadcafef00d";
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");

        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

        System.out.println("Base64 encoded: "+ Base64.encode(data.getBytes()).length);

        byte[] original = cipher.doFinal(Base64.encode(data.getBytes()));
        return new String(original);
    }

So, jetzt, wenn ich versuche zu verschlüsseln, bekomme ich diese exception:

javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
    at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:854)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:828)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
    at javax.crypto.Cipher.doFinal(Cipher.java:2087)

Habe ich versucht mit cipher Instanz AES/ECB/PKCS5Padding sowohl verschlüsseln und decrpt. Es funktioniert nur für die Verschlüsselung und nicht zur Entschlüsselung. Ich nehme an, die Polsterung ist notwendig, da die Daten-Größe ist nicht Vielfaches von 16bytes. 'Daten' byte-Länge gedruckt 152 so versucht Anhängen eight \0 Zeichen zu Daten und dann zu verschlüsseln, es hat nicht funktioniert.

  • check stackoverflow.com/questions/10836139/...
  • Erstes problem: Sie sind Konvertierungen zwischen Binärdaten und text in der komplett falsche Weg. Sie sollten mit String.getBytes mit einer bestimmten Zeichencodierung (ich empfehle UTF-8), um es zu verschlüsseln, und dann brauchen Sie nicht zu base64-das Ergebnis der Verschlüsselung. Ihr call of new String(original) wird versuchen, zu behandeln undurchsichtig binäre Daten, als wenn es text in der Standard-Kodierung. Das ist nicht gut zu gehen.
  • Warum geben Sie die bytes durch den base64 encode/decode vor dem verschlüsseln/entschlüsseln?
InformationsquelleAutor S-T | 2014-02-26
Schreibe einen Kommentar