Как использовать scrypt для создания 256-битного ключа?

Я использую scrypt для получения ключа, но проблема в том, что вывод больше 256 бит, и я хочу использовать его в AES-GCM с 256-битным ключом. Итак, как я могу это сделать? Пытаюсь сделать приложение на Android.

Редактировать: извините, ребята, за то, что не предоставили вам больше информации. Хорошо.. библиотека, которую я использую, это https://github.com/wg/scrypt

это выход, который я получаю

"$s0$e0801$eX8cPtmLjKSrZBJszHIuZA==$vapd0u4tYVdOXOlcIkFmrOEIr1Ml2Ue1l2+FVOJgbcI="

это больше, чем может выдержать движок AES, так как я могу его использовать


person Ahmad Almorabea    schedule 26.02.2015    source источник
comment
Пожалуйста, покажите нам часть вашего кода, где вы выполняете вывод scrypt.   -  person Duncan Jones    schedule 26.02.2015
comment
Скрипт AFAIK поддерживает выходные данные произвольной длины с помощью последнего шага на основе PBKDF2.   -  person CodesInChaos    schedule 26.02.2015
comment
В дополнение к комментарию Дункана, пожалуйста, также отредактируйте в вопросе библиотеку scrypt, которую вы используете. Проголосовали против, пока нам не будет предоставлено достаточно информации, чтобы ответить на вопрос.   -  person Maarten Bodewes    schedule 26.02.2015
comment
@CodesInChaos Справа: dkLen: предполагаемая длина вывода в октетах производного ключа; положительное целое число, меньшее или равное (2^32 - 1) * hLen, где hLen равно 32. из source, который кажется относительно новым проектом от IETF (интересно, что они предприняли этот шаг спустя столько времени). Таким образом, возникает вопрос: почему вывод больше 256 бит...   -  person Maarten Bodewes    schedule 27.02.2015
comment
Хорошо, я добавил больше деталей .. извините   -  person Ahmad Almorabea    schedule 27.02.2015
comment
Хорошо, теперь мы можем ответить :), поменял отрицательный голос на положительный.   -  person Maarten Bodewes    schedule 28.02.2015


Ответы (1)


Scrypt – это алгоритм создания ключей. Это означает, что вы можете использовать его для генерации произвольного количества псевдослучайных байтов.

В библиотеке wg это можно сделать вызовом Scrypt.scrypt функция:

byte[] key = Scrypt.scrypt(password, salt, N, r, p, 32);

Это даст вам желаемые 32 байта ключевого материала.

Получение ключа против хранения пароля

Ваше замешательство понятно. В документации wg/scrypt не упоминается реальное использование scrypt. Они только документируют его использование в качестве алгоритма хранения паролей.

Вот почему вы по ошибке вызывали ScryptUtil.scrypt (а не Scrypt.scrypt):

string hash = ScryptUtil.scrypt(password, N, r, p);

Этот метод возвращает строку, которая не подходит в качестве ключа для шифрования AES (или любого другого типа).

person Ian Boyd    schedule 18.05.2015