自从今天早上以来,我一直在努力使它工作,但是现在我已经在这件事上停留了几个小时。 这是我的公钥: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)));
}
答案 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_replace
,str_replace
和'ssh-rsa' . $key
位(即,如果您尝试直接加载密钥)将不会加载,但是如果它们在然后放置。
该技术不适用于OpenSSL,因为base64编码的密钥结构最终是SSH格式的密钥,而OpenSSL不支持这些密钥。相比之下,phpseclib的格式与您的密钥完全不同,但格式并不完全相同。 phpseclib期望键的格式与~/.ssh/authorized_keys
文件中的键相同。
答案 1 :(得分:-1)
"file:/".PUBLIC_KEY;
。应该是两个斜杠file_get_contents(PUBLIC_KEY)
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;
}