【问题标题】:PhpSeclib <-> BouncyCastle RSAPhpSeclib <-> BouncyCastle RSA
【发布时间】:2012-10-25 03:35:38
【问题描述】:

我在服务器端使用 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 "\n\n\n";
echo $publickey;

现在我想使用 Java Bouncy Castle 引擎在客户端导入公钥。
这是我的公钥

-----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 Bouncy Castle 引擎导入公钥?

【问题讨论】:

  • 请包含错误/堆栈跟踪。

标签: php rsa bouncycastle public-key phpseclib


【解决方案1】:

可能值得尝试使用最新的 Git 版本的 phpseclib。引用一个半近期的提交:

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

引用它,提交“[使] Crypt_RSA 的公钥与 OpenSSL 兼容”。

【讨论】:

    【解决方案2】:

    我找到了解决办法

        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)端解密

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 2023-04-02
      • 2017-08-26
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      相关资源
      最近更新 更多