我正在尝试使用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解密。
由于