如何使用 DES-CBC 方法使用 openSSL 进行加密
How to encrypt with openSLL using the DES-CBC method
实际上我正在使用 Mcrypt,但我正在转向 OpenSSL,我需要能够以与 Mcrypt 完全相同的方式使用它。
这就是我加密的方式
mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_cbc, "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
对于解密,我已经设法在 OpenSSL 中完成,两者的工作方式完全相同
//Using Mcrypt
mcrypt_decrypt(MCRYPT_DES, $key, $enc, MCRYPT_MODE_cbc, "[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]");
//Using Openssl
openssl_decrypt($enc, 'des-cbc', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
使用OpenSSL加密,这是我的测试代码
$key = "123456SO";
$text = "name=louis&cp=75013";
$encMcrypt = mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_cbc, "[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]");
$encOpenssl = openssl_encrypt($text, "des-cbc", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, "[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]");
echo "Mcrypt : " . urlencode(base64_encode($encMcrypt));
echo " OpenSsl : " . urlencode(base64_encode($encOpenssl));
这是输出:
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD OpenSsl :
这是 official list of method,但我找不到 DES 方法。
我知道 Openssl 声明 DES 很弱,但我仍然需要在我的情况下使用它。
我如何使用 OpenSSL 在 DES-CBC 中加密并使其行为方式与 Mcrypt 函数相同?
编辑:
如果我去掉 OPENSSL_ZERO_PADDING
选项,结果和预期的差不多
代码:
openssl_encrypt($text, "des-cbc", $key, OPENSSL_RAW_DATA , "[=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=]");
输出:
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl : f0tF0ERITdKiI2SxrttYANpJ%2BZaEiIFr
字符串的第一部分是正确的,但最后与 Mcrypt 加密字符串的输出不同。
多亏了@Topaco,我才得以成功
我添加了 OPENSSL_ZERO_PADDING
选项来禁用 PKCS7 填充,然后我创建了一个函数来手动用 0x00
填充我的字符串
function zero_padding($text)
{
if (strlen($text) % 8)
$text = str_pad($text,strlen($text) + 8 - strlen($text) % 8, "[=10=]");
return $text;
}
$key = "123456SO";
$text = "name=louis&cp=75013";
$encMcrypt = mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_cbc, "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
$encOpenssl = openssl_encrypt(zero_padding($text), "des-cbc", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
$encMcrypt = urlencode(base64_encode($encMcrypt));
$encOpenssl = urlencode(base64_encode($encOpenssl));
echo "Mcrypt :" . $encMcrypt;
echo "OpenSsl:" . $encOpenssl;
输出:
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl: f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
实际上我正在使用 Mcrypt,但我正在转向 OpenSSL,我需要能够以与 Mcrypt 完全相同的方式使用它。
这就是我加密的方式
mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_cbc, "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
对于解密,我已经设法在 OpenSSL 中完成,两者的工作方式完全相同
//Using Mcrypt
mcrypt_decrypt(MCRYPT_DES, $key, $enc, MCRYPT_MODE_cbc, "[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]");
//Using Openssl
openssl_decrypt($enc, 'des-cbc', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
使用OpenSSL加密,这是我的测试代码
$key = "123456SO";
$text = "name=louis&cp=75013";
$encMcrypt = mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_cbc, "[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]");
$encOpenssl = openssl_encrypt($text, "des-cbc", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, "[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]");
echo "Mcrypt : " . urlencode(base64_encode($encMcrypt));
echo " OpenSsl : " . urlencode(base64_encode($encOpenssl));
这是输出:
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD OpenSsl :
这是 official list of method,但我找不到 DES 方法。
我知道 Openssl 声明 DES 很弱,但我仍然需要在我的情况下使用它。
我如何使用 OpenSSL 在 DES-CBC 中加密并使其行为方式与 Mcrypt 函数相同?
编辑:
如果我去掉 OPENSSL_ZERO_PADDING
选项,结果和预期的差不多
代码:
openssl_encrypt($text, "des-cbc", $key, OPENSSL_RAW_DATA , "[=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=]");
输出:
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl : f0tF0ERITdKiI2SxrttYANpJ%2BZaEiIFr
字符串的第一部分是正确的,但最后与 Mcrypt 加密字符串的输出不同。
多亏了@Topaco,我才得以成功
我添加了 OPENSSL_ZERO_PADDING
选项来禁用 PKCS7 填充,然后我创建了一个函数来手动用 0x00
function zero_padding($text)
{
if (strlen($text) % 8)
$text = str_pad($text,strlen($text) + 8 - strlen($text) % 8, "[=10=]");
return $text;
}
$key = "123456SO";
$text = "name=louis&cp=75013";
$encMcrypt = mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_cbc, "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
$encOpenssl = openssl_encrypt(zero_padding($text), "des-cbc", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
$encMcrypt = urlencode(base64_encode($encMcrypt));
$encOpenssl = urlencode(base64_encode($encOpenssl));
echo "Mcrypt :" . $encMcrypt;
echo "OpenSsl:" . $encOpenssl;
输出:
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl: f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD