PHP RSA使用OPENSSL加密\u无\u填充模式,返回false

PHP RSA使用OPENSSL加密\u无\u填充模式,返回false,php,rsa,Php,Rsa,我用RSA方法加密密码,我设置填充模式“OPENSSL\u NO\u padding”,它返回false。但是如果我删除padding mode参数,将其保留为默认值,则加密成功 $pass = 'gmwtwjfws'; $encrypetd_pass = ''; $pub_key = '-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+JvfyTOMHqvjxHJyDZG HZpz3atV7qcOT

我用RSA方法加密密码,我设置填充模式“OPENSSL\u NO\u padding”,它返回false。但是如果我删除padding mode参数,将其保留为默认值,则加密成功

$pass = 'gmwtwjfws';
$encrypetd_pass = '';
$pub_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+JvfyTOMHqvjxHJyDZG
HZpz3atV7qcOT8mijXGGG3S+8Bb2p2kREGJwrzC2IIErCQUcZ3Wa3wTugKQDxqXE
SPt76HN2353ufegbvTI9kYgK0MLFpY8OZAMsaTytVrvUEVHjqGXZO4z7oVTqByuB
wcZAvK+sN39+MqisS6ZejACbbQLkWZgcSgt5wBAaDaEa2lvRYcVbNyO/mqTU6SSf
d+w78uM07BpmxhimOMwf+l/qs+Z04LUm4Ay7b+AHHAwbaHeehC1wInzNDfipgR0H
0FCa/LOnEblj2HVpptB/NY4XNG+CDHTBKkxzEw92D/Nj1JIlr1oP0l+/VdAnxxiW
uQIDAQAB
-----END PUBLIC KEY-----';
$result = openssl_public_encrypt($pass, $encrypetd_pass, $pub_key);
var_dump($result);  //return false
exit;
而且,我对公钥的格式感到困惑。如果我保持默认的填充模式,并且公钥的格式如上所述,它将返回true。但是当我修改密钥格式如下(删除一个新行)时,它返回false。有人能解释一下原因吗?非常感谢

$pub_key = '-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+JvfyTOMHqvjxHJyDZGHZpz3atV7qcOT8mijXGGG3S+8Bb2p2kREGJwrzC2IIErCQUcZ3Wa3wTugKQDxqXE
SPt76HN2353ufegbvTI9kYgK0MLFpY8OZAMsaTytVrvUEVHjqGXZO4z7oVTqByuB
wcZAvK+sN39+MqisS6ZejACbbQLkWZgcSgt5wBAaDaEa2lvRYcVbNyO/mqTU6SSf
d+w78uM07BpmxhimOMwf+l/qs+Z04LUm4Ay7b+AHHAwbaHeehC1wInzNDfipgR0H
0FCa/LOnEblj2HVpptB/NY4XNG+CDHTBKkxzEw92D/Nj1JIlr1oP0l+/VdAnxxiW
uQIDAQAB
-----END PUBLIC KEY-----';

我遇到了同样的问题,并在

错误报告的答案是,当使用OPENSSL\u NO\u填充时,必须提供正确大小的数据,即通过附加\0


现在我需要做的就是找出正确的大小:)

警告:openssl\u public\u encrypt():key参数不是有效的公钥。函数openssl_error_string将显示“error:0906D06C:PEM例程:PEM_read_bio:no start line”。大小似乎是256字节边界。但从API的角度来看,这有什么意义?没有填充似乎可以节省空间,所以OPENSSL\u NO\u填充听起来很吸引人;无论如何,你只需要把它填充进去。是的,你必须把填充物放进去。NO_PADDING的作用是允许您使用自己的填充方案进行填充(到256字节或任何字节)。我试图将PHP加密与Java解密相匹配,结果发现PHP和Java之间没有通用的填充方案。但是,通过使用我自己的填充,我可以在PHP中模拟Java PKCS1填充方案,然后使用标准Java实用程序进行解密。因此,填充标志OPENSSL_PKCS1_padding不能用于此目的?不,我在某处发现有人提到PHP从PKCS1更改为PKCS7,因为PKCS1可能不安全。但他们没有改变国旗的名称。因此,即使您使用标志OPENSSL_PKCS1_PADDING,它也在执行PKCS7,我找不到Java解密。