我正在尝试用 php open_ssl 加密一个字符串,然后用 Java 解密它。我以为我有点明白发生了什么,但显然不是。
起初我无法让算法匹配。据我所知,openssl_private_encrypt() 正在使用 RSA,虽然文档是关于 PKCS1_PADDING 的,但从我读到的内容看来,它似乎已更改为使用 PKCS5/7 以变得更加安全。而且我无法使用 RSA/NONE/PKCS5 或 PKCS7 获得任何 Java 密码。
但我认为我通过使用 NoPadding 并自己填充块取得了成功。这是我使用 openssl 从 DER 转换为 PEM 的现有 512 位密钥。我有一个测试字符串
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
我能够在 php 中读取私钥并使用
$fp=fopen("/folder/private_key.pem","r");
$privkey_res=fread($fp,1024);
$privkey = openssl_pkey_get_private($privkey_res);
$padding = OPENSSL_NO_PADDING;
openssl_private_encrypt($texttocrypt, $encryptedtext, $privkey, $padding);
file_put_contents("/folder/encrypted.txt", $encryptedtext );
然后回到Java中,我能够正确解密该字符串使用
Cipher cipherb = Cipher.getInstance("RSA/NONE/NoPadding");
cipherb.init(Cipher.DECRYPT_MODE, publicKey);
decrypted = cipherb.doFinal(text.getBytes());
所以我想我可以让事情变得有用。但是,然后我稍微更改了测试字符串,例如最后一个 'f' 到 'g'
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdeg
然后我在解密时得到了完全的垃圾。虽然没有错误。如果我只是更改了第一个字符,它仍然可以正确解密。
在这一点上,我什至不确定我不明白的是什么。但是有没有办法实现我最初的目标?用 php open_ssl 加密,用 Java 解密。
谢谢