2014-10-09 31 views
4

我有一個不同的結果之間java和php方法在做AES128零填充和沒有IV加密。不同的AES128與零填充加密結果之間的PHP和Java

這裏PHP代碼:

<?php 
$ptaDataString = "secretdata"; 
$ptaDataString = encryptData($ptaDataString); 
$ptaDataString = base64_encode($ptaDataString); 
function encryptData($input) { 
       $ptaKey = 'secret'; 
       $iv = "\0"; 
       $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $ptaKey, $input, MCRYPT_MODE_CBC, $iv); 
       return $encrypted; 
} 
echo $ptaDataString; 
?> 

這裏是Java代碼:

public static String encrypt() throws Exception { 
    try { 
     String data = "secretdata"; 
     String key = "secret0000000000"; 
     String iv = "0000000000000000"; 

     Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
     int blockSize = cipher.getBlockSize(); 

     byte[] dataBytes = data.getBytes(); 
     int plaintextLength = dataBytes.length; 
     if (plaintextLength % blockSize != 0) { 
      plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); 
     } 

     byte[] plaintext = new byte[plaintextLength]; 
     System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); 

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

     cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); 
     byte[] encrypted = cipher.doFinal(plaintext); 

     return new sun.misc.BASE64Encoder().encode(encrypted); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

PHP導致:kjgE5p/3qrum6ghdjiVIoA ==

的Java由此而來:zLKhVMksRRr1VHQigmPQ2Q ==

任何幫助,將不勝感激,謝謝

+0

最好不要使用mcrypt,它已經放棄了近十年的時間了。因此它已被棄用,並將在PHP 7.2中從核心和PECL中刪除。它不支持標準的PKCS#7(néePKCS#5)填充,只有非標準的null填充甚至不能用於二進制數據。 mcrypt有許多可以追溯到2003年的突出錯誤。相反,考慮使用[defuse](https://github.com/defuse/php-encryption)或[RNCryptor](https://github.com/RNCryptor),它們提供了一個完整的解決方案,正在維護和正確。 – zaph 2017-01-25 16:31:06

回答

3

在Java中,表示爲一個字符串零字節"\0""0"。如果你糾正你的例子如下,結果匹配:

String data = "secretdata"; 
String key = "secret\0\0\0\0\0\0\0\0\0\0"; 
String iv = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 

在IV的情況下,它可能只是更容易寫:

byte[] iv = new byte[<block size>]; 

在你的代碼的最後一行,你訪問sun.misc.BASE64Encoder()。訪問任何以sun.*開頭的內容都會被忽視,因爲這些是內部類。考慮使用:

return DatatypeConverter.printBase64Binary(encrypted); 
+0

我明白了,謝謝:) – 2014-10-09 07:24:29