cifrado Java - PHP con resultados diferentes.

Iniciado por turion, 26 Septiembre 2016, 22:24 PM

0 Miembros y 1 Visitante están viendo este tema.

turion

!Buenas noches a todos!

Pues veréis, tengo un problema algo curioso. Estoy desarrollando una web que tiene su base de datos y esta base de datos es alimentada por un programa escrito en Java. Hasta aqui no hay problema.
El problema viene cuando cifro los datos, es decir, si cifro 'hola' en php obtengo una cadena distinta a si lo cifro en java.

El método en ambos lenguaje es AES 256 cbc, o eso creo yo...

La función que cifra en php es la siguiente:

function encrypt($string) {
$output = false;

$encrypt_method = "AES-256-CBC";

$secret_key = 'abcdefghijklmnño';
$secret_iv = 'adb6ad2f3ae01b30';

// hash
$key = hash('sha256', $secret_key);

// iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
$iv = substr(hash('sha256', $secret_iv), 0, 16);



    $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
    $output = base64_encode($output);

return $output;
}


Y la que cifra en Java es la siguiente:


public static String encrypt( String value) {
        try {
            String key = "abcdefghijklmnño";
String initVector = "adb6ad2f3ae01b30";
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

            byte[] encrypted = cipher.doFinal(value.getBytes());
            System.out.println("encrypted string: "
                    + Base64.encodeBase64String(encrypted));

            return Base64.encodeBase64String(encrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }



¿Sabéis a que puede ser debido?

Gracias de antemano¡

engel lex

AES en algunos de sus modos retorna diferentes resultados cada cifrado, el fin de esto es evitar el analisis de paquetes estaticos, sin  embargo si está bien implementado no hay ningun conflicto para retornarlo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

turion

#2
Cita de: engel lex en 27 Septiembre 2016, 01:06 AM
AES en algunos de sus modos retorna diferentes resultados cada cifrado, el fin de esto es evitar el analisis de paquetes estaticos, sin  embargo si está bien implementado no hay ningun conflicto para retornarlo

¿Y no se puede cifrar desde distintos idiomas de programación para el intercambio de información? No le veo el sentido...

Creo que mis métodos están bien implementados, ambos tienen los mismos IV y los mismos key. por lo que debería ofercerme 2 cadenas iguales para una misma frase o letra


Cita de: turion en 27 Septiembre 2016, 20:20 PM
¿Y no se puede cifrar desde distintos idiomas de programación para el intercambio de información? No le veo el sentido...

Creo que mis métodos están bien implementados, ambos tienen los mismos IV y los mismos key. por lo que debería ofercerme 2 cadenas iguales para una misma frase o letra


Googleando he encontrado lo siguiente:

https://github.com/stevenholder/PHP-Java-AES-Encrypt


Al parecer funciona, con una cifrado menos extensa pero funcionando.

MOD: No hacer doble post.

6hiii

Creo que el valor de la Ñ puede ser el responsable de que te de diferente para PHP y Java. No puedo asegurartelo porque no programó en PHP pero casos he visto.