Как зашифровать / расшифровать строку с другой строкой в ​​качестве пароля? - PullRequest
6 голосов
/ 14 октября 2011

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

Прямо сейчас я беру струну. Разделите его на массив символов, затем сделайте то же самое для пароля. После этого я беру пароль, преобразую все эти символы в целые, нахожу среднее значение для всех из них и использую его как смещение символов в исходном тексте. Вроде как:

textChars[1]= (char)((int)textChars[1]+offset);

Тогда я могу сделать обратное для зашифрованной строки:

encryptedChars[1]= (char)((int)encryptedChars[1]-offset);

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

Я посмотрел на криптографическую библиотеку в стандартном Java API, но меня смущает вопрос о том, как работает ключ, если он генерируется случайным образом при каждом запуске программы.

Что мне нужно, так это две функции, которые выглядят как String encrypt(String text,String Password), который выплевывает текст, зашифрованный паролем, в качестве ключа для его расшифровки, и String decrypt(String encryptedText, String Password), который выплевывает исходный текст (или тарабарщину, если пароль нежелательный). )

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

Ответы [ 2 ]

11 голосов
/ 14 октября 2011

Вы пытаетесь заново изобрести колесо. Если вы не делаете это для развлечения, я бы рекомендовал использовать что-то вроде AES . Если вы просто гуглите «AES in java», вы найдете несколько примеров.

Если вы делаете это для развлечения и хотите что-то простое в реализации, взгляните также на ROT13 .

Вот пример для AES в Java:

private static final String ALGORITHM = "AES";
private static final byte[] keyValue = 
    new byte[] { 'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y' };

 public String encrypt(String valueToEnc) throws Exception {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    String encryptedValue = new BASE64Encoder().encode(encValue);
    return encryptedValue;
}

public String decrypt(String encryptedValue) throws Exception {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}

private static Key generateKey() throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    return key;
}

Возможно, вы захотите улучшить этот код.

6 голосов
/ 14 октября 2011

Что вам действительно нужно, так это симметричная криптография, то есть алгоритм использует один и тот же ключ для шифрования и дешифрования данных. Существует множество доступных алгоритмов, поддерживающих симметричную криптографию, таких как DES, AES.

Посмотрите на этот пример: http://www.java2s.com/Code/Java/Security/EncryptionanddecryptionwithAESECBPKCS7Padding.htm

В приведенном выше примере заменить

byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
    0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };

с

byte[] keyBytes = yourPassword.getBytes();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...