Java RSA填充解密问题(聊天应用程序)

Java RSA填充解密问题(聊天应用程序),java,encryption,cryptography,rsa,chat,Java,Encryption,Cryptography,Rsa,Chat,我正在用Java编写聊天应用程序的代码,我必须实现加密算法。我使用的是RSA,每个用户都有自己的密钥。当一个用户向另一个用户发送消息时,应用程序将加密消息并在.txt文件中写入密码。然后,应用程序将读取该.txt文件,解密文件并显示解密的密码…但我有错误 > javax.crypto.BadPaddingException: Decryption error at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:383)

我正在用Java编写聊天应用程序的代码,我必须实现加密算法。我使用的是RSA,每个用户都有自己的密钥。当一个用户向另一个用户发送消息时,应用程序将加密消息并在.txt文件中写入密码。然后,应用程序将读取该.txt文件,解密文件并显示解密的密码…但我有错误

> javax.crypto.BadPaddingException: Decryption error
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:383)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:294)
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    at javax.crypto.Cipher.doFinal(Cipher.java:2164)
    at org.fastchat.User.readMessage(User.java:139)
    at org.fastchat.ChatWith.<init>(ChatWith.java:80)
    at org.fastchat.WatchInbox.startWatch(WatchInbox.java:75)
    at org.fastchat.WatchInbox.run(WatchInbox.java:41)
这是一个用于解密和读取消息的函数

    public String readMessage(String msg) throws Exception{
    // Creating a Cipher object

    System.out.println("\n\n"+msg+"\n");     //!!!!!
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

    // Initializing the same cipher for decryption
    cipher.init(Cipher.DECRYPT_MODE, getPriv());

    // Decrypting the text
    byte[] decipheredText = cipher.doFinal(msg.getBytes());
    return new String(decipheredText,"UTF8");   
}

我可以仅使用.txt文件使用RSA算法进行加密/解密,还是必须使用其他方法?

是的,如果要将密文视为文本,则需要对其进行base64编码。密文由随机值字节组成,并非每个字节都代表有效字符

recFile.write(new String(cipherText,"UTF8"));
上行中的
新字符串
和解密过程中的
getBytes
都可能导致删除、更改甚至插入字节


使用UTF-8作为实际字节的编码策略是一个好主意。当前,您正在对明文消息使用平台编码:

byte[] input = message.getBytes();

这不是一个好主意,请使用
message.getBytes(StandardCharsets.UTF_8)
。通过以这种方式指定字符集,还可以避免不必要的异常处理,因为上述字符集始终存在,因此在编译时验证正确性。

首先,我进行了此更正
byte[]input=message.getBytes(StandardCharsets.UTF_8),什么也没有发生,之后我做了这个
byte[]decipheredText=cipher.doFinal(msg.getBytes(StandardCharsets.UTF_8)),又没什么,我得到了同样的错误。
byte[] input = message.getBytes();