2013-11-01 109 views
2

我想在下面的代碼中知道是否添加PKCS#5填充?如果不是如何添加?用於DES/CBC/PKCS5Padding加密和解密的PHP腳本

$message = "insert plaintext message here"; 

$iv = pack('H*', 'insert hex iv here'); 
$key = pack('H*', 'insert hex key here'); 

$enc = mcrypt_encrypt(MCRYPT_DES, $key, $message, MCRYPT_MODE_CBC, $iv); 

echo bin2hex($enc); 

我也想創建一個PHP代碼來解密用DES/CBC/PKCS5Padding創建的字符串。我認爲上面提到的代碼可以修改以獲得解密。

對我來說重要的是獲得PKCS#5 Padding和Unpadding腳本。

回答

3

不,不會添加。不幸的是,PHP/mcrypt使用零填充,直到消息是塊大小的N倍。

要添加PKCS#5填充,使用以下公式:

p = b - l % b 

l是信息長度,b是塊的大小和%是求餘運算。然後在執行加密之前將p字節與值p一起添加到最後。

+0

您可以將其添加到我的腳本並顯示我嗎?請。 –

+1

我的桌子上沒有那個代碼(主要是Java),但似乎已經在[mcrypt_encrypt文檔的評論]中共享(http://www.php.net/manual/en/function.mcrypt- encrypt.php#105173)。請注意,ECB和CBC使用相同的填充機制。還要注意[PKCS#5填充和PKCS#7填充是相同的(對於8字節塊大小)](http://crypto.stackexchange.com/questions/9043/what-is-the-difference-between-pkcs5- padding-and-pkcs7-padding) –

2

我發現了一些腳本,並在下面進行了修改,檢查現在PKCS#5填充是否完成。

<?php 
function printStringToHex($text) 
{ 
    $size = strlen($text); 
    for($i = 0; $i < $size; $i++) 
    { 
     echo dechex(ord($text[$i])) . " "; 
    } 
} 

function encrypt($input) 
{ 
    echo "<PRE>*** Encrypt *** </PRE>"; 
    echo "<PRE>Raw input: " . $input . "</PRE>"; 
    $size = mcrypt_get_block_size('des', 'cbc'); 
    echo "<PRE>Block: " . $size . "</PRE>"; 
    $input = pkcs5_pad($input, $size); 
    echo "<PRE>PKCS#5 padding: "; 
    echo printStringToHex($input); 
    echo "</PRE>"; 

    $td = mcrypt_module_open('des', '', 'cbc', ''); 
    $iv = pack('H*','insert hex iv here'); 
    $key = pack('H*','insert hex key here'); 
    mcrypt_generic_init($td, $key, $iv); 
    $data = mcrypt_generic($td, $input); 
    echo "<PRE>Raw output: " . $data . "</PRE>"; 
    echo "<PRE>Hex output: "; 
    echo printStringToHex($data); 
    echo "</PRE>"; 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 
    $data = base64_encode($data); 
    echo "<PRE>B64 output: " . $data . "</PRE>"; 
    echo "<PRE>B64 output len: "; 
    echo strlen($data) . "</PRE>"; 
    return $data; 
} 

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

$enc = encrypt("insert plaintext message here"); 
+1

你從哪裏找到它們的?請參考,這很重要。 – hakre

+0

我相信上面的代碼是基於PHP mcrypt文檔的註釋中的PKCS#5填充示例:http://us3.php.net/manual/en/ref.mcrypt.php#69782 – DEzra