| bcrypt | |
|---|---|
| Разработчики | Нильс Провос и David Mazières |
| Впервые опубликован | 1999 |
| Число раундов | 2n |
bcrypt — адаптивная криптографическая функция формирования ключа, используемая для защищенного хранения паролей. Разработчики: Нильс Провос и David Mazières. Функция основана на шифре Blowfish, впервые представлена на USENIX в 1999 году[1]. Для защиты от атак с помощью радужных таблиц bcrypt использует соль (salt); кроме того, функция является адаптивной, время её работы легко настраивается и её можно замедлить, чтобы усложнить атаку перебором.
Шифр Blowfish отличается от многих алгоритмов вычислительно сложной фазой подготовки ключей шифрования.
Провос и Mazières воспользовались этой особенностью, но изменили алгоритм подготовки ключей, получив шифр «Eksblowfish» (expensive key schedule Blowfish). Количество раундов в подготовке ключей должно быть степенью двойки; конкретная степень может задаваться при использовании bcrypt.
Изначально реализовано в функции crypt в OpenBSD. Существуют реализации для Java, Python, Nim, C#, Ruby, Perl, PHP 5.3, Node.js и некоторых других.
Алгоритм bcrypt использует алгоритм настройки ключей из «Eksblowfish»:
EksBlowfishSetup(cost, salt, key)
state
InitState()
state
ExpandKey(state, salt, key)
repeat (2cost)
state
ExpandKey(state, 0, key)
state
ExpandKey(state, 0, salt)
return state
Функция InitState соответствует оригинальной функции из шифра Blowfish; для заполнения массива P и S-box используется дробная часть числа .
Функция ExpandKey:
ExpandKey(state, salt, key)
for(n = 1..18)
Pn
key[32(n-1)..32n-1]
Pn //treat the key as cyclic
ctext
Encrypt(salt[0..63])
P1
ctext[0..31]
P2
ctext[32..63]
for(n = 2..9)
ctext
Encrypt(ctext
salt[64(n-1)..64n-1]) //encrypt using the current key schedule and treat the salt as cyclic
P2n-1)
ctext[0..31]
P2n
ctext[32..63]
for(i = 1..4)
for(n = 0..127)
ctext
Encrypt(ctext
salt[64(n-1)..64n-1]) //as above
Si[2n]
ctext[0..31]
Si[2n+1]
ctext[32..63]
return state
Для вычисления хеша bcrypt обрабатывает входные данные эквивалентно шифрованию 'eksblowfish(усиленный_ключ, input)':
bcrypt(cost, salt, key, input)
state
EksBlowfishSetup(cost, salt, key)
ctext
input
repeat (64)
ctext
EncryptECB(state, ctext) // шифрование стандартным Blowfish в режиме ECB
return Concatenate(cost, salt, ctext)
В различных ОС (linux, OpenBSD), использующих алгоритм bcrypt в стандартной функции crypt (3), в качестве input подается константа «OrpheanBeholderScryDoubt»[2].
bcrypt был разработан в 1999 году и был защищен от эффективного перебора на аппаратных средствах того времени. В настоящее время получили широкое распространение ПЛИС, в которых bcrypt реализуется эффективнее. В 2009 был создан алгоритм scrypt, требующий для своей работы значительный объем памяти (со случайным доступом), объем памяти настраивается[3].
В сравнении с PBKDF2, алгоритм расширения ключа в bcrypt практически не исследовался криптографами[4].
|coauthors= (справка)Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .