【问题标题】:PHP RSA encrypt with OPENSSL_NO_PADDING mode, return falsePHP RSA 使用 OPENSSL_NO_PADDING 模式加密,返回 false
【发布时间】:2016-06-30 03:47:05
【问题描述】:

我使用 RSA 方法加密密码,我设置了填充模式“OPENSSL_NO_PADDING”,它返回 false。但是如果我去掉填充模式参数,保持默认,加密成功。

$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_public_encrypt():key 参数不是有效的公钥。函数 openssl_error_string 将显示“error:0906D06C:PEMroutines:PEM_read_bio:no start line”。

标签: php rsa


【解决方案1】:

我遇到了同样的问题,并在 https://bugs.php.net/bug.php?id=61203 找到了一个错误报告

错误报告的答案是,当使用 OPENSSL_NO_PADDING 时,您必须提供正确大小的数据,即附加 \0。

现在我需要做的就是找出正确的尺寸:)

【讨论】:

  • 大小似乎是 256 字节边界。
  • 但是从 API 的角度来看,有什么意义呢?没有填充似乎可以节省空间,所以 OPENSSL_NO_PADDING 听起来很有吸引力;但是,无论如何,您只需要填充它。
  • 是的,您必须放入 Padding。NO_PADDING 所做的是允许您使用自己的填充方案进行填充(到 256 或任何字节)。我试图将 PHP 加密与 Java 解密相匹配,结果发现 PHP 和 Java 之间没有通用的填充方案。但是通过我自己的填充,我可以在 PHP 中模拟 Java PKCS1 填充方案,然后使用标准的 Java 实用程序解密。
  • 那么,填充标志 OPENSSL_PKCS1_PADDING 不能用于此目的?
  • 不,我发现某处提到 PHP 从 PKCS1 更改为 PKCS7,因为 PKCS1 可能不安全。但他们没有改变旗帜名称。因此,即使您使用标志 OPENSSL_PKCS1_PADDING,它也在执行 PKCS7,我无法找到 Java 解密。
猜你喜欢
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2013-08-18
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多