我正在用PHP构建一个应用程序,我希望使用非对称加密来在两个用户之间交换消息。
为了这个问题忽略密钥管理和其他外部因素,这真的很简单吗?
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privKey);
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
openssl_public_encrypt('this was encrypted with the public key', $secret, $pubKey);
openssl_private_decrypt($secret, $decrypted, $privKey);
echo "Decrypted message: $decrypted
答案 0 :(得分:5)
出于这个问题而忽略密钥管理和其他外部因素,真的这么简单吗?
对于简短的输入,获取通常可以正常工作的代码?是的。
获取可以任意长度输入的安全代码?我们都不都希望!但是,不。
为了娱乐,请尝试使用此代码加密整个博客文章。如果您的博客帖子长于一条推文,那将很难失败。
query ($query: Int) {
Page {
media(isAdult: false, popularity_greater: $query, type: ANIME) {
id
title {
english
}
episodes
startDate {
day
month
year
}
endDate {
day
month
year
}
genres
popularity
}
}
}
这将输出seasonYear
,因为消息大小为significantly longer than what RSA allows。
您可能会想将消息分成多个块,然后独立解密。邮件可以随意删除或重新排序,并且仍会解密。这在语义上是不安全的。
此外,默认填充模式(PKCS#1 v1.5)容易受到an attack that dates back to 1998的攻击。</ p>
因此,如果您想在PHP中使用非对称密码 而没有严格的限制或容易受到过多的旁通道攻击,那么您最终需要执行以下操作之一:
sodium_crypto_box_seal()
and sodium_crypto_box_seal_open()
。您甚至不必知道这些功能 的用途即可安全地使用它们。就这么简单。因此,从本质上讲:是的,您的示例代码是“您需要做的所有事情”,以获取有效的代码。但是,使RSA安全是一项艰巨的努力,这是不容忽视的。
最后,如果有疑问,请雇用密码学家。