PHP 7.2中的RSA / ECB / PKCS1填充解密

时间:2019-02-04 13:51:23

标签: php rsa public-key-encryption phpseclib php-7.2

自从今天早上以来,我一直在努力使它工作,但是现在我已经在这件事上停留了几个小时。 这是我的公钥:https://pastebin.com/EBszJhSi 我有一个需要加密的字符串。

String =“ Hello”

这是我的下面的代码...

function RSAEncryption($text)
{

    $encrypted = 'hey';
    $publicKey = "file:/".PUBLIC_KEY;
    $plaintext = "Hello";
    $pubkey = openssl_pkey_get_public(file_get_contents(PUBLIC_KEY));
    openssl_public_encrypt($plaintext, $encrypted, re($publicKey), OPENSSL_PKCS1_PADDING);
    echo $encrypted;   //encrypted string
    return $encrypted;
}

这不返回任何内容。完全是空白。

var_dump(openssl_public_encrypt($plaintext, $encrypted, re($publicKey), OPENSSL_PKCS1_PADDING));

这将返回“ false”。我也尝试了多个库,例如phpseclib,这还有另一个问题。我已经尝试了phpseclib,1.0和2.0这两个版本。 phpseclib的问题在于,即使我从官方来源下载了文件,也缺少一些变量。

无论如何,有人可以帮我吗?

编辑:

PUBLIC_KEY的值为/location/keys/publickey.pem

re()函数:

function re($key_file_path)
{
    $handle = fopen($key_file_path, "r");
    // echo "Key Contents : " . fread($handle, filesize($key_file_path)) . "<br>";
    return nl2br(fread($handle, filesize($key_file_path)));
}

2 个答案:

答案 0 :(得分:0)

使用phpseclib:

$key = '---- BEGIN SSH2 PUBLIC KEY ----
Comment: "imported-openssh-key"
AAAAB3NzaC1yc2EAAAABJQAAAQEAgsYRVei5nVln0cX9D/x5OcscdO5WCsmyZUEN
dHhfgVD8UklasxcXElKoL0UEer9nvJWMILAU/ZMHbf0O1SaiYbhFmDFyHi/CfwT6
QHD2mu7qLbadXXs0OiGiTUPwZX2Sux2uoxm0ZwfxjSbO85rlJ7Yg0ZjXkRiw+4qT
OQNyYEq4Vt6R/BwIdf5Yt75+7Nzlm5HHi4TPNE63YJJTdazJQ1OWgdZWIZjk4M9K
Zl8x9qNRsKd2GC1G6CGq+L1DOgBbPVWPE7DGUVYJYYF609Iau11LXS6d2FBDUS3S
xna7mtmlZQNEvSRtctuojWfwWI2k1Ac/DW3RJ+M1ccN78dseEw==
---- END SSH2 PUBLIC KEY ----';

$key = preg_replace('#----.*?----#', '', $key);
$key = preg_replace('#Comment: .*#', '', $key);
$key = str_replace(["\r", "\n"], '', $key);

$key = 'ssh-rsa ' . $key;

$rsa = new RSA();
$rsa->loadKey($key);

echo $rsa;

回显密钥通常是查看密钥是否成功加载的不错方法。如果您注释掉preg_replacestr_replace'ssh-rsa' . $key位(即,如果您尝试直接加载密钥)将不会加载,但是如果它们在然后放置。

该技术不适用于OpenSSL,因为base64编码的密钥结构最终是SSH格式的密钥,而OpenSSL不支持这些密钥。相比之下,phpseclib的格式与您的密钥完全不同,但格式并不完全相同。 phpseclib期望键的格式与~/.ssh/authorized_keys文件中的键相同。

答案 1 :(得分:-1)

  1. 检查文件路径:"file:/".PUBLIC_KEY;。应该是两个斜杠
  2. 您尝试从文件名而不是路径file_get_contents(PUBLIC_KEY)
  3. 获取文件内容
  4. re($publicKey)的作用是什么?它不是PHP内置函数
    function RSAEncryption($text)
    {
        $publicKeyContent = file_get_contents("file://".PUBLIC_KEY);
        $publicKey = openssl_pkey_get_public($publicKeyContent);

        openssl_public_encrypt($text, $encrypted, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);

        return $encrypted;
    }