Шифрование данных файла в Java в тот же файл - PullRequest
1 голос
/ 08 марта 2020

Я разрабатываю простое приложение, которое должно принимать имя пользователя и пароль, данные сохраняются в файле CSV.

Я хочу, чтобы эти данные были зашифрованы, чтобы никто не мог просто открыть и прочитать их. имена пользователей и пароли, перечисленные там, я покопался в Интернете и нашел хороший метод, который отлично работает для моего приложения, за исключением того, что он создает новый файл с зашифрованными данными, а исходный файл все еще существует.

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

это мой код

public static void encryptDecrypt (String key, int cipherMode, File in, File out)
    throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IOException
{
    FileInputStream fileInputStream = new FileInputStream(in);
    FileOutputStream fileOutputStream = new FileOutputStream(out);

    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

    SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);

    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

    if(cipherMode == Cipher.ENCRYPT_MODE) {
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, SecureRandom.getInstance("SHA1PRNG"));
        CipherInputStream cipherInputStream = new CipherInputStream(fileInputStream, cipher);
        write(cipherInputStream, fileOutputStream);
    }
    else if (cipherMode == Cipher.DECRYPT_MODE){
            cipher.init(Cipher.DECRYPT_MODE, secretKey, SecureRandom.getInstance("SHA1PRNG"));
            CipherOutputStream cipherOutputStream = new CipherOutputStream(fileOutputStream, cipher);
            write(fileInputStream, cipherOutputStream);
    }
}


public static void write(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[64];
    int numOfByteRead;

    while ((numOfByteRead = in.read(buffer)) != -1){
        out.write(buffer, 0, numOfByteRead);
    }
    out.close();
    in.close();
}

и кнопка закрытия в приложении должна зашифровать файл, содержащий список имен пользователей и паролей, поэтому я сделал следующее

public void setCancelButton(){
    File login = new File("D:\\Users\\login.csv");
    File encrypted = new File("D:\\Users\\login.csv");

    try {
        encryptDecrypt("12345678", Cipher.ENCRYPT_MODE, login, encrypted);
        System.out.println("File Encrypted");
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeySpecException e) {
        e.printStackTrace();
    }
    Stage stage = (Stage) cancelButton.getScene().getWindow();
    stage.close();
}

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

1 Ответ

2 голосов
/ 08 марта 2020

За исключением исключительно плохого шифровального кода и обработки исключений, проблема в том, что вы открываете файл для записи и удаляете файл в процессе. Это то, что new FileOutputStream делает по умолчанию. Таким образом, вы сначала очищаете файл, затем входной поток не находит файлов, но по-прежнему записывает пустое заполненное сообщение: один блок из 8 байтов.

Вы можете перезаписать файлы, зашифровав куски открытого текста, но вы должны используйте для этого файлы с отображением в памяти, указанные в NIO2 framework Java. Существуют учебные пособия по использованию файлов, отображаемых в память. Используя потоковую передачу, вам придется либо переписать файл, либо добавить к нему, что ни к чему не поможет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...