没有盐的Openssl非对称加密(在php中)

时间:2011-10-01 07:57:30

标签: encryption openssl salt

我需要使用SSH-2 RSA 1024位(使用公钥)然后使用RMD-160算法加密字符串数据。我是这样做的:

生成私钥:

openssl genrsa -des3 -out privatekey.key 1024

公钥:

openssl rsa -in privatekey.key -pubout -out public.pem

加密数据:

openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out encrypted_data.txt

但是,请求是:需要使用相同的输入获得相同的输出!例如,如果输入字符串是“某些数据”而加密字符串是“a23c40327a6c5a67a5bb332”,那么每次输入“某些数据”时我都需要输出“a23c40327a6c5a67a5bb332”

我可以使用非对称加密吗?

我知道可以使用-nosalt选项

进行DES等对称加密
openssl des3 -nosalt -in file.txt -out file.des3

但非对称加密是否可行?

2 个答案:

答案 0 :(得分:1)

可能不是。

openssl的手册页显示rsautl子命令接受pkcs1 1.5填充,oaep填充,向后兼容的SSL填充或无填充。所有这些(除了没有填充)都会生成随机数据来填充消息,因此没有两个加密会生成相同的密文(这是一件好事)。

如果您可以手动将数据填充到正确的长度,那么您可以使用无填充但是会被警告这会显着削弱您的安全性。

答案 1 :(得分:1)

Cameron Skinner是对的 - 你应该使用随机填充。

也就是说,如果您不愿意,可以使用phpseclib, a pure PHP RSA implementation,如下所示:

$ciphertext = base64_decode('...');
$ciphertext = new Math_BigInteger($ciphertext, 256);
echo $rsa->_exponentiate($ciphertext)->toBytes();

这是一个hackish解决方案,因为phpseclib本身不允许你在没有随机填充的情况下进行RSA加密,但确实可以完成任务。