我对我希望简单调用PHP的问题有严重的问题
openssl_public_encrypt();
可悲的是,我收到了无效的公钥警告。
我的目标是简单地使用其API提供的公钥对用户密码进行RSA加密,目前看起来像这样:
+ Tir6 + unMOaQ5tHqjjjwnlAMhccnCSMFEi3a0mhIxbW + O / GukjomGyzckQT2h0Ys70JezHbNq5YS3sYkNF29kCkz4HuNfy9eEjE / clA9 / zyfT8ZcbnusLcLz2xNgbTp62fQdzBnReI5 + DPJ / N24krYvHaYIr8ACxDqBv2TR3E9M = AQAB
显然,使用我尝试使用的相同服务的工作实现找到了具有以下步骤的解决方案:
然而,不仅我不知道它是否可以用PHP做,我认为必须有一个更简单的方法!
我看到的一个帖子暗示指数可能出现在最后一个符号之后(所以AQAB),但我不知道这是否可靠。
答案 0 :(得分:1)
像这样做你想要的东西?:
<?php
$key = '+Tir6+unMOaQ5tHqjjjwnlAMhccnCSMFEi3a0mhIxbW+O/GukjomGyzckQT2h0Ys70JezHbNq5YS3sYkNF29kCkz4HuNfy9eEjE/clA9/zyfT8ZcbnusLcLz2xNgbTp62fQdzBnReI5+dpj/N24krYvHaYIr8ACxDqBv2TR3E9M=AQAB';
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->loadKey(array(
'e' => new Math_BigInteger(65537),
'n' => new Math_BigInteger(substr($key, 0, -4), -256)
));
$ciphertext = $rsa->encrypt('password');
echo bin2hex($ciphertext);
?>
此示例使用phpseclib, a pure PHP RSA implementation。尽管phpseclib不支持您发布的密钥格式,但它支持原始公钥,因此转换为PKCS1样式密钥是不必要的。而phpseclib产生的密文完全是interoperable with OpenSSL。
答案 1 :(得分:0)
好的,你需要做什么:
AQAB
部分,并使用值65537作为公共指数以下ASN.1规范定义了PKCS#1格式的公钥:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
现在SEQUENCE的标识符八位字节或标记为十六进制30
,INTEGER为02
,长度应指定为like this。所以你会得到类似的东西:
30818902818100F938ABEBEBA730E690E6D1EA8E38F09E500C85C727092305122DDAD26848C5B5BE3BF1AE923A261B2CDC9104F687462CEF425ECC76CDAB9612DEC624345DBD902933E07B8D7F2F5E12313F72503DFF3C9F4FC65C6E7BAC2DC2F3DB13606D3A7AD9F41DCC19D1788E7E7698FF376E24AD8BC769822BF000B10EA06FD9347713D30203010001
以十六进制表示。因此,在base 64编码并添加页眉和页脚行后,您应该得到:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQH5OKvr66cw5pDm0eqOOPCeUAyFxycJIwUSLdrSaEjFtb478a6SOiYbLNyRBPaHRizvQl7Mds2rlhLexiQ0Xb2QKTPge41/L14SMT9yUD3/PJ9Pxlxue6wt
wvPbE2BtOnrZ9B3MGdF4jn52mP83biSti8dpgivwALEOoG/ZNHcT0wIDAQAB
-----END RSA PUBLIC KEY-----
快乐的编码。