2009-05-14 2 views
3

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

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

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

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

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

Update

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

AESKey key = new AESKey(keyData); 

Everytime я получаю тот же ключ, что является правильным.

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

Update

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

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

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

+0

Вы говорите о конкретной платформе? В ваших тегах подразумевается, что вы говорите о встроенной java, но можете ли вы указать это явно? –

ответ

0

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

  1. Выберите генератор случайных чисел; вероятно, у Java есть встроенный, который обычно используют люди.
  2. Инициализировать генератор случайных чисел с помощью определенного входного значения (кодовая фраза «хэш» парольной фразы?).
  3. Возьмите первые N байты вывода RNG; это ваш ключ шифрования. Пока вы используете семя с тем же значением на шаге 2, первые созданные N байты всегда будут одинаковыми.
  4. Reseed the RNG с другим значением, предпочтительно случайным (например, в Python, который вы заселили, например, None, что указывает машине выбрать любое случайное семя).
+0

Есть ли какие-либо ссылки или URL-адреса для достижения всего этого. Действительно ваш ответ полезен. Спасибо Bapi – Deepak

+0

Спасибо KQuinn за ваш быстрый ответ – iOSDev

+1

Все делается постоянно. Его называют шифрованием на основе пароля. В PKCS # 5 определены алгоритмы деривации ключей. – erickson

7

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

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

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

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

+0

Спасибо Stobor за ответ – iOSDev

0

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

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

Wikipedia article с дополнительной информацией о том, почему это так.

Смежные вопросы