Сгенерировать ключ AES с начальным значением

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

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

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

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

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

Обновить

Я попытался сгенерировать AESKey, передав byte [] моих данных, как показано ниже:

 AESKey key = new AESKey(keyData);

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

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

Обновить

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

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

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


person iOSDev    schedule 14.05.2009    source источник
comment
Вы говорите о конкретной платформе? Ваши теги подразумевают, что вы говорите о встроенной java, но не могли бы вы указать это явно?   -  person Elazar Leibovich    schedule 14.05.2009


Ответы (3)


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

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

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

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

person Stobor    schedule 14.05.2009

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

  1. Выберите генератор случайных чисел; вероятно, в Java есть встроенная функция, которую люди обычно используют.
  2. Инициализируйте (начните) генератор случайных чисел с определенным входным значением (кодовая фраза? Хеш-кодовая фраза? Что-то в этом роде).
  3. Возьмите первые N байта вывода ГСЧ; это ваш ключ шифрования. Пока вы используете одно и то же значение на шаге 2, первые N байта всегда будут одинаковыми.
  4. Выполните повторное заполнение ГСЧ другим значением, предпочтительно случайным (например, в Python вы должны использовать None; это указывает машине выбрать любое случайное начальное число).
person kquinn    schedule 14.05.2009
comment
Есть ли ссылка или URL-адрес для всего этого. На самом деле ваш ответ полезен. Спасибо Бапи - person Deepak; 14.05.2009
comment
Спасибо KQuinn за быстрый ответ - person iOSDev; 14.05.2009
comment
Это делается постоянно. Это называется шифрованием на основе пароля. Алгоритмы получения безопасного ключа определены в PKCS # 5. - person erickson; 15.05.2009

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

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

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

person Anthony Rizk    schedule 14.05.2009