Cifrado AES Java

Estoy desarrollando una aplicación en java para una plataforma móvil. El programa utiliza datos de una aplicación de Windows C # que cifra las contraseñas en una base de datos en línea que utilizará la aplicación móvil.

La aplicación móvil debe conectarse a la base de datos y recuperar la cadena cifrada de la base de datos y descifrarla.

Tengo el descifrado funcionando bien usando el siguiente código

public String decrypt(String encryptedPassword)
    {
        String plainPassword = "";
        try
        {
            SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");

            IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII"));

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

            cipher.init(Cipher.DECRYPT_MODE, key, iv);

            byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes()));
            plainPassword = new String(encoded);
        }
        catch (Exception ex)
        {
            Log.d("Decryption Error", ex.toString());
        }

        return plainPassword;
    }

El descifrado funciona absolutamente bien, así que utilicé el mismo código del descifrado para el cifrado, pero cambié el modo de cifrado de descifrar a cifrar. Sin embargo, cuando imprimo en la consola la contraseña encriptada, imprime una carga de basura que no se parece a la cadena que debería estar almacenada en la base de datos.

He utilizado el siguiente código para realizar el cifrado.

public String encrypt(String plainPasword)
    {
        String password = "";
        try
        {
            SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");

            IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII"));

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

            cipher.init(Cipher.ENCRYPT_MODE, key, iv);

            byte[] encoded = cipher.doFinal(plainPasword.getBytes());
            password = new String(encoded);


        }
        catch (Exception ex)
        {
            Log.d("Encryption Error", ex.toString());
        }
        return password;
    }

Gracias por cualquier ayuda que me puedan dar

preguntado el 08 de enero de 11 a las 19:01

¡¿Por qué estás encriptando contraseñas ?! por favor, use hashes de contraseñas saladas .. -

1 Respuestas

En la función de descifrado que está llamando

byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes()));

por lo que está convirtiendo bytes ASCII a bytes Base64 y luego descifrándolos.

¿No harías lo mismo al revés, cuando en realidad solo llamas

byte[] encoded = cipher.doFinal(plainPasword.getBytes());

También está creando un nuevo String () a partir de la matriz de bytes [] sin especificar la codificación, que utiliza la codificación predeterminada de la plataforma, no ASCII. Eso también podría romper cosas.

Si observa los bytes devueltos por cipher.doFinal () que se supone que es un galimatías, ¿no tienen ningún parecido con los datos esperados?

Respondido el 08 de enero de 11 a las 22:01

¡Golpéame! Solo iba a decir lo mismo :) También preguntaré por qué el OP está haciendo esto él mismo. A menos que tenga realmente limitaciones de memoria, existen algunas buenas bibliotecas que ya manejan todo el código repetitivo como este. - Payaso enojado

Tengo la sensación de que podría estar haciendo algo estúpido aquí, pero se va. Cambié la línea que mencionaste a byte [] encoded = cipher.doFinal (Base64.encodeBase64 (plainPasword.getBytes ())); pero sigue produciendo basura que no se parece a nada de lo que crea c # - Boardy

Si su descifrado va como cadena-> cadena a bytes-> decodeBase64-> descifrar, entonces su cifrado debe ir exactamente al revés: cifrar bytes-> encodeBase64-> cadena de bytes - Axarydax

es como descifrar (base64decode (bytes (input_string))) para descifrar, y string (base64encode (cifrar (bytes))) para cifrar; la base64 y el cifrado deben invertirse - Axarydax

Impresionante, muchas gracias por tu ayuda, lo tengo funcionando ahora. Una vez más, gracias. - Boardy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.