Создать ключ AES с начальным значением - PullRequest
3 голосов
/ 14 мая 2009

Как мне сгенерировать ключ AES со начальным значением, чтобы всякий раз, когда я генерировал ключ с тем же начальным значением, я мог получать тот же ключ AES?

Я хочу создать этот ключ для моего устройства Blackberry Pearl 8100.

Я не могу сгенерировать ключ AES с помощью AESKey (keyData).

Кроме того, всякий раз, когда я печатаю его в виде строки или байта [], я не могу его сгенерировать (распечатать). Фактический ключ никогда не печатается.

Что можно сделать, чтобы получить ключ?

Обновление

Я попытался сгенерировать AESKey, передав байт [] моих данных, следующим образом:

 AESKey key = new AESKey(keyData);

Каждый раз, когда я получаю один и тот же ключ, это правильно.

Теперь, используя этот ключ, я шифрую данные. Каждый раз, когда я шифрую, я получаю другое значение шифрования. Здесь моя проблема. Как я могу получать одни и те же данные каждый раз после шифрования, чтобы отправлять их на сервер?

Обновление

Я не могу сгенерировать ключ AES с помощью AESKey (keyData).

Кроме того, всякий раз, когда я печатаю его в виде строки или байта [], я не могу его сгенерировать (распечатать). Фактический ключ никогда не печатается.

Что можно сделать, чтобы получить ключ?

Ответы [ 3 ]

7 голосов
/ 14 мая 2009

Раздел 5.2 в RFC 2898 описывает один из способов сделать это.

В частности, «начальное» значение состоит из «PASSPHRASE» и «SALT»; но с учетом одной и той же парольной фразы и соли всегда будет получаться один и тот же ключ.

http://anandam.name/pbkdf2/ - это реализация javascript.

http://en.wikipedia.org/wiki/PBKDF2 содержит дополнительную информацию и ссылки на другие реализации.

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

Мне нужно немного больше информации, так что это предположение.

Как вы используете свой AESKey? Если вы делаете что-то с использованием CBC Encryption (то есть с помощью net.rim.device.api.crypto.CBCEncryptorEngine), то ваш вектор инициализации должен быть одинаковым для каждого вызова. Используйте конструктор для CBCEncryptorEngine, который принимает InitializationVector, а также BlockEncryptorEngine.

Статья в Википедии с дополнительной информацией о том, почему это так.

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

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

  1. Выберите генератор случайных чисел; возможно, в Java есть тот, который обычно используют люди.
  2. Инициализировать (заполнить) генератор случайных чисел конкретным входным значением (пароль-пароль? Хэш-пароль - что-то в этом роде).
  3. Возьмите первые N байты вывода ГСЧ; это ваш ключ шифрования. До тех пор, пока вы начнете использовать одно и то же значение на шаге 2, первые сгенерированные байты N всегда будут одинаковыми.
  4. Переустановите ГСЧ с другим значением, предпочтительно случайным (например, в Python вы можете начать с None; это говорит машине выбрать любое случайное начальное значение).
...