2012-05-31 17 views
8
ben bekliyorum ederken Şifrele Fonksiyon

Java AES CBC Şifre çözme

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

aşağıda işlevini kullanarak Java bu sonucu şifresini çözmek için deneyin, geri dönmem tüm @ ÔBKxnfÈ ~ O'M State and Local olduğunu

PHP "Test dizisi". Yanlış olduğum herhangi bir fikir var mı? Teşekkür

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

olası yinelenen http : //stackoverflow.com/questions/10842509/php-java-aes-cbc-encryption-different-results –

cevap

15

DÜZENLEME: Java 8 Java itibariyle artık java.util.Base64, kabul edilebilir bir Base64 sınıfını içerir.


Bu hat

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

yanlış görünüyor. Bunun yerine, apache commons codec sınıflarını veya Harder base64 sınıfını kullanın. Ayrıca, mcrypt tarafından kullanılan varsayılan dolgu, sıfır dolgu, tartışmasız yanlıştır ve sonuçları diğer dillerde kullanmakta zorlanır. Kullanıcı yorumları mcrypt_encrypt web pages'un bölümünün bunun nasıl yapılacağına dair örnekleri vardır.

Dize şifresini çözmek için apache commons sınıflarını kullanan küçük bir örnek.

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

} 

bu şu çıktıyı üretir:

5465737420737472696e670000000000 

hangi ASCII olarak deşifre ve sondaki sıfır atarak size verdiğinde Test string

[PHP, Java AES CBC Şifreleme Farklı Sonuçlar] (içinde
+0

İlk önce oy vermeden önce kapatın :) –

+0

Çok teşekkürler GregS. Çok iyi açıkladı. – user812120

+0

Teşekkürler. Fakat anahtar, IV'ten farklı bir şeydir - onları klonlamak sadece okurları karıştırır. –

İlgili konular