2012-05-31 49 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

が重複する可能性を与えるときに(HTTP ://stackoverflow.com/questions/10842509/php-java-aes-cbc-encryption-different-results) –

答えて

15

EDITは:Javaの8のJavaの通り今java.util.Base64、許容Base64のクラスが含まれています。


このライン

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

は間違って見えます。代わりに、apache commons codecクラスまたはHarder base64クラスを使用してください。また、mcryptで使用されるデフォルトの埋め込み、ゼロ埋め込みは間違いであり、結果を他の言語で使用することは困難です。 mcrypt_encrypt web pagesのユーザーコメントセクションには、これを行う方法の例があります。

ここでは、apache commonsクラスを使用して文字列を復号する小さな例です。

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としてデコードされ、末尾のゼロを削除すると、あなたに[PHP JavaのAES CBC暗号異なる結果]のTest string

+0

閉じる前に投票しました。 –

+0

ありがとうございましたGregS。非常によく説明されています。 – user812120

+0

ありがとうございます。しかし、キーはIVとは違っています。読者を混乱させるだけのものをクローンします。 –

関連する問題