簡體   English   中英

PHP中的簡單AES加密,用Java解密

[英]Simple AES encrypt in PHP, decrypt in Java

我想實現一種簡單但安全的方法,將一些信息從PHP腳本發送到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

關鍵是只在那里進行調試,當然,我會在它工作時將其刪除,並將其存儲在客戶端中。 不知道最好的方法是什么,不知何故,我想通過隱藏方式將它隱藏起來,服務器也知道如何生成它。 但我想它會在內存中可讀,不是嗎?

AES是塊密碼,僅適用於16字節的塊。 當您的密文長度不能被16整除時,之后會導致IllegalBlockSizeException。

您可以在PHP中輕松實現AES / CBC密碼的PKCS5填充,這基本上是一種標准化的方法,如何將明文輸入填充為塊大小的精確倍數:

function pkcs5_pad($text) {
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $pad = $size - (strlen($text) % $size);
    return $text . str_repeat(chr($pad), $pad);
}

然后更新加密函數以使用填充:

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
pkcs5_pad($plaintext), MCRYPT_MODE_CBC, $iv);

Java已經實現了對PKCS5的支持,只需更新AES密碼初始化:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM