In
cryptography
Cryptography, or cryptology (from "hidden, secret"; and ''graphein'', "to write", or ''-logy, -logia'', "study", respectively), is the practice and study of techniques for secure communication in the presence of Adversary (cryptography), ...
, scrypt (pronounced "ess crypt") is a password-based
key derivation function
In cryptography, a key derivation function (KDF) is a cryptographic algorithm that derives one or more secret keys from a secret value such as a master key, a password, or a passphrase using a pseudorandom function (which typically uses a cr ...
created by
Colin Percival
Colin A. Percival (born 1980) is a Canadian computer scientist and computer security researcher. He completed his undergraduate education at Simon Fraser University and a doctorate at the University of Oxford. While at university he joined the F ...
in March 2009, originally for the
Tarsnap online backup service.
The algorithm was specifically designed to make it costly to perform large-scale
custom hardware attacks by requiring large amounts of memory. In 2016, the scrypt algorithm was published by
IETF
The Internet Engineering Task Force (IETF) is a standards organization for the Internet standard, Internet and is responsible for the technical standards that make up the Internet protocol suite (TCP/IP). It has no formal membership roster ...
as RFC 7914. A simplified version of scrypt is used as a
proof-of-work
Proof of work (also written as proof-of-work, an abbreviated PoW) is a form of Cryptography, cryptographic proof (truth), proof in which one party (the ''prover'') proves to others (the ''verifiers'') that a certain amount of a specific computatio ...
scheme by a number of
cryptocurrencies
A cryptocurrency (colloquially crypto) is a digital currency designed to work through a computer network that is not reliant on any central authority, such as a government or bank, to uphold or maintain it.
Individual coin ownership records ...
, first implemented by an anonymous programmer called ArtForz in Tenebrix and followed by Fairbrix and
Litecoin soon after.
Introduction
A password-based
key derivation function
In cryptography, a key derivation function (KDF) is a cryptographic algorithm that derives one or more secret keys from a secret value such as a master key, a password, or a passphrase using a pseudorandom function (which typically uses a cr ...
(password-based KDF) is generally designed to be computationally intensive, so that it takes a relatively long time to compute (say on the order of several hundred milliseconds). Legitimate users only need to perform the function once per operation (e.g., authentication), and so the time required is negligible. However, a
brute-force attack would likely need to perform the operation billions of times, at which point the time requirements become significant and, ideally, prohibitive.
Previous password-based KDFs (such as the popular
PBKDF2 from
RSA Laboratories) have relatively low resource demands, meaning they do not require elaborate hardware or very much memory to perform. They are therefore easily and cheaply implemented in hardware (for instance on an
ASIC or even an
FPGA). This allows an attacker with sufficient resources to launch a large-scale parallel attack by building hundreds or even thousands of implementations of the algorithm in hardware and having each search a different subset of the key space. This divides the amount of time needed to complete a brute-force attack by the number of implementations available, very possibly bringing it down to a reasonable time frame.
The scrypt function is designed to hinder such attempts by raising the resource demands of the algorithm. Specifically, the algorithm is designed to use a large amount of memory compared to other password-based KDFs, making the size and the cost of a hardware implementation much more expensive, and therefore limiting the amount of parallelism an attacker can use, for a given amount of financial resources.
Overview
The large memory requirements of scrypt come from a large vector of
pseudorandom bit strings that are generated as part of the algorithm. Once the vector is generated, the elements of it are accessed in a pseudo-random order and combined to produce the derived key. A straightforward implementation would need to keep the entire vector in RAM so that it can be accessed as needed.
Because the elements of the vector are generated algorithmically, each element could be generated ''on the fly'' as needed, only storing one element in memory at a time and therefore cutting the memory requirements significantly. However, the generation of each element is intended to be computationally expensive, and the elements are expected to be accessed many times throughout the execution of the function. Thus there is a significant trade-off in speed to get rid of the large memory requirements.
This sort of
time–memory trade-off often exists in computer algorithms: speed can be increased at the cost of using more memory, or memory requirements decreased at the cost of performing more operations and taking longer. The idea behind scrypt is to deliberately make this trade-off costly in either direction. Thus an attacker could use an implementation that doesn't require many resources (and can therefore be massively parallelized with limited expense) but runs very slowly, or use an implementation that runs more quickly but has very large memory requirements and is therefore more expensive to parallelize.
Algorithm
Where ' notation is defined in RFC 2898, where c is an iteration count.
This notation is used by RFC 7914 for specifying a usage of PBKDF2 with c = 1.
Function ROMix(Block, Iterations)
Create ''Iterations'' copies of ''X''
X ← Block
for i ← 0 to Iterations−1 do
V
i ← X
X ← BlockMix(X)
for i ← 0 to Iterations−1 do
j ← Integerify(X) mod Iterations
X ← BlockMix(X xor V
j)
return X
Where RFC 7914 defines as the result of interpreting the last 64 bytes of X as a ''little-endian'' integer A
1.
Since Iterations equals 2 to the power of N, only the ''first'' bytes among the ''last'' 64 bytes of X, interpreted as a ''little-endian'' integer A
2, are actually needed to compute
Integerify(X) mod Iterations = A1 mod Iterations = A2 mod Iterations
.
Function BlockMix(B):
''The block B is r 128-byte chunks (which is equivalent of 2r 64-byte chunks)''
r ← Length(B) / 128;
''Treat B as an array of 2r 64-byte chunks''
0...B2r-1">0...B2r-1← B
X ← B
2r−1
for i ← 0 to 2r−1 do
X ← Salsa20/8(X xor B
i)
// Salsa20/8 hashes from 64-bytes to 64-bytes
Y
i ← X
return ← Y
0∥Y
2∥...∥Y
2r−2 ∥ Y
1∥Y
3∥...∥Y
2r−1
Where ''Salsa20/8'' is the 8-round version of
Salsa20.
Cryptocurrency uses
Scrypt is used in many cryptocurrencies as a
proof-of-work
Proof of work (also written as proof-of-work, an abbreviated PoW) is a form of Cryptography, cryptographic proof (truth), proof in which one party (the ''prover'') proves to others (the ''verifiers'') that a certain amount of a specific computatio ...
algorithm (more precisely, as the hash function in the
Hashcash proof-of-work algorithm). It was first implemented for Tenebrix (released in September 2011) and served as the basis for
Litecoin and
Dogecoin, which also adopted its scrypt algorithm. Mining of
cryptocurrencies
A cryptocurrency (colloquially crypto) is a digital currency designed to work through a computer network that is not reliant on any central authority, such as a government or bank, to uphold or maintain it.
Individual coin ownership records ...
that use scrypt is often performed on graphics processing units (
GPUs) since GPUs tend to have significantly more processing power (for some algorithms) compared to the CPU. This led to shortages of high end GPUs due to the rising price of these currencies in the months of November and December 2013.
Utility
The scrypt utility was written in May 2009 by Colin Percival as a demonstration of the scrypt key derivation function.
It's available in most
Linux
Linux ( ) is a family of open source Unix-like operating systems based on the Linux kernel, an kernel (operating system), operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically package manager, pac ...
and
BSD
The Berkeley Software Distribution (BSD), also known as Berkeley Unix or BSD Unix, is a discontinued Unix operating system developed and distributed by the Computer Systems Research Group (CSRG) at the University of California, Berkeley, beginni ...
distributions.
See also
*
Argon2 – winner of the
Password Hashing Competition in 2015
*
bcrypt
bcrypt is a password-hashing function designed by Niels Provos and David Mazières. It is based on the Blowfish (cipher), Blowfish cipher and presented at USENIX in 1999. Besides incorporating a salt (cryptography), salt to protect against rain ...
– blowfish-based password-hashing function
*
bcrypt
bcrypt is a password-hashing function designed by Niels Provos and David Mazières. It is based on the Blowfish (cipher), Blowfish cipher and presented at USENIX in 1999. Besides incorporating a salt (cryptography), salt to protect against rain ...
– blowfish-based cross-platform file encryption utility developed in 2002
*
crypt
A crypt (from Greek κρύπτη (kryptē) ''wikt:crypta#Latin, crypta'' "Burial vault (tomb), vault") is a stone chamber beneath the floor of a church or other building. It typically contains coffins, Sarcophagus, sarcophagi, or Relic, religiou ...
– Unix C library function
*
crypt
A crypt (from Greek κρύπτη (kryptē) ''wikt:crypta#Latin, crypta'' "Burial vault (tomb), vault") is a stone chamber beneath the floor of a church or other building. It typically contains coffins, Sarcophagus, sarcophagi, or Relic, religiou ...
– Unix utility
*
ccrypt – utility
*
Key derivation function
In cryptography, a key derivation function (KDF) is a cryptographic algorithm that derives one or more secret keys from a secret value such as a master key, a password, or a passphrase using a pseudorandom function (which typically uses a cr ...
*
Key stretching
*
mcrypt – utility
*
PBKDF2 – a widely used standard Password-Based Key Derivation Function 2
PufferFish– a cache-hard password hashing function based on improved bcrypt design
*
Space–time tradeoff
*
yescrypt – successor to scrypt
References
External links
The scrypt page on the Tarsnap website.The original scrypt paper.*
{{Cryptocurrencies
Cryptographic algorithms
Key derivation functions
Articles with example pseudocode