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_replace
、str_replace
和 'ssh-rsa' . $key
位(即,如果您尝试直接加载密钥),它不会加载,但如果它们在然后放置。
此技术不适用于 OpenSSL,因为 base64 编码的密钥结构最终是 SSH 格式的密钥,而 OpenSSL 不支持这些。相比之下,phpseclib 的格式与您的密钥不完全相同。 phpseclib 期望密钥的格式与 ~/.ssh/authorized_keys
文件中的格式相同。
我从今天早上开始就一直在努力让它工作,但我现在已经被困在这上面好几个小时了。 这是我的 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_replace
、str_replace
和 'ssh-rsa' . $key
位(即,如果您尝试直接加载密钥),它不会加载,但如果它们在然后放置。
此技术不适用于 OpenSSL,因为 base64 编码的密钥结构最终是 SSH 格式的密钥,而 OpenSSL 不支持这些。相比之下,phpseclib 的格式与您的密钥不完全相同。 phpseclib 期望密钥的格式与 ~/.ssh/authorized_keys
文件中的格式相同。