用于DES/CBC/的PHP脚本,其中PKCS5P添加了加密和解密

用于DES/CBC/的PHP脚本,其中PKCS5P添加了加密和解密,php,encryption,mcrypt,des,pkcs#5,Php,Encryption,Mcrypt,Des,Pkcs#5,我想知道在下面的代码中是否添加了PKCS#5填充?如果没有,如何添加 $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

我想知道在下面的代码中是否添加了PKCS#5填充?如果没有,如何添加

$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/pkcs5p创建的字符串。我认为可以修改上面提到的代码以获得解密


对我来说,重要的是获取PKCS#5填充和取消添加脚本。

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

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

p = b - l % b

其中,
l
是消息长度,
b
是块大小,
%
是剩余操作。然后在执行加密之前,将值为
p
bytes添加到末尾。

我找到了一些脚本并在下面对它们进行了修改,请检查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");

我桌上没有这段代码(主要是Java),但它似乎已经被共享了。请注意,ECB和CBC使用相同的填充机制。还要注意,你在哪里找到的?留下参考,这很重要。我相信上面的代码是基于PHP mcrypt文档注释中的PKCS#5填充示例的: