Проблема расшифровки отступов RSA (приложение чата) - PullRequest
0 голосов
/ 18 марта 2020

Я пишу код для приложения чата в 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 void sendMessage(User receiver, String message) throws Exception {
    //Encrypter message, sent to receiver inbox
    // Getting the public key from the key pair
    PublicKey publicKey = receiver.getPub();

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

    // Initializing a Cipher object
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);

    // Add data to the cipher
    byte[] input = message.getBytes();
    cipher.update(input);

    // encrypting the data
    byte[] cipherText = cipher.doFinal();
//      System.out.println(new String(cipherText, "UTF8")); 

    BufferedWriter recFile=new BufferedWriter(new FileWriter(receiver.getInbox()+"/"+getUsername()+".txt"));
    recFile.write(new String(cipherText,"UTF8"));


    //DONT DELETE
    //Make check file in receiver check folder, inbox check
    BufferedWriter check=new BufferedWriter(new FileWriter(receiver.getCheck()+"/"+getUsername()+".txt"));
    Random random=new Random();
    Integer num=random.nextInt(20);
    check.write(num.toString());

    check.close();
    recFile.close();
}

Это функция для дешифрования и чтения сообщения

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

Могу ли я шифровать / дешифровать с помощью алгоритма RSA только с использованием файла .txt или I должны использовать какие-то дополнительные методы?

1 Ответ

0 голосов
/ 18 марта 2020

Да, вам нужно зашифровать код зашифрованного текста 64, если вы хотите трактовать его как текст. Зашифрованный текст состоит из байтов со случайным значением, и не каждый байт представляет действительный символ.

recFile.write(new String(cipherText,"UTF8"));

И new String в приведенной выше строке, и getBytes в процедуре расшифровки могут привести к удалению байтов , изменен или даже вставлен.


Хорошей идеей является использование UTF-8 в качестве стратегии кодирования для реальных байтов. В настоящее время вы используете кодировку платформы для открытого текста:

byte[] input = message.getBytes();

Это не очень хорошая идея, используйте message.getBytes(StandardCharsets.UTF_8). Указывая таким образом набор символов, вы также избегаете ненужной обработки исключений, так как указанные выше наборы символов всегда присутствуют, поэтому правильность проверяется во время компиляции.

...