Kriptografide, **scrypt** (telaffuz "es-kript"), Colin Percival tarafından Tarsnap çevrimiçi yedekleme hizmeti için oluşturulan bir parola tabanlı anahtar türetme fonksiyonudur. Bu algoritma, büyük miktarda bellek gerektirerek büyük ölçekli özel donanım saldırılarını gerçekleştirmeyi pahalı hale getirmek için özel olarak tasarlanmıştır. 2016 yılında, scrypt algoritması IETF tarafından RFC 7914 olarak yayınlandı. Scrypt algoritmasının, ArtForz kullanıcı adına sahip ve gerçek adı bilinmeyen bir programcı tarafından implemente edilmiş, basitleştirilmiş bir sürümü, önce Tenebrix'te ve ardından Fairbrix ve Litecoin olmak üzere bir dizi kripto para birimi tarafından iş kanıtı şeması olarak kullanıldı.

Giriş
-----

Parola tabanlı bir anahtar türetme fonksiyonu (parola tabanlı KDF), genel olarak hesaplama açısından yoğun olacak şekilde, hesaplanması nispeten uzun zaman almak üzere (birkaç yüz milisaniye civarlarında) tasarlanmıştır. Ancak meşru kullanıcıların, işlem başına yalnızca bir kez (örneğin kimlik doğrulama) bir işlemi gerçekleştirmeleri gerektiği için bu süre göz ardı edilebilir. Buna rağmen, bir kaba kuvvet (brute-force) saldırısının bu işlemi milyarlarca kez gerçekleştirmesi gerektiği göz önüne alındığında, zaman gereksinimleri önemli ve dolayısıyla kısıtlayıcı hale gelir.

Önceki parola tabanlı KDF'lerin (RSA Laboratories'den gelen popüler PBKDF2 gibi) göreceli olarak düşük kaynak(sistem) talepleri vardır, bu da ayrıntılı donanım veya çok fazla bellek gerektirmedikleri anlamına gelir. Bu nedenle donanımda kolay ve ucuz bir şekilde uygulanırlar (örneğin bir ASIC veya bir FPGA üzerinde ). Bu, yeterli kaynaklara sahip bir saldırganın donanımdaki algoritmanın yüzlerce hatta binlerce farklı implementasyonunu üreterek ve her birinin anahtar alanın farklı bir alt kümesini aramasını sağlayarak geniş çaplı bir paralel saldırı başlatmasına olanak sağlar. Bu, kaba kuvvet saldırısını tamamlamak için gereken süreyi, mevcut implementasyonların sayısına bölerek büyük olasılıkla makul bir zaman dilimine indirger.

Scrypt fonksiyonu, algoritmanın kaynak taleplerini artırarak bu tür girişimleri engellemek için tasarlanmıştır. Spesifik olarak, algoritma diğer parola tabanlı KDF'lere kıyasla büyük miktarda bellek kullanmak üzere tasarlanmıştır ve bu sayede donanım uygulamasının boyutunu ve maliyetini çok daha pahalı hale getirir ve bu nedenle belirli miktarda mali kaynağa sahip bir saldırganın kullanabileceği paralellik miktarını sınırlar.

Genel bakış
-----------

Scrypt'in büyük bellek gereksinimleri, algoritmanın bir parçası olarak üretilen büyük bir sözde rassal bit dizgisi vektörü tarafından sağlanır. Vektör oluşturulduktan sonra, elementlerine sözde rassal sırayla erişilir ve türetilmiş anahtarı üretmek için birleştirilir. Basit bir uygulamanın, tüm vektörün RAM'de tutulması gerekir, böylece gerektiği gibi erişilebilir.

Vektörün elemanları algoritmik olarak üretildiğinden, bir anda sadece bir elemanı hafızaya kaydedecek ve bu nedenle hafıza gereksinimlerini önemli ölçüde azaltacak bir şekilde, her eleman *anında* gerektiği gibi üretilebilir. Buna rağmen, her bir elemanın üretilmesinin hesaplama açısından pahalı olması amaçlanmıştır ve elemanlara fonksiyonun yürütülmesi boyunca birçok kez erişilmesi beklenmektedir. Bu sayede, büyük bellek gereksinimlerinden kurtulmak için hızdan önemli bir derecede vazgeçilmesi gerekir.

Bu tür bir zaman-hafıza değiş tokuşu genellikle bilgisayar algoritmalarında mevcuttur: daha fazla bellek kullanma maliyetiyle hız arttırılabilir veya daha fazla işlem gerçekleştirme ve gerekli sürecin uzaması maliyetiyle bellek gereksinimleri azaltılabilir. Script'in ardındaki fikir, bu takası kasıtlı olarak her iki yönde de maliyetli yapmaktır. Böylece bir saldırgan çok fazla kaynak gerektirmeyen bir uygulama kullanabilir (ve bu nedenle sınırlı masrafla büyük ölçüde paralel olabilir) ancak çok yavaş çalışır ya da paralel olmak için daha hızlı çalışan ancak çok büyük bellek gereksinimi olan ve bu nedenle daha pahalı olan bir uygulamayı kullanabilir.

Algoritma
---------

Algoritma aşağıdaki parametreleri içerir:

* Parola - Hash edilecek karakter dizisi.
* Tuz - Gökkuşağı Tablosu saldırılarına karşı korumak için hash değerini değiştiren bir karakter dizisi
* N - işlemci/bellek maliyeti parametresi.
* p - Paralelleştirme parametresi; p ≤ (232 - 1) \* hLen / MFLen denklemini sağlayan pozitif bir tam sayı.
* dkLen - türetilmiş anahtarın (oktet cinsinden) amaçlanan çıktı uzunluğu; dkLen≤(232 - 1) \* hLen denlemini sağlayan pozitif bir tam sayı.
* r - Ardışık hafızanın okuma boyutunu ve performansını hassas şekilde ayarlayan blok boyutu parametresi. Yaygın olarak kullanılan değer 8'dir.
* hLen - Hash fonksiyonunun oktet uzunluğu (SHA256 için 32).
* MFlen - Karıştırma işlevinin çıktısının oktet cinsinden uzunluğu (aşağıdaki *SMix*). RFC7914'te r\*128 olarak tanımlanmıştır.

**Function** scrypt

```
   **Inputs:**
      Passphrase:                Bytes    string of characters to be hashed
      Salt:                      Bytes    random salt
      CostFactor (N):            Integer  CPU/memory cost parameter
      BlockSizeFactor (r):       Integer  blocksize parameter (8 is commonly used)
      ParallelizationFactor (p): Integer  *Parallelization parameter. (1..232-1 \* hLen/MFlen)*
      DesiredKeyLen:             Integer  Desired key length in bytes
   **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** 2CostFactor times using **ROMix** function (each block can be mixed in parallel)
   **for** i ← 0 **to** p-1 **do**
      Bi ← ROMix(Bi, 2CostFactor)

   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);
```

*PBKDF2 (P, S, c, dkLen)* notasyonu [rfc:2898 RFC] *2898'de* tanımlandığı zaman ve c değeri iterasyon miktarını belirttiği zaman.

Bu gösterim, RFC 7914 tarafından PBKDF2'nin c=1 iken olan kullanımını belirtmek için kullanılır. 

```
**Function** ROMix(Block, Iterations)

   Create *Iterations* copies of *X*
   X ← Block
   **for** i ← 0 **to** Iterations−1 **do**
      Vi ← X
      X ← BlockMix(X)

   **for** i ← 0 **to** Iterations−1 **do**
      j ← Integerify(X) mod Iterations 
      X ← BlockMix(X **xor** Vj)

   **return** X
```

Burada RFC 7914 *Integerify(X)'*i X'in son 64 baytının *little-endian*(en önemli byte en sağda olan) A1 tam sayısı olarak yorumlamasının sonucu olarak tanımlar.

İterasyonlar N'in karesine eşit olduğu için, X'in son 64 baytı içinden sadece *ilk* Tavan(N / 8) olan ve little-endian tam sayı olan A2 olarak yorumlanan baytlar, *Integerify (X) 'mod yineleme =* A*1 mod yineleme = A2 mod yineleme* denkleminin hesaplanmasında kullanılır. 

```
**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 chuncks*
    [B0...B2r-1] ← B

    X ← B2r−1
    **for** i ← 0 **to** 2r−1 **do**
        X ← Salsa20/8(X xor Bi)  **//Salsa20/8 hashes from 64-bytes to 64-bytes**
        Yi ← X

    **return** ← Y0∥Y2∥...∥Y2r−2 ∥ Y1∥Y3∥...∥Y2r−1
```

*Salsa20/8*, Salsa20'nin 8'lik versiyon olduğu durumda .

Kripto Para Kullanımları
------------------------

Scrypt birçok kripto para biriminde çalışma kanıtı algoritması olarak kullanılır. İlk olarak Tenebrix (Eylül 2011'de yayımlanan) için implemente edildi ve temel olarak kullanıldığı Litecoin ve Dogecoin de ayrıca scrypt algoritmasını benimseyip, kabul etmiştir. Scrypt kullanan kripto para birimlerinin madenciliği genellikle ekran kartlarında (GPU'lar ) gerçekleştirilir, çünkü ekran kartları işlemcilere kıyasla daha fazla işlem gücüne (bazı algoritmalar için) sahip olma eğilimindedirler. Bu durum, bu para birimlerinin Kasım ve Aralık 2013 aylarında yükselen fiyatı nedeniyle bu tarihlerde son model ekran kartlarının piyasada sayılarının azalmasına yol açtı.

Mayıs 2014 itibarıyla, scrypt tabanlı kripto para birimleri için özelleştirilmiş ASIC madencilik donanımı elde etmek mümkün. 2016 yılında ise InnoSilicon, 1.5 µJ/hash verim ile 14 nm teknolojisine sahip olduğunu iddia etmiştir.

Kaynakça
--------

1. ↑  "Tarsnap - The scrypt key derivation function and encryption utility". *www.tarsnap.com*. 22 Nisan 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 14 Temmuz 2022.
2. ↑  Sıralı Belleğe Bağlı İşlevlerle Güçlü Anahtar Türevi 14 Nisan 2019 tarihinde Wayback Machine sitesinde arşivlendi. , Colin Percival
3. ↑   [*yalın URL*]

| * g
* t
* d
Kripto para birimleri |
| --- |
| Teknoloji | Blok zinciri **·**  Kripto para karıştırıcı **·**  Kripto para borsası **·**  Kripto para cüzdanı **·**  Merkezi olmayan değişim **·**  Merkeziyetsiz Finans **·**  Kriptografik özet fonksiyonu **·**  Dağıtılmış defter teknolojisi **·**  Çatal **·**  Lightning Network **·**  Akıllı sözleşme **·**  MetaMask **·**  Değiştirilemez jeton |
| Konsensüs mekanizmaları | Yetki ispatı **·**  Kişilik ispatı **·**  Kapasite ispatı **·**  Hisse ispatı **·**  Emek ispatı |
| Emek ispatına dayalı para birimleri | 

|  |  |
| --- | --- |
| SHA-2 tabanlı | Bitcoin **·**  Bitcoin Cash **·**  Counterparty **·**  LBRY **·**  MazaCoin **·**  Namecoin **·**  Peercoin **·**  Titcoin |
| Ethash tabanlı | Ethereum **·**  Ethereum Classic **·**  WBTC |
| Scrypt tabanlı | Auroracoin **·**  Bitconnect **·**  Coinye **·**  Dogecoin **·**  Litecoin |
| Equihash tabanlı | Bitcoin Gold **·**  Zcash |
| RandomX tabanlı | Monero |
| X11 tabanlı | Dash **·**  Petro |
| Lyra2z KDF tabanlı | Taler |
| Diğer | AmbaCoin **·**  Firo **·**  IOTA **·**  Primecoin **·**  Verge **·**  Vertcoin |

 |
| Hisse ispatına dayalı para birimleri | Algorand **·**  Cardano **·**  EOS.IO **·**  Gridcoin **·**  Kin **·**  Nxt **·**  Peercoin **·** Polkadot **·**  Solana **·**  Steem **·**  Symbol **·**  Tezos **·**  TRON |
| ERC-20 *token*'leri | Loopring **·**  Augur **·**  Aventus **·**  Bancor **·**  Basic Attention Token **·**  Chainlink **·**  INX **·**  Kin **·**  KodakCoin **·**  Minds **·**  The DAO **·**  Uniswap **·**  TRON **·**  WBTC |
| Stablecoinler | Dai **·**  Diem **·**  Tether  **·**  USD Coin |
| Diğer para birimleri | Worldcoin **·**  Binance Coin **·**  Chia **·**  Filecoin **·**  GNU Taler **·**  HBAR Hashgraph **·**  MobileCoin **·**  Nano **·**  NEO **·**  Ripple **·**  SafeMoon **·**  Stellar **·**  WhopperCoin |
| İlişkili maddeler | Airdrop **·**  BitLicense **·**  Tamamlayıcı para birimi **·**  Blockchain **·**  Kripto-anarşizm **·**  Kripto para balonu **·**  Elektronik para **·** Çift harcama **·**  Dağıtılmış defter teknolojisi yasası **·**  Yüksek defter **·**  İlk madeni para teklifi **·**  İlk değişim teklifi **·**  Quahl **·**  Kripto para birimleri listesi **·**  Piyasa değerine göre kripto para birimleri listesi **·**  Stablecoin **·**  Jeton para **·**  Sanal para birimi **·**  Bitcoin çatalları listesi **·**  Bitcoin Magazine |