2012-05-31 6 views
8

PHP Шифрование ФункцияJava AES CBC дешифрование

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

Когда я пытаюсь расшифровать этот результат в Java с помощью функции ниже, все это я получаю обратно İŞ @ ÔBKxnfÈ ~ O'M в то время как я ожидал «Тестовая строка». Любые идеи, в которых я ошибаюсь? Благодаря

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

возможно дубликат [PHP Java AES CBC шифрования различных результатов] (HTTP : //stackoverflow.com/questions/10842509/php-java-aes-cbc-encryption-different-results) –

ответ

15

EDIT: На Java-Java теперь включает в себя приемлемый класс Base64, java.util.Base64.


Эта линия

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

выглядит неправильно. Вместо этого используйте классы apache commons codec или класс Harder base64. Кроме того, заполнение по умолчанию, используемое mcrypt, нулевое заполнение, возможно, неверно и затрудняет использование результатов на других языках. В разделе комментариев пользователей для mcrypt_encrypt web pages приведены примеры того, как это сделать.

Вот небольшой пример, который использует классы головоломок apache для расшифровки вашей строки.

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

} 

это производит следующий вывод:

5465737420737472696e670000000000 

, который при декодировании в ASCII и удаление замыкающих нулей дает Test string

+0

Проголосовало первым, перед закрытием :) –

+0

Большое спасибо GregS. Очень хорошо объяснено. – user812120

+0

Спасибо. Но ключ - это нечто иное, чем IV - клонирование их, вы просто путаете читателей. –

Смежные вопросы