PHP Conference Japan 2024

mcrypt_decrypt

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_decrypt使用給定參數解密密文

警告

此函式自 PHP 7.1.0 起已被標記為 *已棄用*,並自 PHP 7.2.0 起已被 *移除*。強烈建議不要依賴此函式。

說明

mcrypt_decrypt(
    字串 $cipher,
    字串 $key,
    字串 $data,
    字串 $mode,
    字串 $iv = ?
):字串|false

解密 data 並返回未加密的數據。

參數

cipher

MCRYPT_ciphername 常數之一,或演算法的名稱作為字串。

key

用於加密數據的密鑰。如果提供的密鑰大小不受加密器支持,該函數將發出警告並返回 false

data

將使用給定的 ciphermode 解密的數據。如果數據的大小不是 n * blocksize,數據將以 '\0' 填充。

mode

MCRYPT_MODE_modename 常數之一,或以下字串之一:"ecb"、"cbc"、"cfb"、"ofb"、"nofb" 或 "stream"。

iv

用於 CBC、CFB、OFB 模式以及 STREAM 模式下某些演算法的初始化。如果提供的 IV 大小不受鏈接模式支持,或者未提供 IV 但鏈接模式需要 IV,該函數將發出警告並返回 false

返回值

返回解密後的數據作為字串,如果失敗則返回 false

另請參閱

新增筆記

使用者貢獻的筆記 7 則筆記

eddiec at stararcher dot com
19 年前
看起來 mcrypt_decrypt 會用空值 ('\0') 填充 *返回字串* 以填滿到 n * blocksize。對於像我這樣的老 C 語言程式設計師來說,很容易相信字串在第一個空值處結束。在 PHP 中並非如此

strlen("abc\0\0") 返回 5 而不是 3
strcmp("abc", "abc\0\0") 返回 -2 而不是 0

當我將從 mycrypt_decrypt 返回的字串傳遞到 NuSoap 訊息中時,我痛苦地學到了這一課,該訊息愉快地將空值傳遞給接收者,而接收者卻不明白我在說什麼。

我的解決方案是
<?php
$retval
= mcrypt_decrypt( ...等等 ...);
$retval = rtrim($retval, "\0"); // 只修剪結尾的空值
?>
gmmarco at outlook dot my
7 年前
參考 https://php.dev.org.tw/manual/en/function.openssl-decrypt.php 以取得替代方案。

支援 PHP 5 >= 5.3.0, PHP 7
david at sickmiller dot com
16 年前
如果您要解密在 ColdFusion 中加密的資料,您會發現它的加密函式顯然會使用 ASCII 4(傳輸結束字元)來填充明文。

基於 eddiec 的程式碼,您可以使用以下程式碼移除空值和 EOT:

<?php
$retval
= mcrypt_decrypt( ...等等 ...);
$retval = rtrim($retval, "\0\4"); // 只修剪結尾的空值和 EOT
?>
beltrachi
13 年前
注意,MCRYPT_RIJNDAEL_256不等同於 AES_256。

要讓 RIJNDAEL 能用 openssl 從 AES 解密,方法是使用 MCRYPT_RIJNDAEL_128 並在使用以下函式加密之前,先將要加密的字串填充:

<?php
function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return
$text . str_repeat(chr($pad), $pad);
}
?>

在解密時,選擇 AES_256 或 AES_128 等,取決於加密時使用的金鑰大小。在我的例子中,它是一個 128 位元金鑰,所以我使用了 AES_128。
pnz dot r00t at yandex dot ru
8 年前
當我使用這個函式時,我發現解密後的訊息中會新增一些額外的二進位符號。
$sDecrypt – «2433091»
$sDecrypt strlen – 16 (修剪前)
$sDecrypt – «2433091»
$sDecrypt strlen – 7 (修剪後)
在本機電腦上,這個問題可以使用 trim/trim 解決,但如果我將加密的訊息傳送到伺服器,並嘗試加密它們,我會看到我的訊息不是像在本機電腦上的 16 個符號,而是 32 個符號,在編碼後。而且 trim 函式無法正常運作。我查看了符號程式碼,看到了以下情況:
50
52
51
51
48
57
49
0
0
0
0
0
0
0
0
0
10
158
112
183
154
27
95
85
42
35
95
54
227
41
179
77
在「跳格符號」之後,我得到了一些垃圾符號,我像這樣解決了這些問題。
在 mcrypt_decrypt 之後,我使用了以下程式碼:
$plaintext_dec = substr($plaintext_dec, 0, strpos($plaintext_dec, "\0"));
我認為這不是解決這個問題的最佳方法,但我解決了我的問題 :)
evangelion207 at hotmail dot com
13 年前
小心,有時 mcrypt_decrypt 會在解密後的字串中返回額外的空白;使用 trim() 刪除它們。我花了大約 2 個小時尋找錯誤,結果就是這個…
匿名
14 年前
要移除 PKCS7 填充

<?php
$decrypted
= mdecrypt_generic($td, base64_decode($enc_auth_token));
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
?>
To Top