Я уже прочитал Использование Java для шифрования целых чисел и Шифрование с помощью DES с использованием фразы-пароля .
Все, что мне нужно, - это простой Encrypter, который преобразует 12-значное число в 12-значное число со следующими ограничениями:
- Шифрование должно зависеть от пароля (который будет постоянным в течение всего времени жизни приложения) и ничего больше.
- Отображение должно быть 1-1 (без хеширования и нескольких входов, дающих одинаковый выход и наоборот).
- Сопоставление не должно изменяться между разными виртуальными машинами или при запуске виртуальной машины (например, при перезапуске Java утилита должна выдавать вам те же сопоставления, что означает, что она должна зависеть только от предоставленного пароля).
- Числа, начинающиеся с 0, не являются действительными 12-значными числами (также вводимые числа не начинаются с 0).
- Ключ / пароль никогда не должен быть угадываемым. Например, запуск утилиты с несколькими входами и анализ выходов не должен позволять угадывать ключ / pwd / hash или что-либо еще.
- Все входные данные будут состоять ровно из 12 цифр и состоят из 12-значного простого числа (что означает, что мы можем использовать арифметику по модулю).
Пролистав литературу, у меня есть этот код
public void mytestSimple(long code, String password) throws Exception {
SecretKey key = new SecretKeySpec(password.getBytes(), "DES");
Cipher ecipher = Cipher.getInstance("DES");
ecipher.init(Cipher.ENCRYPT_MODE, key);
System.out.println(ecipher.getOutputSize(8));
byte[] encrypted = ecipher.doFinal(numberToBytes(code));
System.out.println(encrypted + "--" + encrypted.length);
Cipher dcipher = Cipher.getInstance("DES");
dcipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = dcipher.doFinal(encrypted);
System.out.println(bytesToNumber(decrypted) + "--" + decrypted.length);
}
public void testSimple() throws Exception {
mytestSimple(981762654986L, "password");
}
У меня проблемы с
- Как преобразовать 16 байтов в 12-значное число.
- Поддерживать отображение 1-1.
- Сохраняйте одинаковое шифрование / дешифрование при нескольких вызовах виртуальных машин.
**** Ответ, добавленный мной ниже ****
Я добавил один ответ - 40-битный RSA, извлеченный из стандартной логики пар ключей Java RSA. Я все еще должен работать на крайних случаях. Я собираюсь принять ответ и сказать «Тадмас», который, как мне кажется, приведет меня к ответу. Может кто-нибудь сказать мне, будет ли мой алгоритм слабым / уязвимым?