2012-05-31 17 views
8

de funciones PHP CifrarJava AES CBC descifrado

$privateKey = "1234567812345678"; 
$iv = "1234567812345678"; 
$data = "Test string"; 

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv); 

echo(base64_encode($encrypted)); 

Result: iz1qFlQJfs6Ycp+gcc2z4w== 

Cuando trato de descifrar este resultado en Java utilizando la función a continuación, todo lo que se obtiene es ìš @ ~ ÔBKxnfÈ O'M mientras yo estoy esperando "Cadena de prueba". ¿Alguna idea de dónde estoy equivocado? Gracias

public static String decrypt() throws Exception{ 
    try{ 
     String Base64EncodedText = "iz1qFlQJfs6Ycp+gcc2z4w=="; 
     String decodedText = com.sun.xml.internal.messaging.saaj.util.Base64.base64Decode(Base64EncodedText); 
     String key = "1234567812345678"; 
     String iv = "1234567812345678"; 

     javax.crypto.spec.SecretKeySpec keyspec = new javax.crypto.spec.SecretKeySpec(key.getBytes(), "AES"); 
     javax.crypto.spec.IvParameterSpec ivspec = new javax.crypto.spec.IvParameterSpec(iv.getBytes()); 

     javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES/CBC/NoPadding"); 
     cipher.init(javax.crypto.Cipher.DECRYPT_MODE, keyspec, ivspec); 
     byte[] decrypted = cipher.doFinal(decodedText.getBytes()); 

     String str = new String(decrypted); 

     return str; 

    }catch(Exception e){ 
     return null; 
    } 
} 
+0

posible duplicado de [PHP Java AES CBC de cifrado diferente Resultados] (http : //stackoverflow.com/questions/10842509/php-java-aes-cbc-encryption-different-results) –

Respuesta

15

EDIT: A partir de Java 8 Java incluye ahora una clase Base64 aceptable, java.util.Base64.


Esta línea

String decodedText = com.sun.xml.internal.messaging.saaj.util.Base64.base64Decode(Base64EncodedText); 

se ve mal. En su lugar, use las clases apache commons codec o la clase Harder base64. Además, el relleno predeterminado utilizado por mcrypt, zero padding, es incorrecto y dificulta el uso de los resultados en otros idiomas. La sección de comentarios de usuarios para mcrypt_encrypt web pages tiene ejemplos de cómo hacer esto.

Aquí hay un pequeño ejemplo que usa las clases de Apache commons para descifrar su cadena.

import java.nio.charset.Charset; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 

import org.apache.commons.codec.binary.Base64; 
import org.apache.commons.codec.binary.Hex; 

public class AESToy3 { 

    private static final Charset ASCII = Charset.forName("US-ASCII"); 

    public static void main(String[] args) throws Exception { 
     String base64Cipher = "iz1qFlQJfs6Ycp+gcc2z4w=="; 
     byte [] cipherBytes = Base64.decodeBase64(base64Cipher); 
     byte [] iv = "1234567812345678".getBytes(ASCII); 
     byte [] keyBytes = "1234567812345678".getBytes(ASCII); 

     SecretKey aesKey = new SecretKeySpec(keyBytes, "AES"); 

     Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING"); 
     cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv)); 

     byte[] result = cipher.doFinal(cipherBytes); 
     System.out.println(Hex.encodeHexString(result)); 
    } 

} 

esto produce el siguiente resultado:

5465737420737472696e670000000000 

que cuando se decodifica como ASCII y la eliminación de los ceros de la izquierda le da Test string

+0

Votado en primer lugar, antes de cerrar :) –

+0

Muchas gracias GregS. Muy bien explicado. – user812120

+0

Gracias. Pero la clave es algo diferente a IV: clonarlos, solo confunde a los lectores. –

Cuestiones relacionadas