Сгенерировать ключи SecretKeySpec в указанном диапазоне

Мне нужно сгенерировать SecretKeySpec в Java в указанном диапазоне. например. Мне нужны все 16-битные ключи. Поскольку мне нужны ключи для DES, длина ключа должна быть 8 байт. Это означает, что старшие 6 байтов равны 0, а младшие два байта хранят числа от 1 до 2^16 -1. В последний час я много читал о битах, байтах и ​​шестнадцатеричных числах, и я действительно запутался во всем этом. Конструктор SecretKeySpec, который я хотел бы использовать, это:

 public SecretKeySpec(byte[] key,
             String algorithm)

Этот конструктор ожидает массив байтов в качестве ключа. Я хотел создать эти массивы размером 2 ^ 16 -1 байт, чтобы заполнить два младших байта соответствующими числами. например.

  • Ключ 0: ключ [7] = 0, ключ [6] = 0 ..., ключ [0] = 0;
  • Ключ 1: ключ [7] = 0, ключ [6] = 0 ..., ключ [1] = 0, ключ [0] = 1;

Я бы использовал циклы для заполнения массивов байтов. Могу ли я так справиться с этой проблемой?


person Hansi Zimmrer    schedule 09.12.2013    source источник


Ответы (1)


Массивы байтов по умолчанию имеют содержимое с нулевым значением. Итак, вы можете просто сделать:

byte[] myVeryWeakKey = new byte[8];
byte[6] = // whatever
byte[7] = //whatever

Или, может быть, вы хотите случайным образом назначить эти последние два байта?

byte[] keybits = new byte[2];
Random r = new Random();
r.nextBytes(keybits);

System.arraycopy(keybits, 0, myVeryWeakKey, 6, 2);

Я надеюсь, само собой разумеется, что эти ключи будут жалко слабыми. Настолько слабо, что вам вообще не нужно беспокоиться о каком-либо шифровании. (Именно поэтому я даже не удосужился предложить SecureRandom).

Если вам нужно создать все возможные значения, будет работать что-то вроде следующего:

List<byte[]> keys = new ArrayList<>();

for (int b = -128; b <= 127; b++) {
  for (int c = -128; c <= 127; c++) {
    byte[] newValue = new byte[8];
    newValue[6] = (byte) b;
    newValue[7] = (byte) c;
    keys.add(newValue);
  } 
}
person Duncan Jones    schedule 09.12.2013
comment
Спасибо за Ваш ответ. Этот код будет работать вечно, так как второй цикл является бесконечным циклом. Когда c достигает значения 127, оно будет увеличиваться после тела цикла, в результате чего c=-128. В любом случае спасибо, это поправимо - person Hansi Zimmrer; 09.12.2013
comment
@ user3005306 Да, хорошее место. Я исправил свой пример выше. - person Duncan Jones; 10.12.2013