denyslb 0 27 ноября, 2017 Опубликовано 27 ноября, 2017 · Жалоба Требуется помощь тех, кто соображает в криптографии, т.к. мои познания в теме очень поверхностны. Задача - сделать алгоритм формирования ключа из passphrase, чтобы он не перебирался слишком просто на ASIC/GPU/FPGA (как например PBKDF2). Функция такова: Есть фиксированный salt[X] Есть password первый оборот - intermediate[0] = SHA512(salt+password) intermediate[n] = SHA512(intermediate[0] + ... + intermediate[n-1]) (т.е. хешируем все бОльший и больший блок) Т.е. упор на то, что в последующих оборотах используется материал всех предыдущих(чтобы не параллелили), и к концу обьем используемой памяти растет(чтобы не засунули в ASIC/FPGA с быстрой памятью перебирающий в несколько потоков) Конечное вычисление = последний оборот. Имеет ли право на жизнь такое? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 29 ноября, 2017 Опубликовано 29 ноября, 2017 · Жалоба ...Есть фиксированный salt[X] Есть password первый оборот - intermediate[0] = SHA512(salt+password) intermediate[n] = SHA512(intermediate[0] + ... + intermediate[n-1]) (т.е. хешируем все бОльший и больший блок) ...Имеет ли право на жизнь такое? ОФФ/2: Помню в стэйкере(под досиком, давно было дело) был похожий алгоритм, который сделал программист никогда не занимающийся вскрытием паролей-программ. там была классическая ошибка.. пароль вскрывался менее чем за секунду. и всего-то перебор 256 значений :) out[0] = f1(password) out[1] = f2(out[0]) out[2] = f2(out[1]) out[3] = f2(out[2]) out[n] = f2(out[n-1]) где - f1 не обратимая функция (взятие хэша от пароля) - f2 обратимая функция шифрования собственно алгоритм вскрытия банален и виден не вооружённым взглядом. смотрите - не сделайте похожий ляп с уважением (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jojo 0 30 ноября, 2017 Опубликовано 30 ноября, 2017 · Жалоба Первый проход intermediate[0] = SHA512(salt+password) intermediate[n] = SHA512(intermediate[n-1]) Второй проход = SHA512(intermediate[sHA512(intermediate[0]&ff.ff])&ff.ff]) n раз Примеры scrypt, cryptonight и, конечно, Ethereum. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
myq 0 2 декабря, 2017 Опубликовано 2 декабря, 2017 · Жалоба Выглядит, вроде, нормально. Тут каждая функция необратима. Только нет смысла усложнять. Просто SHA m раз. m равно общему числу хэширований в вашей схеме, примерно n*n / 2 (арифм. прогрессия). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
denyslb 0 3 декабря, 2017 Опубликовано 3 декабря, 2017 · Жалоба Первый проход intermediate[0] = SHA512(salt+password) intermediate[n] = SHA512(intermediate[n-1]) Второй проход = SHA512(intermediate[sHA512(intermediate[0]&ff.ff])&ff.ff]) n раз Примеры scrypt, cryptonight и, конечно, Ethereum. В обоих случаях оптимизации, если мы делаем просто несколько оборотов (как в PBKDF2) мы используем лишь 64*2 байта памяти, чего я стараюсь намеренно избежать. Чем больше памяти использует KDF - тем хуже для запихивания ее перебора в FPGA/GPU и распараллеливания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jojo 0 4 декабря, 2017 Опубликовано 4 декабря, 2017 · Жалоба В обоих случаях оптимизации, если мы делаем просто несколько оборотов (как в PBKDF2) мы используем лишь 64*2 байта памяти, чего я стараюсь намеренно избежать. Чем больше памяти использует KDF - тем хуже для запихивания ее перебора в FPGA/GPU и распараллеливания. Я может скобки не так расставил. Что, и в этом случае тоже? Идея в том, чтобы использовать часть текущего значения хэша для обращения к заранее вычисленному массиву. На первом проходе массив заполняется хэшами последовательно. intermediate[0] = SHA512(salt+password) intermediate[n] = SHA512(intermediate[n-1]) На втором проходе младшие биты последнего хэша используются как адрес в ранее вычисленном массиве: address0=intermediate[n]&ff.ff hash0=SHA512(intermediate[address0]) address1=hash0&ff.ff hash1=SHA512(intermediate[address1]) и т.д. Примеры того, что вы хотите сделать, я привёл выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
denyslb 0 4 декабря, 2017 Опубликовано 4 декабря, 2017 · Жалоба Я может скобки не так расставил. Что, и в этом случае тоже? Идея в том, чтобы использовать часть текущего значения хэша для обращения к заранее вычисленному массиву. На первом проходе массив заполняется хэшами последовательно. intermediate[0] = SHA512(salt+password) intermediate[n] = SHA512(intermediate[n-1]) На втором проходе младшие биты последнего хэша используются как адрес в ранее вычисленном массиве: address0=intermediate[n]&ff.ff hash0=SHA512(intermediate[address0]) address1=hash0&ff.ff hash1=SHA512(intermediate[address1]) и т.д. Примеры того, что вы хотите сделать, я привёл выше. Если как вы написали - intermediate массив заполнен (4 мбайта еще надо суметь заполнить хорошим хешем), то ваша функция скорее тогда дополнение к изначальной, в принципе неплохая идея. Но я подумываю сделать немного по другому, особенность DDR памяти в том, что intermediate[n] вычитывается из памяти очень быстро и возможно кешируется, GDDR5X как раз читает куском в 64 байта, т.е. все равно считается достаточно быстро в GPU. А вот если я сделаю составление аргумента для SHA512 скажем из 1 байта из каждого intermediate элемента... Т.е. например start = intermediate[n]&0xffff i = 0..63 { arg |= intermediate[(start+i)&0xffff] << i; (т.е. первый байт аргумента получаем, из первого 64 байт куска, первый байт в нем и т.д.) } и т.д. (возможно есть более аккуратный способ написать это) И писать таким же образом, модифицируя исходный intermediate, по байту, это заодно вымоет все возможные кеши в типичных архитектурах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться