Как я могу зашифровать / расшифровать 12-значные десятичные числа для других, используя пароль и Java? - PullRequest
1 голос
/ 13 мая 2009

Я уже прочитал Использование Java для шифрования целых чисел и Шифрование с помощью DES с использованием фразы-пароля .

Все, что мне нужно, - это простой Encrypter, который преобразует 12-значное число в 12-значное число со следующими ограничениями:

  1. Шифрование должно зависеть от пароля (который будет постоянным в течение всего времени жизни приложения) и ничего больше.
  2. Отображение должно быть 1-1 (без хеширования и нескольких входов, дающих одинаковый выход и наоборот).
  3. Сопоставление не должно изменяться между разными виртуальными машинами или при запуске виртуальной машины (например, при перезапуске Java утилита должна выдавать вам те же сопоставления, что означает, что она должна зависеть только от предоставленного пароля).
  4. Числа, начинающиеся с 0, не являются действительными 12-значными числами (также вводимые числа не начинаются с 0).
  5. Ключ / пароль никогда не должен быть угадываемым. Например, запуск утилиты с несколькими входами и анализ выходов не должен позволять угадывать ключ / pwd / hash или что-либо еще.
  6. Все входные данные будут состоять ровно из 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");
}

У меня проблемы с

  1. Как преобразовать 16 байтов в 12-значное число.
  2. Поддерживать отображение 1-1.
  3. Сохраняйте одинаковое шифрование / дешифрование при нескольких вызовах виртуальных машин.

**** Ответ, добавленный мной ниже ****

Я добавил один ответ - 40-битный RSA, извлеченный из стандартной логики пар ключей Java RSA. Я все еще должен работать на крайних случаях. Я собираюсь принять ответ и сказать «Тадмас», который, как мне кажется, приведет меня к ответу. Может кто-нибудь сказать мне, будет ли мой алгоритм слабым / уязвимым?

Ответы [ 12 ]

0 голосов
/ 13 мая 2009

Если я правильно понимаю вашу проблему, у вас есть проблема с 16 байтами после расшифровки. Хитрость заключается в использовании: Cipher.getInstance ("DES / ECB / PKCS5Padding");

(на всякий случай, если код полезен):

public void mytestSimple(long code, String password) throws Exception 
       { SecretKey key       = new SecretKeySpec (password.getBytes(),"DES");
         Cipher    ecipher   = Cipher.getInstance("DES/ECB/PKCS5Padding");
         byte[]    plaintext = new byte[8];

         for (int i=0; i<8; i++)
             { plaintext[7-i] = (byte) (code & 0x00FF);
                >>>= 8;
             }

         ecipher.init      (Cipher.ENCRYPT_MODE, key);
         System.out.println(ecipher.getOutputSize(8));

         byte[] encrypted = ecipher.doFinal(plaintext);
         System.out.println("--" + encrypted.length);

         Cipher dcipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
         dcipher.init(Cipher.DECRYPT_MODE, key);

         byte[] crypttext = dcipher.doFinal(encrypted);
         long   decoded    = 0;

         for (int i=0; i<8; i++)
             { decoded <<= 8;
               decoded  += crypttext[i] & 0x00FF;
             }

         System.out.println(decode + "--" + crypttext.length);
       }
0 голосов
/ 13 мая 2009

По математическим причинам большинство шифров будет генерировать «больше» байтов (то есть они будут дополнять ввод). Поэтому вам придется признать, что код генерирует 16 байтов из вашего 12-значного числа.

Когда строка декодируется, вы получите 12-значный номер обратно, но во время транспортировки вам потребуется 16 байтов.

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