2012-05-31 15 views
8

PHP Encrypt FunzioneJava AES CBC decrittografia

$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== 

Quando cerco di decifrare questo risultato in Java utilizzando la funzione qui sotto, tutto quello che ottiene è di nuovo è @ ÔBKxnfÈ ~ O'M mentre mi aspetto "Stringa di prova". Qualche idea in cui mi sbaglio? Grazie

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

possibile duplicato del [PHP Java AES CBC crittografia Diversi risultati] (http : //stackoverflow.com/questions/10842509/php-java-aes-cbc-encryption-different-results) –

risposta

15

EDIT: Come di Java 8 Java include ora una classe Base64 accettabili, java.util.Base64.


Questa linea

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

sembra sbagliato. Utilizzare invece le classi apache commons codec o la classe Harder base64. Anche il padding predefinito usato da mcrypt, zero padding, è discutibilmente sbagliato e rende difficile l'uso dei risultati in altre lingue. La sezione commenti degli utenti per il mcrypt_encrypt web pages ha esempi su come farlo.

Ecco un piccolo esempio che utilizza le classi di apache comuni per decodificare la stringa.

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)); 
    } 

} 

questo produce il seguente output:

5465737420737472696e670000000000 

che una volta decodificato come ASCII e rimuovendo i zeri finali si dà Test string

+0

Sottoscritto per primo, prima di chiudere :) –

+0

Grazie mille GregS. Molto ben spiegato – user812120

+0

Grazie. Ma la chiave è una cosa diversa dalla IV: clonandoli si confondono semplicemente i lettori. –

Problemi correlati