Utilidad de cifrado basada en contraseñas que demuestra la función de derivación de claves de scrypt. En hardware moderno y con los parámetros predeterminados, el coste de descifrar la contraseña de un archivo cifrado con scrypt es aproximadamente 100 mil millones de veces mayor que el coste de descifrar la misma contraseña en un archivo cifrado con openssl; esto significa que una contraseña de cinco caracteres con scrypt es más segura que una contraseña de diez caracteres con openssl.
$ scrypt enc file.txt file.enc
$ scrypt dec file.enc file.txt
$ scrypt enc -v -f file.txt file.enc
Please enter passphrase:
Please confirm passphrase:
Parameters used: N = 524288; r = 8; p = 1;
Decrypting this file requires at least 536 MB of memory (1.0 GB available),
and will take approximately 4.5 seconds (limit: 5.0 seconds).
-v implica la inclusión de tres argumentos: N = 2^logN, por defecto logN=19 [2^19= 524288], "r" ajusta el uso de memoria y ancho de banda en cada iteración. Multiplicar r aumenta proporcionalmente el uso de memoria y "p" es el número de hilos/secuencias independientes. En el ejemplo mostrado, la fórmula aproximada de memoria necesaria sería 128 × N × r bytes, en el ejemplo: 128 × 524288 × 8 = 536,870,912 bytes los 536 MB que muestra la salida. Esto significa que para probar una sola contraseña, un atacante necesita 536 MB de RAM, si intenta probar 10.000 contraseñas por segundo, necesitaría 10.000 × 536 MB ≈ 5.36 TB de RAM por segundo. Con Openssl, que usa PBKDF2 y sin memoria-hard, el atacante podría probar millones de contraseñas por segundo usando FPGA/GPU/ASIC, porque PBKDF2 usa muy poca RAM, en GPU ~10⁹ contraseñas/segundo. Con scrypt en el ejemplo, en GPU solo se puede probar ~10 contraseñas/segundo por cada 536 MB de RAM. Para llegar a 10⁹ intentos/segundo se necesitaría una granja con 100 TB de RAM.