RSA/ECB/PKCS1Padding 在 PHP 7.2 中解密

RSA/ECB/PKCS1Padding decryption in PHP 7.2

我从今天早上开始就一直在努力让它工作,但我现在已经被困在这上面好几个小时了。 这是我的 Public 密钥:https://pastebin.com/EBszJhSi 我有一个字符串需要加密。

字符串 = "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;
}

这个returns没什么。一片空白。

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

这个returns"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)));
}

使用 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 文件中的格式相同。