我想實現一種簡單而安全的方式,將一些信息從PHP腳本發送到Java客戶端。我已經在這裏查看了幾個實現,但目前爲止沒有任何工作,現在我感到很沮喪。我有位編輯使用的最後一個是這一個:PHP中的簡單AES加密,Java解密
PHP:
function enc3($plaintext) {
$length = 16;
$key = openssl_random_pseudo_bytes($length);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);
echo base64_encode($ciphertext);
echo "\n".base64_encode($iv);
echo "\n".base64_encode($key);
}
enc3("test");
的Java:
public static byte[] decrypt(byte[] key, byte[] initVector, byte[] encryptedValue) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector);
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(encryptedValue);
return original;
} catch (Exception ex) {
Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
...
byte[] encpryted = Base64.getDecoder().decode(rd.readLine());
byte[] iv = Base64.getDecoder().decode(rd.readLine());
byte[] key = Base64.getDecoder().decode(rd.readLine());
byte[] output = decrypt(key, iv, encpryted);
我也得到一個:
javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
的關鍵只是爲了在那裏調試,當然,我會在工作時將其刪除,並將其存儲在客戶端中。不知道最好的辦法是什麼,不知怎的,我想通過隱藏的方式隱藏它,服務器也知道如何生成它。但我想它會在內存中可讀,不是嗎?
如果您使用PHP 7.1.0,mcrypt_encrypt()已被拒絕。 –
不,我不使用PHP7,它是PHP5.6.22-2 –
你檢查過'encryptedValue'的長度嗎? – SubOptimal