Java 解密的字符串包含有效字符和无效字符

Java 解密的字符串包含有效字符和无效字符,java,android,base64,bouncycastle,boringssl,Java,Android,Base64,Bouncycastle,Boringssl,我正在使用以下代码解密一个RSA加密的base64编码字符串。但是,解密的字符串在实际字符串前面有一些无效字符。我一直在试图找出是什么原因导致这些垃圾数据出现,但我在这方面的有限专业知识限制了我 使用终端中的openssl,使用以下命令对数据进行加密 使用的OpenSSL命令: openssl genrsa -out priv_key.pem 2048 openssl rsa -pubout -in priv_key.pem -out pub_key.pem openssl rsautl

我正在使用以下代码解密一个RSA加密的base64编码字符串。但是,解密的字符串在实际字符串前面有一些无效字符。我一直在试图找出是什么原因导致这些垃圾数据出现,但我在这方面的有限专业知识限制了我

使用终端中的openssl,使用以下命令对数据进行加密

使用的OpenSSL命令:

openssl genrsa -out priv_key.pem 2048  
openssl rsa -pubout -in priv_key.pem -out pub_key.pem 
openssl rsautl -encrypt -in userdata.json -out user_encrypted_with_pub_key -inkey pub_key.pem –pubin
decipherString(priv, decodeBase64(base64StringBuilder.toString()).toByteArray());

private static void decipherString(PrivateKey privateKey, byte[] encodedStringData) {
        byte[] dectyptedText = null;
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            dectyptedText = cipher.doFinal(encodedStringData);
            Timber.w("Deciphered text is: %s", new String(dectyptedText, "UTF-8"));
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
我正在以编程方式做的唯一一件事是解码使用上述命令加密的数据。我正在使用bouncyCastle的最新版本

代码:

openssl genrsa -out priv_key.pem 2048  
openssl rsa -pubout -in priv_key.pem -out pub_key.pem 
openssl rsautl -encrypt -in userdata.json -out user_encrypted_with_pub_key -inkey pub_key.pem –pubin
decipherString(priv, decodeBase64(base64StringBuilder.toString()).toByteArray());

private static void decipherString(PrivateKey privateKey, byte[] encodedStringData) {
        byte[] dectyptedText = null;
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            dectyptedText = cipher.doFinal(encodedStringData);
            Timber.w("Deciphered text is: %s", new String(dectyptedText, "UTF-8"));
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
输出:

openssl genrsa -out priv_key.pem 2048  
openssl rsa -pubout -in priv_key.pem -out pub_key.pem 
openssl rsautl -encrypt -in userdata.json -out user_encrypted_with_pub_key -inkey pub_key.pem –pubin
decipherString(priv, decodeBase64(base64StringBuilder.toString()).toByteArray());

private static void decipherString(PrivateKey privateKey, byte[] encodedStringData) {
        byte[] dectyptedText = null;
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            dectyptedText = cipher.doFinal(encodedStringData);
            Timber.w("Deciphered text is: %s", new String(dectyptedText, "UTF-8"));
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
T1.O�Y1�{�L�M�X�`�������/9���Z��yt�戔��环氧乙烷��Z3���~7Aܴ�rtj)j��x')��E�/�$iJ���;���1&��我�U�#�$����}�C�����4P��E�-ρ�����?�wQ���Z�N�B��派克�%�>�我�X����TqDv�_���?��{“ssid”:“PT”,“password”:“XYZ123”,“security”:“WPA2”}

永远不要这样做:

Cipher cipher = Cipher.getInstance("RSA");
始终指定完整的转换字符串:“algorithm/mode/padding”。否则将导致代码无法移植,因为默认值是特定于提供程序的。在您的情况下,默认值相当于

Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
但这不是您在这里需要的。
openssl rsautl
默认情况下使用PKCS#1 v1.5加密填充,因此您需要的是

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

尝试ASCII编码也尝试了,但它仍然提供相同的输出。我尝试了,没有为解密的字符串提供任何字符集,并且仍然提供相同的输出。但是使用终端的decrypt命令进行解密会提供正确的解密字符串。您能告诉cli上的输出是什么吗?
{“ssid”:“PT”,“password”:“XYZ123”,“security”:“WPA2”}
是CLI上的输出,但在处理代码时,它预先添加了垃圾数据。目前我找不到您的其他问题,但同样适用于……我们需要更多信息,如公钥和私钥以及纯文本和密码文本的十六进制转储。任何人都无法测试您的操作。太棒了!您是怎么做到的你知道需要哪些参数吗?我很想从一个对noob友好的来源了解一些关于这个库的基本知识。