Самый простой способ шифрования текстового файла в java

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

Я провел некоторое исследование, и многие рекомендуют DES.

Проблема, с которой я сталкиваюсь, у меня мало времени для моего проекта и нужно закончить ее как можно скорее. Использование DES кажется, что потребуется некоторое время, чтобы реализовать весь дополнительный код.

В моей программе я использую простой lineNumberReader для чтения файлов по строкам. Для записи в файлы я использую BufferedWriter.

Нужно ли так просто шифровать эти данные? Он не должен быть очень безопасным, но мне нужно показать, что я по крайней мере пытался зашифровать данные. Шифрование и дешифрование будут завершены в том же приложении, что и данные не передаются.

Потенциально способ я могу создать очень простой алгоритм шифрования и дешифрования?

Попробуйте это … Его довольно простой

import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class HelloWorld{ public static void main(String[] args) { try{ KeyGenerator keygenerator = KeyGenerator.getInstance("DES"); SecretKey myDesKey = keygenerator.generateKey(); Cipher desCipher; desCipher = Cipher.getInstance("DES"); byte[] text = "No body can see me.".getBytes("UTF8"); desCipher.init(Cipher.ENCRYPT_MODE, myDesKey); byte[] textEncrypted = desCipher.doFinal(text); String s = new String(textEncrypted); System.out.println(s); desCipher.init(Cipher.DECRYPT_MODE, myDesKey); byte[] textDecrypted = desCipher.doFinal(textEncrypted); s = new String(textDecrypted); System.out.println(s); }catch(Exception e) { System.out.println("Exception"); } } } 

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

Вы можете использовать простой шифр ceasar ( http://en.wikipedia.org/wiki/Caesar_cipher )

 public class Cipher { public static void main(String[] args) { String str = "The quick brown fox Jumped over the lazy Dog"; System.out.println( Cipher.encode( str, 12 )); System.out.println( Cipher.decode( Cipher.encode( str, 12), 12 )); } public static String decode(String enc, int offset) { return encode(enc, 26-offset); } public static String encode(String enc, int offset) { offset = offset % 26 + 26; StringBuilder encoded = new StringBuilder(); for (char i : enc.toCharArray()) { if (Character.isLetter(i)) { if (Character.isUpperCase(i)) { encoded.append((char) ('A' + (i - 'A' + offset) % 26 )); } else { encoded.append((char) ('a' + (i - 'a' + offset) % 26 )); } } else { encoded.append(i); } } return encoded.toString(); } } 

Найдено по адресу: http://rosettacode.org/wiki/Caesar_cipher#Java

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

Самый простой метод – это синхронизировать данные с ключом. Этот метод является симметричным, т. Е. Вы можете использовать тот же ключ для декодирования, что и для кодирования.

Если мы выберем 1-байтовый ключ, это красиво и просто, достаточно, чтобы сделать его нечитаемым (но совсем не безопасным!):

 private void encodeDecode(byte[] bytes, byte key) { for(int i=0; i 

Легким и забавным алгоритмом скремблирования было бы преобразование Берроуза-Уилера . Не совсем безопасное шифрование, но серьезно, это школьная работа, и это потрясающе.

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

  1. получите каждый символ вашей строки.
  2. получите значение ascii строки.
  3. добавьте значение ascii с определенным целым числом (это будет ваш ключ шифрования)
  4. отобразить результат

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

  • цитируйте свою рекомендацию в качестве теоретической поддержки вашего криптографического решения. Я предлагаю вам этот OWSAP – Cheat Sheet
  • объясните, где ваш код соответствует спецификации. Для хорошего учебника с образцом кода я предлагаю вам этот безопасный hash пароля

Это решение делает ваш проект реальным, и вы можете его повторно использовать, чтобы сдать экзамен вашего будущего Crypto Module :). В противном случае мне нравится решение, предложенное StanislavL.

Наслаждайтесь!

Bouncy Castle Crypto API – это легкий криптографический API на Java.

  import org.bouncycastle.crypto.*; import org.bouncycastle.crypto.engines.*; import org.bouncycastle.crypto.modes.*; import org.bouncycastle.crypto.params.*; // A simple example that uses the Bouncy Castle // lightweight cryptography API to perform DES // encryption of arbitrary data. public class Encryptor { private BufferedBlockCipher cipher; private KeyParameter key; // Initialize the cryptographic engine. // The key array should be at least 8 bytes long. public Encryptor( byte[] key ){ /* cipher = new PaddedBlockCipher( new CBCBlockCipher(new DESEngine())); */ cipher = new PaddedBlockCipher( new CBCBlockCipher(new BlowfishEngine())); this.key = new KeyParameter( key ); } // Initialize the cryptographic engine. // The string should be at least 8 chars long. public Encryptor( String key ){ this( key.getBytes()); } // Private routine that does the gritty work. private byte[] callCipher( byte[] data ) throws CryptoException { int size = cipher.getOutputSize( data.length ); byte[] result = new byte[ size ]; int olen = cipher.processBytes(data,0,data.length result, 0); olen += cipher.doFinal( result, olen ); if( olen < size ){ byte[] tmp = new byte[ olen ]; System.arraycopy( result, 0, tmp, 0, olen ); result = tmp; } return result; } // Encrypt arbitrary byte array, returning the // encrypted data in a different byte array. public synchronized byte[] encrypt( byte[] data ) throws CryptoException { if( data == null || data.length == 0 ){ return new byte[0]; } cipher.init( true, key ); return callCipher( data ); } // Encrypts a string. public byte[] encryptString( String data ) throws CryptoException { if( data == null || data.length() == 0 ){ return new byte[0]; } return encrypt( data.getBytes() ); } // Decrypts arbitrary data. public synchronized byte[] decrypt( byte[] data ) throws CryptoException { if( data == null || data.length == 0 ){ return new byte[0]; } cipher.init( false, key ); return callCipher( data ); } // Decrypts a string that was previously encoded // using encryptString. public String decryptString( byte[] data ) throws CryptoException { if( data == null || data.length == 0 ){ return ""; } return new String( decrypt( data ) ); } } 

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

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

Как бы то ни было, если вы настаиваете на использовании какого-либо API в Java, я должен сказать, что DES действительно старый способ зашифрованного текста, 3DEs (DESede) или AES будет лучше и безопаснее, оба из них уже поддерживаются с Java6.

Если вам нужно импортировать BouncyCastle lib, я предпочитаю IDEA, это один из самых безопасных алгоритмов, возможно, вы достигли хорошего результата.

Я не дам вам никакого демонстрационного кода, но вы можете легко найти какой-нибудь из Google весь алгоритм, о котором я упомянул.

Мое предложение: вообще не использовать шифрование. Вот что-то лучше: (надеюсь)

 Scanner sc=new Scanner(System.in); String name=sc.next(); //for inputting user name File f= new File("d://"+name+".txt"); if(f.exists()) { if(f.lastModified()!=0) { System.out.println("Account data tampered...cannot be accessed"); } else{ String data=""; System.out.println(data); //data should contain //data from file read using BufferedReader f.setLastModified(0); } } else { f.createNewFile();//Write whatever you want to to the file f.setLastModified(0); } 

Таким образом, вы можете эффективно узнать, вмешался ли пользователь в текстовый файл с подробной информацией и отобразил сообщение об ошибке, если используется измененная учетная запись. Однако это не мешает пользователю изменять файл, он просто предотвратит использование измененной учетной записи … Я думаю, что вашему компьютеру может понравиться это. Вы также можете сделать: f.setReadOnly (); и когда вы пишете файл, f.setWritable (true, true), то после закрытия выходного streamа f.setReadOnly (); снова … Но файл все равно можно заменить, поэтому 1-й и более эффективен. благодаря

 public class CryptoUtils { public static void encrypt(String key, File inputFile, File outputFile) throws CryptoException { doCrypto(Cipher.ENCRYPT_MODE, key, inputFile, outputFile); } public static void decrypt(String key, File inputFile, File outputFile) throws CryptoException { doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile); } private static void doCrypto(int cipherMode, String key, File inputFile, File outputFile) throws CryptoException { try { Key secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(cipherMode, secretKey); FileInputStream inputStream = new FileInputStream(inputFile); byte[] inputBytes = new byte[(int) inputFile.length()]; inputStream.read(inputBytes); byte[] outputBytes = cipher.doFinal(inputBytes); FileOutputStream outputStream = new FileOutputStream(outputFile); outputStream.write(outputBytes); inputStream.close(); outputStream.close(); } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | IOException ex) { throw new CryptoException("Error encrypting/decrypting file", ex); } } } 

 package net.codejava.crypto; import java.io.File; public class CryptoException extends Exception { public CryptoException() { } public CryptoException(String message, Throwable throwable) { super(message, throwable); } public static void main(String[] args) { String key = "Mary has one cat1"; File inputFile = new File("document.txt"); File encryptedFile = new File("document.encrypted"); File decryptedFile = new File("document.decrypted"); try { CryptoUtils.encrypt(key, inputFile, encryptedFile); CryptoUtils.decrypt(key, encryptedFile, decryptedFile); } catch (CryptoException ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); } } } 
  • Шифрование настроек приложения в web.config
  • Почему при использовании функции Non-Random IV с режимом CBC существует уязвимость?
  • Шифрование файлов cookie в ASP.NET
  • Безопасность сообщений WCF без сертификата и windows auth
  • Как защитить общие настройки Android?
  • Interesting Posts

    Как найти тип «Рам» в командной строке?

    Почему мы возвращаем возвращаемое значение malloc?

    Как проверить, закрыто ли соединение TcpClient?

    Команды, выполненные из vim, не распознают псевдонимы команды bash

    CORS с пружинным ботинком и угловыми манипуляторами не работают

    Перенаправить URL-адреса в Chrome?

    Виртуальные таблицы и макет памяти в нескольких виртуальных наследования

    Как открыть программу электронной почты через Intents (но только программу электронной почты)

    Можете ли вы настроить log4net в коде вместо использования файла конфигурации?

    Как я могу сделать AllocateHwnd streamобезопасными?

    Почему отсутствующая аннотация не вызывает исключение ClassNotFoundException во время выполнения?

    Снимок экрана Android с экрана Surface View показывает черный экран

    Gson: Непосредственно конвертировать String в JsonObject (без POJO)

    Предотrotation атаки CSRF, XSS и SQL Injection в JSF

    html5 новых элементов (заголовок, nav, footer, ..) не работает в IE

    Давайте будем гением компьютера.