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

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

I сделали некоторые исследования, и многие люди рекомендуют DES.

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

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

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

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

10 ответов


попробовать это... Его довольно просто

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

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


вы можете использовать простой шифр Цезаря (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 имеет собственные решения для шифрования, и когда дело доходит до паролей, гораздо лучше просто хэшировать их и сравнивать хэши, поскольку обычно нет необходимости их расшифровывать.


очень основным методом было бы xor данные с ключом. Этот метод симметричен, i.e для декодирования можно использовать тот же ключ, что и для кодирования.

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

private void encodeDecode(byte[] bytes, byte key) {
    for(int i=0; i<bytes.length; i++)
        bytes[i] = (byte) (bytes[i]^key);
}

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


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

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

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

этот решение делает ваш проект реальным, и вы можете повторно использовать его, чтобы сдать экзамен вашего будущего крипто модуля :). В противном случае мне нравится решение, предложенное от 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. Если это школьный проект, я действительно не думаю, что вы можете получить более высокую группу, просто используя третью часть libs для завершения зашифрованной работы.

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

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

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

Я не дам вам никакого демо-кода, но вы можете легко найти его в 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);
}

таким образом, вы можете эффективно узнать, изменил ли пользователь текстовый файл с деталями и отобразить сообщение об ошибке, если используется измененная учетная запись. Однако это не мешает пользователю изменять файл, это просто предотвратит использование измененной учетной записи....Думаю, твоему учителю это понравится. Вы также можете сделать: Ф.setReadOnly(); и когда вы запись в файл, f.setWritable (true, true), затем, после закрытия выходного потока, Ф.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();
        }
    }
}