【问题标题】:Convert CRYPT_RSA_PUBLIC_FORMAT_PKCS1 from php to RSA Public key in Java将 CRYPT_RSA_PUBLIC_FORMAT_PKCS1 从 php 转换为 Java 中的 RSA 公钥
【发布时间】:2015-03-01 18:41:44
【问题描述】:

我正在尝试将 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);
}

然后我将 $this->publicKeyBase 发送到我的 Android 应用程序。在 Java 中,我得到这样的编码字符串:

LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tDQpNSUdKQW9HQkFMQzluUkdhVGsybzlJTW5YVW0vWWRVMHMrTFplc09GUi9VYkU2K21hWDlwbGIwRW11RzZacHBMDQpoV2dRbUNBYmV6aW9ScHZNL0lVZHZWczZ6ZmFKaDRGTnFaRXo0cWd0V0ovaFpUU2RudlFIMlI3cWF0TEY0c0ZSDQpDbWNNVDZBdnYvdDJnR1liMW4vY1lhb01ralNOd1RFdTJBSU45djg0Skk2ZWhmOGNST0RMQWdNQkFBRT0NCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0=

解码后是这样的:

-----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)));

    }

new X509EncodedKeySpec(Base64.decode(content.toString(), Base64.DEFAULT)) throws an Invalid KeySpec Exception.

【问题讨论】:

  • 我不知道您的问题,但是当您尝试加密某些内容时,请使用正确的 Cipher 实例:RSA/ECB/OAEPWithSHA-1AndMGF1Padding
  • @ArtjomB。 new X509EncodedKeySpec(Base64.decode(content.toString(), Base64.DEFAULT)) 抛出一个无效的 KeySpec 异常
  • @GregS 非常感谢!您的解决方案似乎有效,希望我能支持它

标签: java php android rsa phpseclib


【解决方案1】:

文档有点混乱,但是通过查看从第 950 行开始的方法 _convertPublicKey($n, $e)source code,似乎如果 $publicKeyFormat == PUBLIC_FORMAT_PKCS8 则输出格式应该是与 Java 的 X509EncodedKeySpec 类兼容的格式.

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2011-04-03
    • 1970-01-01
    • 2015-10-19
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多