Простое шифрование Java

Я хочу зашифровать текстовый (конфигурационный) файл, хранящийся на диске. При попытке использовать шифрование DES у меня была фатальная ошибка на клиентских машинах, позже я узнал алгоритм не мог обрабатывать символы с диакритическими знаками (!) Я подозреваю, что это было из-за того, что я использовал старые пакеты (sun.misc.BASE64Decoder), но я не уверен, что это причина.

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

Это действительно странно, что я не смог найти простое тривиальное решение в сети.

Как я могу реализовать простую схему шифрования?


person Community    schedule 30.08.2009    source источник
comment
Шифр XOR stackoverflow.com/questions/2029426/what-is-xor- шифрование   -  person kreker    schedule 04.10.2018


Ответы (7)


Ознакомьтесь с упрощенным шифрованием Java (Jasypt).

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

  • Методы высоконадежного шифрования, основанные на стандартах, как для однонаправленного, так и для двунаправленного шифрования. Шифровать пароли, тексты, числа, двоичные файлы ...
  • Прозрачная интеграция с Hibernate.
  • Подходит для интеграции в приложения на основе Spring, а также прозрачно интегрируется с ACEGI (Spring Security).
  • Интегрированные возможности для шифрования конфигурации приложений (т.е. источников данных).
  • Открытый API для использования с любым поставщиком JCE.
  • ...и многое другое
person Mads Hansen    schedule 30.08.2009
comment
Jasypt зависит от поставщиков безопасности, которые будут встроены в JDK. Это не отдельная библиотека, а просто оболочка для JDK. - person yegor256; 06.12.2011

Я использую этот простой алгоритм 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 в путь к классам.

person yegor256    schedule 12.02.2012

Алгоритмы шифрования работают с необработанными байтами, а не с символами.

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

Вам следует использовать AES; пример того, как использовать его в Java, см. здесь.

РЕДАКТИРОВАТЬ: прямо сейчас вы можете просто скрывать это от любопытных глаз, но неизвестно, что нас ждет в будущем, и всегда гораздо лучше использовать надежное шифрование прямо сейчас. и так поздно не узнаешь, что ты должен был, но не сделал этого.

person SLaks    schedule 30.08.2009

Как насчет ROT13? Вероятно, это самое простое и худшее шифрование из когда-либо существовавших (его также называли шифром Цезаря).

Вот базовая реализация Джея Коминека на Java:

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();
  }
}
person rogeriopvl    schedule 30.08.2009
comment
Это также не может обрабатывать символы с диакритическими знаками. - person SLaks; 31.08.2009
comment
Я не думаю, что ROT13 действительно определен для акцентированных символов. Также приятно видеть, что кто-то извлекает пользу из моего старого кода. :) - person Jay Kominek; 13.11.2009

Если вы не хотите по-настоящему зашифровать текст, почему бы не кодировать с помощью Base64? Это будет выглядеть чушью, и ее очень легко расшифровать. Кроме того, вы уже используете код Base64 ...

person Yuval    schedule 30.08.2009
comment
Это хорошая идея, я собирался просто добавить 1 ко всем байтам, а затем вычесть 1, когда вы захотите это прочитать. Но кодировка Base64 звучит еще лучше, можно просто использовать: org.apache.commons.codec.binary.Base64 - person Chris Dutrow; 22.06.2010

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

person oxbow_lakes    schedule 30.08.2009

См. Как использовать шифрование / дешифрование 3des в Java? BASE64Encoder используется для представления зашифрованного массива байтов, а не фактического ввода.

person Eugene Yokota    schedule 30.08.2009