scrypt
A kriptográfiában a scrypt egy kulcslevezető függvény, amit Colin Percival eredetileg a Tarsnap online biztonságimentő-szolgáltatáshoz készített el.[1][2] Az algoritmust úgy fejlesztette ki, hogy sok memória kelljen a nagy méretű egyénihardver-támadásokhoz. 2016-ban a scrypt algoritmust az IETF RFC 7914 számmal kiadta. Egy egyszerűsített változatát számos kriptovaluta használja, mint pl. a LiteCoin.[3]
Egy jelszó alapú kulcslevezető függvényt gyakran úgy terveznek, hogy sok számítást kelljen elvégezni, hogy relatív hosszú időt vegyen igénybe a kiszámítása (pl. néhány száz ezredmásodpercet). A hiteles felhasználóknak elég kevésszer végrehajtani ezt, így a szükséges idő elhanyagolható. De egy nyers erejű támadás esetén gyakran több milliárdszor kell a műveletet végrehajtani, így az elhasznált idő jelentőssé válik, ideális esetben ellehetetleníti a támadást.
Áttekintés
[szerkesztés]A scrypt nagy memóriaigénye az algoritmus részeként generált véletlenszerű bitsorozatok hatalmas vektorából ered. Amikor a vektor elkészül, elemeihez véletlenszerű sorrendben férnek, és azokat kombinálják, hogy a levezetett kulcsot kiadja.
A korábbi jelszóalapú KDF-ek (például a PBKDF2) kevéssé erőforrás-igényesek, így nem igényelnek nagy teljesítményű hardvert. Így könnyen, olcsón megvalósíthatók, például ASIC-en vagy FPGA-n. Ez lehetővé teszi egy elég erőforrással rendelkező támadónak a nagymértékű párhuzamos támadást több száz vagy ezer megvalósítás létrehozásával, melyek mindegyike a kulcstér más részében kutat. Ez a támadáshoz szükséges időt a megvalósítások számával osztja, a gyakorlatban használható időtartamra csökkentve azt.
A scrypt célja ezek gátlása az algoritmus erőforrásigényével. Az algoritmus több memóriát igényel más jelszóalapú KDF-eknél,[4] így a hardveres megvalósítás mérete és költsége nagyobb, korlátozva a támadó által használható párhuzamosságot adott mennyiségű pénz esetén.
Mivel a vektor elemei algoritmussal jönnek létre, az elemek szükség esetén időközben is létrejöhetnek, egyidejűleg egy elem tárolásával, így a memóriaigény jelentős csökkentésével. Az elemek létrehozásának számítási tekintetben azonban költségesnek kell lennie, és az elemeket várhatóan a függvény végrehajtása során sokszor kell hozzáférni, így a sebesség kisebb az alacsony memóriaigény mellett.
Ez gyakran szerepel a számítógépes algoritmusokban: a sebesség nagyobb memóriahasználattal növelhető, a memóriahasználat több művelet végzésével csökkenthető. A scrypt ötlete, hogy ezt bármely irányban nagyon költségessé tegye. Így a támadó kis memóriaigényű, jól párhuzamosítható, de lassú vagy gyors, de nagy memóriaigényű, így kevésbé párhuzamosítható algoritmust használhat.
Története
[szerkesztés]A scryptet Colin Percival tervezte a Tarsnapnek, és 2009 májusában a BSDCan-konferencián mutatta be.[5] 2012-ben az IETF egy scrypt-tervet internetes vázlatként közölt. 2020 augusztusában jelent meg a scrypt-1.3.1.[6]
A scrypt nem vett részt a Password Hashing Competitionön, ahol új hasítóalgoritmust választottak, de Colin Percival részt vett szakértőként.[7] Alexander Peslyak Yescryptje azonban igen, mely a YESCRYPT-WORM kiterjesztéssel eredeti scrypt-értékeket tudott kiadni.[8]
Algoritmus
[szerkesztés]Function scrypt Inputs: This algorithm includes the following parameters: Passphrase: Bytes string of characters to be hashed Salt: Bytes string of random characters that modifies the hash to protect against Rainbow table attacks CostFactor (N): Integer CPU/memory cost parameter – Must be a power of 2 (e.g. 1024) BlockSizeFactor (r): Integer blocksize parameter, which fine-tunes sequential memory read size and performance. (8 is commonly used) ParallelizationFactor (p): Integer Parallelization parameter. (1 .. 232-1 * hLen/MFlen) DesiredKeyLen (dkLen): Integer Desired key length in bytes (Intended output length in octets of the derived key; a positive integer satisfying dkLen ≤ (232− 1) * hLen.) hLen: Integer The length in octets of the hash function (32 for SHA256). MFlen: Integer The length in octets of the output of the mixing function (SMix below). Defined as r * 128 in RFC7914. Output: DerivedKey: Bytes array of bytes, DesiredKeyLen long Step 1. Generate expensive salt blockSize ← 128*BlockSizeFactor // Length (in bytes) of the SMix mixing function output (e.g. 128*8 = 1024 bytes) Use PBKDF2 to generate initial 128*BlockSizeFactor*p bytes of data (e.g. 128*8*3 = 3072 bytes) Treat the result as an array of p elements, each entry being blocksize bytes (e.g. 3 elements, each 1024 bytes) [B0...Bp−1] ← PBKDF2HMAC-SHA256(Passphrase, Salt, 1, blockSize*ParallelizationFactor) Mix each block in B Costfactor times using ROMix function (each block can be mixed in parallel) for i ← 0 to p-1 Bi ← ROMix(Bi, CostFactor) All the elements of B is our new "expensive" salt expensiveSalt ← B0∥B1∥B2∥ ... ∥Bp-1 // where ∥ is concatenation Step 2. Use PBKDF2 to generate the desired number of bytes, but using the expensive salt we just generated return PBKDF2HMAC-SHA256(Passphrase, expensiveSalt, 1, DesiredKeyLen);
ahol a PBKDF2(P, S, c, dkLen) jelölést az RFC 2898 határozza meg, c az ismétlésszám.
E jelölést az RFC 7914 használja a PBKDF2 használatával c=1 esetre.
function ROMix(Block, Iterations)
Create Iterations copies of X
X ← Block
for i ← 0 to Iterations−1
Vi ← X
X ← BlockMix(X)
for i ← 0 to Iterations−1
j ← Integerify(X) % Iterations
X ← BlockMix(X ^ Vj)
return X
Ahol
Integerify(X)
X utolsó 64 bájtjának little-endian egészkénti értelmezése.
Mivel Iterations = 2N, csak az első bájt szükséges ténylegesen Integerify(X) % Iterations = A1%Iterations=A2%Iterations
kiszámítására.
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 [B0...B2r-1] ← B X ← B2r−1 for i ← 0 to 2r−1 X ← Salsa20/8(X ^ Bi) // Salsa20/8 hashes from 64-bytes to 64-bytes Yi ← X return ← Y0∥Y2∥...∥Y2r−2 ∥ Y1∥Y3∥...∥Y2r−1
ahol Salsa20/8 a 8 ismétléses Salsa20.
Kriptovaluták
[szerkesztés]A scryptet sok kriptovaluta használja ellenőrző algoritmusaiban hasítófüggvényként. Először a Tenebrix (2011) használta, és a szintén ezt használó Litecoin és Dogecoin alapja is volt.[9][10] A kriptovaluták „bányászatát” gyakran grafikus feldolgozóegységeken (GPU) végzik a CPU-knál nagyobb feldolgozóképességük miatt.[11] Ez GPU-hiányhoz vezetett az emelkedő árak miatt 2013 novemberében és decemberében.[12]
Eszköz
[szerkesztés]A scrypt-eszközt Colin Percival 2009 májusában írta a scrypt KDF bemutatására.[1][2] Számos Linux- és BSD-változaton elérhető
Jegyzetek
[szerkesztés]- ↑ a b The scrypt key derivation function. Tarsnap . (Hozzáférés: 2014. január 21.)
- ↑ a b SCRYPT(1) General Commands Manual. Debian Manpages . (Hozzáférés: 2022. március 2.)
- ↑ Alec Liu: Beyond Bitcoin: A Guide to the Most Promising Cryptocurrencies
- ↑ Percival, Colin: Stronger Key Derivation Via Sequential Memory-Hard Functions. (Hozzáférés: 2022. november 11.)
- ↑ scrypt – A new key derivation function (angol nyelven). (Hozzáférés: 2023. augusztus 29.)
- ↑ scrypt 1.3.1 released. Tarsnap-üzenet
- ↑ Introduction (angol nyelven)
- ↑ yescrypt - modern KDF and password hashing scheme (angol nyelven)
- ↑ Andreas M. Antonopoulos. Mastering Bitcoin: Unlocking Digital Cryptocurrencies. O'Reilly Media, 221, 223. o. (2014. december 3.). ISBN 9781491902646
- ↑ History of cryptocurrency. [2016. június 11-i dátummal az eredetiből archiválva]. (Hozzáférés: 2014. június 27.)
- ↑ Roman Guelfi-Gibbs. Litecoin Scrypt Mining Configurations for Radeon 7950. Amazon Digital Services
- ↑ Joel Hruska: Massive surge in Litecoin mining leads to graphics card shortage. ExtremeTech, 2013. december 10.
Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben a scrypt című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.