将CRYPT_RSA_PUBLIC_FORMAT_PKCS1从php转换为Java中的RSA公钥

将CRYPT_RSA_PUBLIC_FORMAT_PKCS1从php转换为Java中的RSA公钥,java,php,android,rsa,phpseclib,Java,Php,Android,Rsa,Phpseclib,我正在尝试将RSA公钥从PHP发送到Java(Android)。我的PHP代码如下所示: function __construct() { $rsa = new Crypt_RSA(); $rsa->setHash('sha1'); $rsa->setMGFHash('sha1'); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP); $rsa-&

我正在尝试将RSA公钥从PHP发送到Java(Android)。我的PHP代码如下所示:

function __construct() {
        $rsa = new Crypt_RSA();
        $rsa->setHash('sha1');
        $rsa->setMGFHash('sha1');
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
        $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
        $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);

        // Code to Generate the public key and private key

        $keys = $rsa->createKey(1024);

        extract($keys);

        // Base 64 encode Public and Private key
        $this->rsa = $rsa;
        $this->keys = $keys;
        $this->publicKeyBase = base64_encode($publickey);
        $this->privateKeyBase = base64_encode($privatekey);
}
-----BEGIN RSA PUBLIC KEY-----
    MIGJAoGBALC9nRGaTk2o9IMnXUm/YdU0s+LZesOFR/UbE6+maX9plb0EmuG6ZppL
    hWgQmCAbezioRpvM/IUdvVs6zfaJh4FNqZEz4qgtWJ/hZTSdnvQH2R7qatLF4sFR
    CmcMT6Avv/t2gGYb1n/cYaoMkjSNwTEu2AIN9v84JI6ehf8cRODLAgMBAAE=
    -----END RSA PUBLIC KEY-----
我将
$this->publicKeyBase
发送到我的Android应用程序。在Java中,我得到如下编码字符串:

function __construct() {
        $rsa = new Crypt_RSA();
        $rsa->setHash('sha1');
        $rsa->setMGFHash('sha1');
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
        $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
        $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);

        // Code to Generate the public key and private key

        $keys = $rsa->createKey(1024);

        extract($keys);

        // Base 64 encode Public and Private key
        $this->rsa = $rsa;
        $this->keys = $keys;
        $this->publicKeyBase = base64_encode($publickey);
        $this->privateKeyBase = base64_encode($privatekey);
}
-----BEGIN RSA PUBLIC KEY-----
    MIGJAoGBALC9nRGaTk2o9IMnXUm/YdU0s+LZesOFR/UbE6+maX9plb0EmuG6ZppL
    hWgQmCAbezioRpvM/IUdvVs6zfaJh4FNqZEz4qgtWJ/hZTSdnvQH2R7qatLF4sFR
    CmcMT6Avv/t2gGYb1n/cYaoMkjSNwTEu2AIN9v84JI6ehf8cRODLAgMBAAE=
    -----END RSA PUBLIC KEY-----
LS0TLS1CRUDJTIBSU0EGUFVCTELDEEFWS0TLS0TdqNsudqW9HQKfMqlUKdHbzlJtW5YVW0VWWrVMHmRTFPLC09GUI9VYKU2K21HwBgGIWRW11RbZhachBmDqPov2DbYMBYMv6ZmKdKdKdKfKdKfKdKf0W0W0WfKfKfW0V0V0VwWwWrWrWnVfKfWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnW=

解码后,它看起来像这样:

function __construct() {
        $rsa = new Crypt_RSA();
        $rsa->setHash('sha1');
        $rsa->setMGFHash('sha1');
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
        $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
        $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);

        // Code to Generate the public key and private key

        $keys = $rsa->createKey(1024);

        extract($keys);

        // Base 64 encode Public and Private key
        $this->rsa = $rsa;
        $this->keys = $keys;
        $this->publicKeyBase = base64_encode($publickey);
        $this->privateKeyBase = base64_encode($privatekey);
}
-----BEGIN RSA PUBLIC KEY-----
    MIGJAoGBALC9nRGaTk2o9IMnXUm/YdU0s+LZesOFR/UbE6+maX9plb0EmuG6ZppL
    hWgQmCAbezioRpvM/IUdvVs6zfaJh4FNqZEz4qgtWJ/hZTSdnvQH2R7qatLF4sFR
    CmcMT6Avv/t2gGYb1n/cYaoMkjSNwTEu2AIN9v84JI6ehf8cRODLAgMBAAE=
    -----END RSA PUBLIC KEY-----
如何将其转换为可在Android应用程序中使用的公钥。我在网上看到了很多例子,但它们都不起作用,我的java代码(如下)也似乎不起作用。有什么可能的解决办法吗

private static PublicKey getPublicKeyFromPemFormat(String PEMString, boolean isFilePath) throws IOException, NoSuchAlgorithmException,
            InvalidKeySpecException {

        BufferedReader pemReader = null;
        if (isFilePath) {
            pemReader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(PEMString)));
        } else {
            pemReader = new BufferedReader(new InputStreamReader(
                    new ByteArrayInputStream(PEMString.getBytes("UTF-8"))));
        }
        StringBuffer content = new StringBuffer();
        String line = null;

        while ((line = pemReader.readLine()) != null) {
            if (line.indexOf("-----BEGIN RSA PUBLIC KEY-----") != -1) {
                while ((line = pemReader.readLine()) != null) {
                    if (line.indexOf("-----END RSA PUBLIC KEY-----") != -1) {
                        break;
                    }
                    content.append(line.trim());
                }
                break;
            }
        }
        if (line == null) {
            throw new IOException("PUBLIC KEY" + " not found");
        }
        Log.i("PUBLIC KEY: ", "PEM content = : " + content.toString());

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(content.toString(), Base64.DEFAULT)));

    }


文档有点混乱,但是通过查看从第950行开始的for方法
\u convertPublicKey($n,$e)
可以看出,如果
$publicKeyFormat==PUBLIC\u FORMAT\u PKCS8
,那么输出格式应该是与Java类兼容的格式。

我不知道您的问题,但是,当您尝试加密某些内容时,请使用适当的
密码
实例:
RSA/ECB/OAEPWithSHA-1和mgf1填充
@ArtjomB
new X509EncodedKeySpec(Base64.decode(content.toString(),Base64.DEFAULT))
抛出无效的密钥规范Exception@GregS谢谢!你的解决方案似乎奏效了,但愿我能投赞成票