PhpSeclib <-> BouncyCastle RSA



i在服务器端生成了一个对phpseclib的公共/私钥,例如

include 'Crypt/RSA.php';
$rsa = new Crypt_RSA();
$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
extract($rsa->createKey());
echo $privatekey;
echo "nnn";
echo $publickey;

现在,我想使用Java Bouncy Castle Engine在客户端公共密钥上导入。
在这里我的公钥

-----BEGIN PUBLIC KEY-----
MIGJAoGBAJEGAmaQejDgJaCg/B5+g68arqpMpl6jZ9+p8TBzNRIq+Ygt/n3iqz+pAtltrlRnmqSD
svx0LMluw1wXezQ1pz2tTJTEhg6b69Qui0o//W5UDfle4yOyAHaOs8MD5nubJjXFU8vGiEdektET
jgKqiSr5TBgZoHy+YDWpd4yTemXVAgMBAAE=
-----END PUBLIC KEY-----

,但我可以做到。我试图做几种方法,但我总是会遇到错误。

AsymmetricKeyParameter publicKey = 
    (AsymmetricKeyParameter) PublicKeyFactory.createKey(b64.decodeBuffer(key));
AsymmetricKeyParameter publicKey = 
    (AsymmetricKeyParameter) PublicKeyFactory.createKey(key.getBytes())

PEMReader pemReader = new org.bouncycastle.openssl.PEMReader (reader);
PemObject pem = pemReader.readPemObject();

所有这些方式都会产生错误。

我应该如何使用Java Boncy Castle Engine导入公钥?

我找到了解决方案

    key = key.replaceAll("PUBLIC KEY", "RSA PUBLIC KEY");
    final Reader reader = new StringReader(key);
    PEMReader pemReader = new PEMReader(reader);
    Object obj = pemReader.readObject();
    pemReader.close();
    BCRSAPublicKey bcPublicKey = (BCRSAPublicKey) obj;
    AsymmetricKeyParameter publicKey = (AsymmetricKeyParameter) PublicKeyFactory.createKey(bcPublicKey.getEncoded());
    AsymmetricBlockCipher e = new RSAEngine();
    e = new org.bouncycastle.crypto.encodings.PKCS1Encoding(e);
    e.init(true, publicKey);
    byte[] messageBytes = inputData.getBytes();
    encryptedData = e.processBlock(messageBytes, 0, messageBytes.length);

现在,我可以在Java侧加密,并在服务器(PHP)side上解密

可能值得尝试使用最新的git版本的phpseclib。引用半符合提交:

https://github.com/phpseclib/phpseclib/commit/2f8d1055a6b06b06b06cd7a40eb856661ba6888a31320

引用" [make] crypt_rsa的公共密钥与openssl兼容"。

最新更新