Самый простой способ шифрования текстового файла в java
Для моего школьного проекта мне пришлось показать, что я могу использовать обработку файлов в рамках программы. Для этого я сделал очень простой процесс входа в систему, чтобы вы могли создать учетную запись, которая записывает имя пользователя и пароль в текстовый файл, расположенный в папке ресурса. Очевидно, что у этого нет никакой безопасности, поскольку он не был предназначен для обеспечения безопасности только для демонстрации обработки файлов, однако мой учитель сказал, что я должен попытаться добавить некоторое шифрование в файл, чтобы получить более качественный уровень.
Я провел некоторое исследование, и многие люди рекомендуют DES.
Проблема, с которой я столкнулась, у меня не так много времени для моего проекта и нужно закончить ее как можно скорее. Использование DES кажется, что потребуется некоторое время, чтобы реализовать весь дополнительный код.
В моей программе я использую простой метод lineNumberReader для чтения файлов по строкам. Для записи в файлы я использую BufferedWriter.
Нужно ли вообще шифровать эти данные? Он не должен быть очень безопасным, но мне нужно показать, что я по крайней мере пытался зашифровать данные. Шифрование и дешифрование будут завершены в том же приложении, что и данные не передаются.
Потенциально способ я могу создать очень простой алгоритм шифрования и дешифрования?
Ответы
Ответ 1
Попробуйте это,... Его довольно простой
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");
}
}
}
Таким образом, в основном перед записью в файл вы будете шифровать и после прочтения вам нужно будет расшифровать его.
Ответ 2
Вы можете использовать простой шифр 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 имеет встроенные решения для шифрования, и когда дело доходит до паролей, гораздо лучше просто хешировать их и сравнивать хэши, так как обычно их не нужно расшифровывать.
Ответ 3
используйте простой алгоритм шифрования субтитров, измените каждый символ на число или другой символ.
- получить каждый символ вашей строки.
- получить значение ascii строки.
- добавить значение ascii с определенным целым числом (это будет ваш ключ шифрования)
- отобразить результат
Ответ 4
Самый простой метод - это сопоставление данных с ключом. Этот метод является симметричным, то есть вы можете использовать тот же ключ для декодирования, что и для кодирования.
Если мы выберем 1-байтовый ключ, это будет хорошо и просто, достаточно, чтобы сделать его нечитаемым (но совсем не безопасным!):
private void encodeDecode(byte[] bytes, byte key) {
for(int i=0; i<bytes.length; i++)
bytes[i] = (byte) (bytes[i]^key);
}
Ответ 5
Легким и забавным алгоритмом скремблирования будет преобразование Burrows-Wheeler. Не совсем безопасное шифрование, но серьезно, это школьная работа, и это потрясающе.
Ответ 6
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 ) );
}
}
Ответ 7
Я не знаю, кто рекомендует DES для шифрования пароля.
Я предлагаю вам выполнить этот шаг, если вы хотите произвести впечатление на своего учителя:
Это решение делает ваш проект реальным, и вы можете его повторно использовать, чтобы сдать экзамен вашего будущего Crypto Module:). В противном случае мне нравится решение, предложенное StanislavL.
Наслаждайтесь!
Ответ 8
Слишком много способов зашифрованной простой строки в Java. Если это школьный проект, я действительно не думаю, что вы можете получить более высокую группу, просто используя некоторые библиотеки третьей части, чтобы закончить зашифрованную работу.
Если у вас есть время, вы можете попытаться понять, как работает Base64, а затем попытаться создать какой-то зашифрованный алгоритм самостоятельно.
Как бы то ни было, если вы настаиваете на использовании какого-либо API в Java, я должен сказать, что DES действительно старый способ зашифрованного текста, 3DEs (DESede) или AES будет лучше и безопаснее, оба из них уже поддерживаются с тех пор Java6.
Если вам нужно импортировать BouncyCastle lib, я предпочитаю IDEA, это один из самых безопасных алгоритмов, возможно, вы достигли хорошего результата.
Я не дам вам никакого демонстрационного кода, но вы можете легко найти некоторые из них по всему алгоритму, о котором я упомянул.
Ответ 9
Вы можете использовать эти функции для шифрования и дешифрования простого текста
//Encrypt simple text
public String EncryptSimpleText (String text2Encrypt) throws Exception {
byte[] encryptArray = Base64.getEncoder().encode(text2Encrypt.getBytes());
return new String(encryptArray,"UTF-8");
}
//Decrypt simple text
public String Decrypt2SimpleText(String textEncrypted) throws Exception {
byte[] dectryptArray = textEncrypted.getBytes();
byte[] decarray = Base64.getDecoder().decode(dectryptArray);
return new String(decarray,"UTF-8");
}
Ответ 10
Мое предложение: вообще не использовать шифрование. Здесь что-то лучше: (надеюсь)
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), то после закрытия выходного потока f.setReadOnly(); снова... Но файл все равно можно заменить, поэтому 1-й и более эффективен. благодаря
Ответ 11
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();
}
}
}