【发布时间】:2018-01-18 06:00:12
【问题描述】:
我需要能够使用 OpenSSL 解密在 PHP 下使用 Mcrypt 生成的值。
我有这个工作,除了用于加密它们的密钥是 ascii。
以下是我的代码,演示了一个工作案例,当密钥为 MD5 时,OpenSSL 可以解密使用 Mcrypt 加密的值。
<?php
$message = 'test';
$key = md5('Quigibo');
$iv = openssl_random_pseudo_bytes(0);
$encrypted = mcrypt_encrypt(
MCRYPT_BLOWFISH,
$key,
$message,
MCRYPT_MODE_ECB,
$iv
);
$decrypted = openssl_decrypt(
$encrypted,
'bf-ecb',
$key,
OPENSSL_RAW_DATA | OPENSSL_NO_PADDING,
$iv
);
$trimDecrypted = rtrim($decrypted);
var_export(
[
'Original message' => $message,
'Encrypted' => bin2hex($encrypted),
'Decrypted' => $decrypted,
'Trim decrypted' => $trimDecrypted,
'Message length' => mb_strlen($message, '8bit'),
'Decrypted length' => mb_strlen($decrypted, '8bit'),
'Message == decrypted' => $message === $trimDecrypted
]
);
但是,如果您将 $key 更改为值“Quigibo”(而不是该值的 MD5 散列),则无法使用 OpenSSL 解码加密值。
在与 OpenSSL 一起使用之前,我是否可以对 ASCII 密钥应用某种编码形式,以便正确解密该值?
【问题讨论】:
-
如果它们的密钥长度太短,mcrypt 用空值填充它(取决于加密类型)。尝试使用更长的 ASCII 密钥,看看是否可行。如果是这样,那么这就是问题所在,并且是库之间的差异。
-
另请参阅stackoverflow.com/questions/41181905/…,尝试使用 OpenSSL 以与 Mcrypt 和空填充等效的方式进行加密也是一个问题。