Argon2, Temmuz 2015'te Parola Özetleme Yarışmasının galibi olarak seçilen anahtar türetme fonksiyonudur. Lüksemburg Üniversitesi'nden Alex Biryukov, Daniel Dinu ve Dmitry Khovratovich tarafından tasarlanmıştır. Argon2'nin referans uygulaması, CC0 lisansı (yani kamu malı) veya Apache License 2.0 altında yayınlanmış ve üç ilgili sürüm sağlamıştır: Argon2d, GPU kırılma saldırılarına karşı direnci en üst düzeye çıkarır. Argon2d, bellek dizisine, parola bağımlı bir sırayla erişir; bu da zaman-bellek takası (TMTO) saldırılarının olasılığını azaltır, ancak olası yan kanal saldırıları sunar. Argon2i, yan kanal saldırılarına dayanacak şekilde optimize edilmiştir. Bellek dizisine parola bağımsız bir sırada erişir. Argon2id hibrit bir versiyondur. İlk bellek geçişi için Argon2i yaklaşımını ve sonraki geçişler için Argon2d yaklaşımını izler. İnternet taslağı, diğer iki moddan birinin tercih edilmesini gerektiren durumlar olması haricinde Argon2id kullanılmasını önerir. Üç modun her biri, aşağıda verilen üç parametre ile tanımlama yapmaya izin verir. çalışma süresi hafıza gerekliliği paralellik derecesi Kriptanaliz Argon2d'ye uygulanabilecek genel bir kripto analizi olmamasına rağmen, Argon2i fonksiyonuna karşı yayınlanan iki saldırı vardır. İlk saldırı sadece Argon2i'nin eski sürümüne uygulanabilirken, ikincisi en son sürüme kadar uzatılmıştır (1.3) İlk saldırı, zaman cezası olmadan, istenen alanın çeyreği ile beşte biri arasında kullanılması ile, tek geçişli Argon2i fonksiyonunu hesaplamanın ve yine zaman cezası olmadan, sadece '/' Bununla birlikte, Joël Alwen ve Jeremiah Blocki saldırıyı iyileştirmiş ve saldırının başarısız olması için Argon2i 1.3'ün bellek üzerinde 10'dan fazla geçişe ihtiyaç duyduğunu göstermiştir. Algoritma Argon2 password (P): Bytes (0..2-1) salt (S): Bytes (8..2-1) parallelism (p): Number (1..2-1) tagLength (T): Number (4..2-1) memorySizeKB (m): Number (8p..2-1) iterations (t): Number (1..2-1) version (v): Number (0x13) key (K): Bytes (0..2-1) associatedData (X): Bytes (0..2-1) hashType : Number (0=Argon2d, 1=Argon2i, 2=Argon2id) tag: Bytes (tagLength) buffer ← parallelism ∥ tagLength ∥ memorySizeKB ∥ iterations ∥ version ∥ hashType ∥ Length(password) ∥ Password ∥ Length(salt) ∥ salt ∥ Length(key) ∥ key ∥ Length(associatedData) ∥ associatedData H ← Blake2b(buffer, 64) blockCount ← Floor(memorySizeKB, 4*parallelism) columnCount ← blockCount / parallelism; for i ← 0 to parallelism-1 do B[0] ← Hash(H ∥ 0 ∥ i, 1024) B[1] ← Hash(H ∥ 1 ∥ i, 1024) for i ← 0 to parallelism-1 do for j ← 2 to columnCount-1 do i′, j′ ← GetBlockIndexes(i, j) B[j] = G(B[j-1], B[j′]) for nIteration ← 2 to iterations do for i ← 0 to parallelism-1 do for j ← 0 to columnCount-1 do i′, j′ ← GetBlockIndexes(i, j) if j 0 then B[0] G(B[columnCount-1], B[j′]) else B[j] G(B[j-1], B[j′]) C ← B[columnCount-1] for i ← 1 to parallelism-1 do C ← C xor B[columnCount-1] return Hash(C, tagLength) Değişken uzunluklu özet fonksiyonu === Argon2, 2 byte uzunluğuna kadar özet üretebilen özet fonksiyonunu kullanır. Bu özet fonksiyonu dahili olarak Blake2 üzerine kuruludur. Hash(message, digestSize) message: Bytes (0..2-1) digestSize: Integer (1..2) digest: Bytes (digestSize) if (digestSize <= 64) then return Blake2b(digestSize ∥ message, digestSize) r ← Ceil(digestSize/32)-1; V ← Blake2b(digestSize ∥ message, 64); for i ← 2 to r do V ← Blake2b(V, 64) partialBytesNeeded ← digestSize – 32*r; V ← Blake2b(V, partialBytesNeeded) return A ∥ A ∥ ... ∥ A ∥ V Kaynakça Dış bağlantılar Kategori:2015'te bilgisayar bilimi