java - RSA公钥编码,Java和Android中,相同的代码,不同的结果

标签 java android encryption rsa

Android 中的代码:

public static String encryptRSA(String text) throws Exception {

    byte[] encoded = Base64.decode(RSA_PUBLIC_KEY, Base64.NO_WRAP);

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
    KeyFactory kf = KeyFactory.getInstance("RSA");

    RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new X509EncodedKeySpec(encoded));
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    byte[] encrypted = cipher.doFinal(text.getBytes());

    return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}

Java 代码:

public static String encryptRSA(String text) throws Exception {

    byte[] encoded = Base64.getDecoder().decode(RSA_PUBLIC_KEY);

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
    KeyFactory kf = KeyFactory.getInstance("RSA");

    RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new X509EncodedKeySpec(encoded));
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    byte[] encrypted = cipher.doFinal(text.getBytes());

    return Base64.getEncoder().encodeToString(encrypted);
}

它在Java中工作,我可以通过私钥解密,但在Android中相同的功能不起作用。我还注意到,对于同一个字符串,输出总是相同的,而在 Java 中它是随机的:

Java 输出(可解密):

try {
        System.out.println(encryptRSA("lol"));
        System.out.println(encryptRSA("lol"));
        System.out.println(encryptRSA("lol"));
    } catch (Exception ex) {
        Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
    }

run:

G/tAnJiWA1htmdK93T+7PYUGQ6yCdpcjpTq6rZJt4JgnzGNp1Y5wtqV5sObrFMKUcslZK1OscNTTeo8eA9cS7msA9L+9/0+leqOW/A/cPSki+UtOy5u45ZtaLVv3IrPamktEq8ilHsh5Jtr U7sZS0MGDqQdGJjwEJCcCv13leCpVoMsC6NcvZmf3MkJlvN4Xqa4FLOBguiX+k0b8QgNEvNNAH4v5PFfkjN3Ybec0DHXB+In6fybPM35oposuGjpq55VftIBSFvm0zHoHfeYrUVWPqTGbXjF8xA8 YaKcYgHPMMrMW9SSV4vwkr4KXHkjHwQBCmzQ5WZSBu4qvwtl9AA== VKygaIxVz4QY5/JEGAjOyFuHLZaLOYeGEhzfvNDtNNPLZ3Q/2c3rcfYdt8P9ykDF8k5e7KU09lDcB2y1RKOYEpXkiJPLQTRSz4HFKOj+6zhhRaVpXkBDZQEkJ4nLktnfeEwwsmfAwk8iZ8gY 0hNfTRnHsqFxD5uf6sI4yT9Tj/1BXIcuO1r+/wgnuBQPqw8HyiZBuGuIEOyMpR6HakTo8BMCSQh9KNK+WBIxlssljHGQU4N0WyKKmI5WgvS6BImBjVdct75NDEBW7RlwHQpEvObIdaeJVjEfekvh 04TvMip+Tp3HYmZ3SwdFPIaGhbLWq2y/i3mZ5huQWwkcBKPLfQ== DuMWeZW8SGRU1IXKfsxAMzrKzpisu1MPXp8DNwPq6EhxbVoUlco7nJqwe+yrne0Ba+aDXuJatYLBu7/DqaAhef9XsFZwXfNgQARywMEuQS130m4Ld6hWJ0onugHtkf6u37vTtFXvVdJOx2GG5eW QKbIbrTZkVhvf145s5yGzZtvX0xmzBx1lH/E0Y1v0EaSeW8nOcrf1Hi0cqKFl/cYZdLbaRrCv6hxy58t8FiVg0vuFPrZiIESRG7u9KYC7rahtwoaxascNgCSL99I/IszQEpcllfjDqFMJwD4d Vb3zxsMYX6JHqxnPOM1K5gHlNmzzWabTfwBORZhiH3wqVECKw==

Android 输出(无法解密):

System.out.println(this.encryptRSA("lol"));
        System.out.println(this.encryptRSA("lol"));
        System.out.println(this.encryptRSA("lol"));

I/System.out:     tB4qJuqwamQADNzDhZwaIBMFWYfVjGoCz1AYk9YudRUtWAtDeTlB17VAjUZSxedlP66M/G6SJ84Zl3fEvLb2JJbRUOSeEKIl8DzDPD+O9Jtd7DNzn0IDPsUt1mcjV6ixccFLdnHOpUYShHPl39zodPIRAAh83lcQYKs8iQwWL98helUQ8GghWSpcp2QappQwYFYbhHWbvUYXTjTIy/LdvHjAXcK/s5UMNZkUA5BWCCKkAx98K86JTIUcVJF2rCBdw5Sf6bWEuVk5QXIx5Ipy9YO7QAIJd80lFgr6Q3CC4FnKVaxLlCCefFzTIiBPw+FWCYo+mrDvBGV4/YqLgD11zg==

I/System.out: tB4qJuqwamQADNzDhZwaIBMFWYfVjGoCz1AYk9YudRUtWAtDeTlB17VAjUZSxedlP66M/G6SJ84Zl3fEvLb2JJbRUOSeEKIl8DzDPD+O9Jtd7DNzn0IDPsUt1mcjV6ixccFLdnHop UYShHPl39zodPIRAAh83lcQYKs8iQwWL98helUQ8GghWSpcp2QappQwYFYbhHWbvUYXTjTIy/LdvHjAXck/s5UMNZkUA5BWCCKkAx98K86JTIUcVJF2rCBdw5Sf6bWEuVk5QXIx5Ipy9YO7QAIJd80 lFgr6Q3CC4FnKVaxLlCCefFzTIiBPw+FWCYo+mrDvBGV4/YqLgD11zg==

I/System.out: tB4qJuqwamQADNzDhZwaIBMFWYfVjGoCz1AYk9YudRUtWAtDeTlB17VAjUZSxedlP66M/G6SJ84Zl3fEvLb2JJbRUOSeEKIl8DzDPD+O9Jtd7DNzn0IDPsUt1mcjV6ixccFLdnHop UYShHPl39zodPIRAAh83lcQYKs8iQwWL98helUQ8GghWSpcp2QappQwYFYbhHWbvUYXTjTIy/LdvHjAXck/s5UMNZkUA5BWCCKkAx98K86JTIUcVJF2rCBdw5Sf6bWEuVk5QXIx5Ipy9YO7QAIJd80 lFgr6Q3CC4FnKVaxLlCCefFzTIiBPw+FWCYo+mrDvBGV4/YqLgD11zg==

最佳答案

@pedrofb 的回答是正确的并解决了问题。虽然我不知道为什么,它也可以在 Java 中使用“RSA”,并生成正确的加密输出,但在 Android 中却不会。 @SLaks 也是正确的,当然,在转换为字节时,您应该始终使用 utf8,但在这种情况下,我只是使用 RSA 作为签名方法,并且输入字符串始终是 base64。但这里是 Android 和 Java 中的工作代码:

public static String encryptRSA(byte[] toEncode) throws Exception {

    byte[] encoded = Base64.decode(RSA_PUBLIC_KEY, Base64.NO_WRAP);

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
    KeyFactory kf = KeyFactory.getInstance("RSA");

    RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new X509EncodedKeySpec(encoded));
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    byte[] encrypted = cipher.doFinal(toEncode);

    return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}

关于java - RSA公钥编码,Java和Android中,相同的代码,不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41925096/

相关文章:

java - 使用 .jar 中的类时出现 NoClassDefError

Android:在 ListView Adapter 中切换 OnCheckedChangeListener

android - 如何在 Android 的 Canvas 上绘制平滑/抖动渐变

java - 如何将解密的 BigInteger 转换回字符串?

java - Matlab filtfilt()函数在Java中的实现

java - 错误 :Execution failed for task , 以非零退出值 1 结束

Java,从GPS设备写入 ".fit"格式的文件。不工作。 Ant + SDK

java - Kotlin 检测服务器请求超时

c# - 使用 Blowfish/CBC/PKCS5Padding 加密和解密数据

ssl - 您如何设置加密的 mosquitto 代理程序,例如具有 https 的网页?