scrypt (читається ес-крипт[1]) — адаптивна криптографічна функція формування ключа на основі пароля, створена офіцером безпекиFreeBSD Коліном Персивалем для системи зберігання резервних копійTarsnap. Функція створена таким чином, щоб ускладнити атаку перебором за допомогоюПЛІС. Для її обчислення потрібний значний обсягпам'яті з довільним доступом.17 вересня2012 року алгоритм scrypt був опублікованийIETF у виглядіInternet Draft, планується його внесення вRFC. Використовується scrypt, наприклад, в якостідоказу виконаної роботи вкриптовалютіLitecoin[2].
Засновані на пароліфункції формування ключа (англ.password-based key derivation function, PBKDF) зазвичай розробляються таким чином, щоб вимагати відносно великий час обчислення (за порядком величини — сотні мілісекунд). При використанні легальним користувачам потрібно обчислити подібну функцію один раз (наприклад приаутентифікації) і такий час допустимий. Але при проведенні атаки повного перебору атакуючому потрібно зробити мільярди обчислень функції і її обчислювальна складність робить атаку повільнішою і дорожчою.
Однак перші функції PBKDF (наприклад PBKDF2, розробленаRSA Laboratories) обчислюються порівняно швидко, і їх перебір може бути ефективно реалізований на спеціалізованому обладнанні (FPGA абоASIC). Така реалізація дозволяє запускати масштабні паралельні атаки переборугрубою силою, наприклад, з обчисленням сотень значень функції в кожній мікросхемі FPGA.
Функція scrypt розроблялася з метою ускладнення апаратних реалізацій шляхом збільшення кількості ресурсів, необхідних для обчислення. Даний алгоритм використовує значну кількість оперативної пам'яті (пам'яті з довільним доступом) порівняно з іншими PBKDF. Пам'ять у scrypt використовується для зберігання великого вектора псевдовипадкових бітових послідовностей, що генеруються, на початку алгоритму[3]. Після створення вектора його елементи запитуються у псевдовипадковому порядку і комбінуються один з одним для отримання ключа. Так як алгоритм генерації вектора відомий, можлива реалізація scrypt, не вимагає пам'яті, і вираховує кожен елемент в момент звернення. Однак, обчислити елемент відносно складно і в процесі роботи функції scrypt кожен елемент прочитується багато разів. У scrypt закладений такийбаланс між пам'яттю і часом, і реалізації, що не використовують пам'ять, надто повільні.
scrypt (P, S, N, r, p, dkLen) =MFcryptHMAC SHA256,SMixr (P, S, N, p, dkLen)
деN, r, p — параметри, які визначають складність обчислення функції.
MFcrypt визначена так: DK = MFcryptPRF, MF (P, S, N, p, dkLen)
де
Вхідні параметри scrypt і MFcrypt:
ФункціяMFcrypt працює за алгоритмом:
Споживання пам'яті оцінюється в 128*r*N байт[4]. Співвідношення кількості читань і записів в цю пам'ять оцінюється в 100 % і 63 %.
Рекомендовані параметри scrypt:N = 16384,r = 8,p = 1 (споживання пам'яті — близько 16 МБ)
Швидкість обчислення однієї операції scrypt на процесорі загального призначення становить близько 100 мілісекунд при налаштуванні на використання 32 МБ пам'яті. При налаштуванні на тривалість операції в 1 мілісекунду використовується дуже мало пам'яті і алгоритм стає слабшим алгоритму bcrypt, налаштованого на порівнянну швидкість.
КриптовалютаLitecoin використовує такі параметри scrypt: N = 1024, r = 1, p = 1, розмір вхідного параметра і солі — 80 байт, розмір DK — 256 біт (32 байти)[5]. Споживання оперативної пам'яті — близько 128 КБ. Обчислення такого scrypt на відеокартах приблизно в 10 разів швидше, ніж на процесорах загального призначення[6], що є ознакою вибору недостатньо сильних параметрів[7].