Простое шифрование Java
Я хотел бы зашифровать текстовый (конфигурационный) файл, хранящийся на диске.
Попытка использовать DES шифрование У меня была фатальная ошибка на клиентских машинах, позже я обнаружил, что алгоритм не справляется с акцентированными символами (!)
Я подозреваю, что это потому, что я использовал старые пакеты (sun.misc.BASE64Decoder
), но я не уверен, что это причина.
Однако я ищу более простое решение - мне нужно очень простое шифрование (я знаю, что некоторые люди не согласятся на это) - не RSA из 128-битных ключей или так, просто затеняя текст из любопытных глаз.
Действительно странно, что я не мог найти простого тривиального решения в Интернете.
Как я могу реализовать простую схему шифрования?
Ответы
Ответ 1
Ознакомьтесь с упрощенным шифрованием Java (Jasypt).
Jasypt - это Java-библиотека, которая позволяет разработчик добавит базовое шифрование возможности для его/ее проектов с минимальные усилия и без необходимости наличия глубоких знаний о том, как криптографические работы.
- Высокозащищенные, основанные на стандартах методы шифрования, как для однонаправленный и двунаправленный шифрование. Шифровать пароли, тексты, числа, двоичные файлы...
- Прозрачная интеграция с Hibernate.
- Подходит для интеграции в приложения на основе Spring, а также прозрачно интегрируемый с ACEGI (Spring Безопасность).
- Интегрированные возможности для шифрования конфигурации приложений (т.е. источников данных).
- Откройте API для использования с любым поставщиком JCE.
- ... и многое другое
Ответ 2
Я использую этот простой алгоритм One-Time-Pad:
import org.apache.commons.codec.binary.Base64;
public class Cipher {
private static final String KEY = "some-secret-key-of-your-choice";
public String encrypt(final String text) {
return Base64.encodeBase64String(this.xor(text.getBytes()));
}
public String decrypt(final String hash) {
try {
return new String(this.xor(Base64.decodeBase64(hash.getBytes())), "UTF-8");
} catch (java.io.UnsupportedEncodingException ex) {
throw new IllegalStateException(ex);
}
}
private byte[] xor(final byte[] input) {
final byte[] output = new byte[input.length];
final byte[] secret = this.KEY.getBytes();
int spos = 0;
for (int pos = 0; pos < input.length; ++pos) {
output[pos] = (byte) (input[pos] ^ secret[spos]);
spos += 1;
if (spos >= secret.length) {
spos = 0;
}
}
return output;
}
Не забудьте добавить commons-codec
в путь к классам.
Ответ 3
Алгоритмы шифрования работают с необработанными байтами, а не с символами.
Причина, по которой вы не могли обрабатывать символы с акцентом, заключалась в том, что код, который вы использовали для преобразования символов в и из необработанных байтов, не обрабатывал Юникод.
Вы должны использовать AES; для примера того, как использовать его в Java, см. здесь.
РЕДАКТИРОВАТЬ. Прямо сейчас вы можете просто скрывать его от любопытных глаз, но не знаете, что будет в будущем, и лучше использовать сильное шифрование сейчас, а не узнать, до конца, что вы должны были, но не сделали.
Ответ 4
Как насчет ROT13? Это, вероятно, самое простое и худшее шифрование (он также назывался Caeser Cipher)
Вот базовая реализация Java на Jay Kominek:
import java.io.*;
public class rot13 {
public static void main (String args[]) {
int abyte = 0;
try { while((abyte = System.in.read())>=0) {
int cap = abyte & 32;
abyte &= ~cap;
abyte = ((abyte >= 'A') && (abyte <= 'Z') ? ((abyte - 'A' + 13) % 26 + 'A') : abyte) | cap;
System.out.print(String.valueOf((char)abyte));
} } catch (IOException e) { }
System.out.flush();
}
}
Ответ 5
Если вы не хотите действительно шифровать текст, почему бы не кодировать Base64? Это будет выглядеть бессмыслицей, и это очень легко расшифровать. Кроме того, вы уже используете код Base64...
Ответ 6
Если у вас есть один фрагмент текста для шифрования, как насчет одноразового ввода? Одноразовый блок очень легко создать; все, что вам нужно, это случайная последовательность байтов такой же длины, как и данные, которые вы шифруете
Ответ 7
См. Как использовать шифрование/дешифрование 3des в Java? BASE64Encoder
используется для представления зашифрованного массива байтов, а не фактического ввода.