Lyra2 - Lyra2

Lyra2 bir şifre karma şeması (PHS) olarak da çalışabilir anahtar türetme işlevi (KDF). Sırasında özel bir takdir aldı. Şifre Karma Yarışması Temmuz 2015'te.[1]tarafından kazanıldı Argon2. Orijinal amaçları için kullanılmasının yanı sıra, Lyra2REv2 gibi iş kanıtı algoritmalarının da çekirdeğinde yer almaktadır,[2] Vertcoin tarafından benimsenen,[3] MonaCoin,[4] diğer kripto para birimleri arasında[5]Lyra2, Marcos A.Simplicio Jr., Leonardo C. Almeida, Ewerton R. Andrade, Paulo C. F. dos Santos ve Paulo S. L. M. Barreto itibaren Escola Politécnica da Universidade de São Paulo.[6] Lyra'ya göre bir gelişme,[7][8] daha önce aynı yazarlar tarafından önerildi. Lyra2, aşağıdakiler dahil olmak üzere selefinin güvenliğini, verimliliğini ve esnekliğini korur: (1) algoritma tarafından kullanılacak istenen bellek miktarını, işlem süresini ve paralelliği yapılandırma yeteneği; ve (2) aşağıdakilerle elde edilene benzer bir işlem süresiyle yüksek bellek kullanımı sağlama kapasitesi şifrelemek. Ek olarak, selefi ile karşılaştırıldığında aşağıdaki iyileştirmeleri getiriyor:[9]

  • aşağıdakileri içeren saldırı alanlarına karşı daha yüksek bir güvenlik seviyesi sağlar zaman belleği değiş tokuşları
  • meşru kullanıcıların, paralellik kendi platformlarının yetenekleri
  • inşaatı ile ilgili maliyetleri artırmak için ince ayarlar içerir adanmış donanım algoritmaya saldırmak
  • karşı direnci dengeler yan kanal tehditleri ve daha ucuza (ve dolayısıyla daha yavaş) dayanan saldırılar depolama aygıtları
  • Lyra2 altında yayınlandı kamu malı ve iki ana uzantı sağlar:[10]
  • Lyra2-δ, kullanıcıya algoritmanın bant genişliği kullanımı üzerinde daha iyi kontrol sağlar
  • Lyra2p, yasal kullanıcı platformundaki paralellik yeteneklerinden yararlanır

Bu algoritma aşağıdakiler açısından parametreleştirmeyi sağlar:[10]

  • yürütme süresi (zaman maliyeti )
  • hafıza gerekli (satır sayısı ve sütun sayısı )
  • paralellik derecesi (sayısı İş Parçacığı )
  • temelde yatan permütasyon işlevi (ana kriptografik ilkel olarak görülebilir)
  • temel permütasyon işlevi tarafından kullanılan blok sayısı (bit hızı)
  • temel permütasyon işlevi için gerçekleştirilen tur sayısı ()
  • rotasyonlarda kullanılacak bit sayısı ()
  • çıktı uzunluğu ()

Güçlü

Algoritmanın temel güçlü yönleri şunlardır:[5][10]

  • İşlem belleği değiş tokuşlarına karşı yüksek direnç: tahmini işlem maliyetleri düşük bellek kullanımına sahip saldırılar yeniden hesaplamalar nedeniyle zaman maliyetiyle katlanarak büyüyen bir faktör içerir
  • Bellek ve zaman maliyetleri ayrıştırılarak kaynakların kullanımında ince ayar yapılabilir
  • Algoritmanın çekirdeğinde azaltılmış yuvarlak sünger işlevi kullanılması nedeniyle hızlı
  • İstenilen uzunlukta çıktılar sağlayabilir, bir anahtar türetme işlevi (KDF)
  • Tasarım direnci birleştirir yan kanal saldırıları (tüm Kurulum aşaması boyunca) ve ucuz içeren saldırılara (dolayısıyla, düşük hızlı) hafıza cihazları, bu tür çelişkili gereksinimleri dengelemeyi amaçlayan
  • Aşağıdakiler gibi meşru platformda yürütmeyi optimize ederken saldıran platformlara karşı koruma sağlamak için çok çeşitli yapılandırmaları dikkate alır:
    • Paralellik desteği çok çekirdekli platformlar çok avantaj sağlamadan GPU tabanlı saldırılar
    • Hedef platforma bağlı olarak farklı temel sünger işlevlerini kullanma yeteneği (ör. BLAKE2b yazılım uygulamaları için; Keccak donanım uygulamaları için; BlaMka donanım platformlarına karşı ek direnç için; vb.)
    • Algoritmanın bellek bant genişliği kullanımını artırma yeteneği (not: orijinal spesifikasyonun mevcut makinelerde bant genişliğini en üst düzeye çıkarması beklenir, ancak özellik gelecekteki donanımlar için yararlı olabilir)

Tasarım

Herhangi bir PHS gibi, Lyra2 bir girdi olarak alır tuz ve bir parola, yaratmak sözde rasgele daha sonra kriptografik algoritmalar için anahtar materyal olarak veya bir kimlik doğrulama dize.[11][başarısız doğrulama ][kaynak belirtilmeli ]

Dahili olarak, şemanın belleği, tüm şifre karma işlemi sırasında bellekte kalması beklenen bir matris olarak düzenlenir: hücreleri yinelemeli olarak okunduğu ve yazıldığı için, belleği kaydetmek için bir hücrenin atılması, erişildiğinde yeniden hesaplama ihtiyacına yol açar. bir kez daha, en son değiştirildiği noktaya kadar.[5]

Matrisin inşası ve ziyareti, temeldeki emiş, sıkma ve dubleks işlemlerinin durumsal bir kombinasyonu kullanılarak yapılır. sünger (yani, dahili durumu asla sıfırlanmaz), tüm sürecin sıralı doğasını sağlar.

Ayrıca, matris hücrelerinin başlatıldıktan sonra tekrar ziyaret edilme sayısı kullanıcı tarafından belirlenir ve Lyra2'nin yürütme süresinin hedef platformun kaynaklarına göre ince ayarlanmasına izin verir.

# *** İşlevler / semboller ***# || İki dizeyi birleştir# ^ Bitsel ÖZELVEYA# [+] Kelime olarak ekleme işlemi (yani, kelimeler arasında taşımaları yok sayma)#% Modül# W Hedef makinenin kelime boyutu (genellikle 32 veya 64)# omega Döndürmelerde kullanılacak bit sayısı (önerilen: makinenin kelime boyutunun bir katı, W)# >>> Sağa dönüş# rho Azaltılmış sıkıştırma veya dupleksleme işlemleri için tur sayısı# blen Sponge'un bayt cinsinden blok boyutu # H veya H_i Blok boyutu blen (bayt cinsinden) ve temelde permütasyonlu sünger f# H.absorb (giriş) Süngerin girişte emme işlemi# H.squeeze (len) Süngerin len baytları sıkıştırma işlemi# H.squeeze_ {rho} (len) Sponge'un f'nin rho turlarını kullanarak len baytları sıkıştırma işlemi# H.duplexing (input, len) Süngerin girdi üzerinde dupleksleme işlemi, len baytları üretiyor# H.duplexing_ {rho} (input, len) Sünger'in girişte çift yönlü işlemi, f'nin rho turlarını kullanarak, len baytları üretiyor# pad (string) Bir dizeyi birden fazla blen bayta doldurur (dolgu kuralı: 10 * 1)# lsw (girdi) En az anlamlı girdi sözcüğü# len (string) Bir dizenin bayt cinsinden uzunluğu# syncThreads () Paralel iş parçacıklarını eşitle# swap (input1, input2) İki girişin değerini değiştirin# C Bellek matrisindeki sütun sayısı (genellikle 64, 128, 256, 512 veya 1024)# P Paralellik derecesi (P> = 1 ve (m_cost / 2)% P = 0)# *** Girişler ***# parola# tuz# t_cost# m_cost# outlen# *** Paralellik içermeyen algoritma ***# ** Önyükleme aşaması: Süngerin durumunu ve yerel değişkenleri başlatır# Giriş parametrelerinin bayt gösterimi (diğerleri eklenebilir)parametreler =  outlen || len(parola) || len(tuz) || t_cost || m_cost || C# Süngerin durumunu başlatır (bundan sonra şifrenin üzerine yazılabilir)H.emmek( ped(parola || tuz || parametreler) )# Ziyaret adımını, penceresini ve beslenecek ilk satırları başlatır boşluk = 1stp = 1wnd = 2sqrt = 2önceki0 = 2satır1 = 1önceki1 = 0# ** Kurulum aşaması: Bir (m_cost x C) bellek matrisini başlatır, hücrelerinde blen-bayt hücrelere sahiptir# M [0], M [1] ve M [2] 'yi başlatıriçin col = 0 -e C-1	M[0][C-1-col] = H.suyunu sıkmak_{rho}(blen)için col = 0 -e C-1	M[1][C-1-col] = H.duplexing_{rho}( M[0][col], blen)için col = 0 -e C-1	M[2][C-1-col] = H.duplexing_{rho}( M[1][col], blen)# Dolum Döngüsü: kalan satırları başlatıriçin satır0 = 3 -e m_cost-1	# Sütun Döngüsü: M [satır0] başlatılır ve M [satır1] güncellenir	için col = 0 -e C-1		rand = H.duplexing_{rho}( M[satır1][col] [+] M[önceki0][col] [+] M[önceki1][col], blen)		M[satır0][C-1-col] = M[önceki0][col] ^ rand		M[satır1][col] = M[satır1][col] ^ ( rand >>> omega )	Bir sonraki döngüde yeniden ziyaret edilecek satır sayısı	önceki0 = satır0	önceki1 = satır1	satır1 = (satır1 + stp) % wnd	# Pencere tamamen yeniden ziyaret edildi	Eğer (satır1 = 0)		# Pencereyi ikiye katlar ve adımı ayarlar		wnd = 2 * wnd		stp = sqrt + boşluk		boşluk = -boşluk				# Her yinelemede sqrt'yi ikiye katlar		Eğer (boşluk = -1)			sqrt = 2 * sqrt	# ** Dolaşma aşaması: Yinelemeli olarak bellek matrisinin sözde rasgele hücrelerinin üzerine yazar# Visitation Loop: (2 * m_cost * t_cost) satır sözde rasgele biçimde yeniden ziyaret edildiiçin wCount = 0 -e ( (m_cost * t_cost) - 1)	# Sözde rasgele satırları seçer	satır0 = lsw(rand) % m_cost	satır1 = lsw( rand >>> omega ) % m_cost	# Sütun Döngüsü: hem M [satır0] hem de M [satır1] 'i günceller	için col = 0 -e C-1		# Sözde rasgele sütunları seçer		col0 = lsw( ( rand >>> omega ) >>> omega ) % C		col1 = lsw( ( ( rand >>> omega ) >>> omega ) >>> omega ) % C		rand = H.duplexing_{rho}( M[satır0][col] [+] M[satır1][col] [+] M[önceki0][col0] [+] M[önceki1][col1], blen)		M[satır0][col] = M[satır0][col] ^ rand		M[satır1][col] = M[satır1][col] ^ ( rand >>> omega )	# Sonraki yineleme, en son güncellenen satırları yeniden ziyaret eder	önceki0 = satır0	önceki1 = satır1# ** Sonuç aşaması: çıktı hesaplaması# Son kolonu tam yuvarlak bir süngerle emerH.emmek( M[satır0][0] )# Tam yuvarlak bir süngerle dış uçları sıkarçıktı = H.suyunu sıkmak(outlen)# Çıktı olarak outlen-long bitstring sağlardönüş çıktı# *** Paralellik içeren algoritma ***için her biri ben içinde [0,P[	# ** Önyükleme aşaması: Süngerin durumunu ve yerel değişkenleri başlatır		# Giriş parametrelerinin bayt gösterimi (diğerleri eklenebilir)	parametreler =  outlen || len(parola) || len(tuz) || t_cost || m_cost || C || P || ben	# Süngerin durumunu başlatır (bundan sonra şifrenin üzerine yazılabilir)	Selam.emmek( ped(parola || tuz || parametreler) )	# Beslenecek ziyaret adımını, penceresini ve ilk satırları başlatır 	boşluk = 1	stp = 1	wnd = 2	sqrt = 2	eşitleme = 4	j = ben	önceki0 = 2	rowP = 1	prevP = 0	# ** Kurulum aşaması: Bir (m_cost x C) bellek matrisini başlatır, hücrelerinde blen-bayt hücrelere sahiptir	# M_i [0], M_i [1] ve M_i [2] 'yi başlatır	için col = 0 -e C-1		Mi[0][C-1-col] = Selam.suyunu sıkmak_{rho}(blen)	için col = 0 -e C-1		Mi[1][C-1-col] = Selam.duplexing_{rho}( Mi[0][col], blen)	için col = 0 -e C-1		Mi[2][C-1-col] = Selam.duplexing_{rho}( Mi[1][col], blen)	# Dolum Döngüsü: kalan satırları başlatır	için satır0 = 3 -e ( (m_cost / P) - 1 )		# Sütun Döngüsü: M_i [satır0] başlatılır ve M_j [satır1] güncellenir		için col = 0 -e C-1			rand = Selam.duplexing_{rho}( M_j[rowP][col] [+] Mi[önceki0][col] [+] M_j[prevP][col], blen)			Mi[satır0][C-1-col] = Mi[önceki0][col] ^ rand			M_j[rowP][col] = M_j[rowP][col] ^ ( rand >>> omega )		Bir sonraki döngüde yeniden ziyaret edilecek satır sayısı		önceki0 = satır0		prevP = rowP		rowP = (rowP + stp) % wnd		# Pencere tamamen yeniden ziyaret edildi		Eğer (rowP = 0)			# Pencereyi ikiye katlar ve adımı ayarlar			wnd = 2 * wnd			stp = sqrt + boşluk			boşluk = -boşluk					# Her yinelemede sqrt'yi ikiye katlar			Eğer (boşluk = -1)				sqrt = 2 * sqrt				# Eşitleme noktası		Eğer (satır0 = eşitleme)			eşitleme = eşitleme + (sqrt / 2)			j = (j + 1) % P			syncThreads()	syncThreads()		# ** Gezinme aşaması: Yinelemeli olarak bellek matrisinin sözde rasgele hücrelerinin üzerine yazar	wnd = m_cost / (2 * P)	eşitleme = sqrt	kapalı0 = 0	offP = wnd	# Visitation Loop: (2 * m_cost * t_cost / P) satır sözde rasgele biçimde yeniden ziyaret edildi	için wCount = 0 -e ( ( (m_cost * t_cost) / P) - 1)		# Sözde rasgele satırları ve dilimleri seçer (j)		satır0 = kapalı0 + (lsw(rand) % wnd)		rowP = offP + (lsw( rand >>> omega ) % wnd)		j = lsw( ( rand >>> omega ) >>> omega ) % P		# Sütun Döngüsü: M_i [satır0] 'ı güncelleyin		için col = 0 -e C-1			# Sözde rasgele sütun seçer			col0 = lsw( ( ( rand >>> omega ) >>> omega ) >>> omega ) % C			rand = Selam.duplexing_{rho}( Mi[satır0][col] [+] Mi[önceki0][col0] [+] M_j[rowP][col], blen)			Mi[satır0][col] = Mi[satır0][col] ^ rand		# Sonraki yineleme, en son güncellenen satırları yeniden ziyaret eder		önceki0 = satır0				# Eşitleme noktası		Eğer (wCount = eşitleme)			eşitleme = eşitleme + sqrt			takas(kapalı0,offP)			syncThreads()	syncThreads()	# ** Sonuç aşaması: çıktı hesaplaması	# Son kolonu tam yuvarlak bir süngerle emer	Selam.emmek( Mi[satır0][0] )	# Tam yuvarlak bir süngerle dış uçları sıkar	output_i = Selam.suyunu sıkmak(outlen)# Çıktı olarak outlen-long bitstring sağlardönüş output_0 ^ ... ^ çıktı_{P-1}

Güvenlik analizi

Lyra2'ye karşı, kullanan saldırıların işlem maliyeti yasal bir kullanıcı tarafından kullanılan bellek miktarının ve ikincisi daha iyi bir tahmindir , onun yerine bellek miktarı olduğunda elde edilir , nerede bir işlem süresini tanımlamak için kullanıcı tanımlı bir parametredir.

Bu şununla iyi karşılaştırır şifrelemek maliyetini gösteren hafıza kullanımı ne zaman ,[12] ve literatürdeki diğer çözümlerle, sonuçların genellikle .[7][13][14][15]

Bununla birlikte, pratikte bu çözümler genellikle şu değeri içerir: (bellek kullanımı) aynı işlem süresi için Lyra2 ile elde edilenlerden daha düşük.[16][17][18][19][20]

Verim

C = 256, ρ = 1, p = 1 ve farklı T ve R ayarları için SSE özellikli Lyra2'nin performansı, minimum parametrelere sahip SSE etkin scrypt ve hafızası zor PHC finalistlerine kıyasla.

Lyra2'nin bir SSE tek çekirdekli uygulamasıyla elde edilen işlem süresi, burada gösterilen şekilde gösterilmektedir. Bu rakam,[21] ve PHC bağlamında gerçekleştirilen üçüncü taraf karşılaştırmalarına çok benzer.[16][17][18][19][20]

Gösterilen sonuçlar, Lyra2'nin ortalama yürütme süresine karşılık gelir. , , bitler (yani, iç durum 256 bit'e sahiptir) ve farklı ve ayarlar, olası parametre kombinasyonları ve kaynakların karşılık gelen kullanımı hakkında genel bir fikir verir.

Bu şekilde gösterildiği gibi Lyra2, 400 MB'ye kadar kullanırken 1 saniyeden daha az ve ) veya 1 GB'a kadar bellek ( ve ); veya 1,6 GB ile 5 saniyeden kısa sürede ( ve ).

Tüm testler bir Intel Xeon E5-2430 (12 Çekirdekli 2,20 GHz, 64 bit) 48 GB DRAM, koşuyor Ubuntu 14.04 LTS 64 bit ve kaynak kodu kullanılarak derlendi gcc 4.9.2.[21]

Referanslar

  1. ^ "Şifre Karma Yarışması". password-hashing.net. Alındı 2016-03-22.
  2. ^ "Lyra2REv2". eprint.iacr.org. Alındı 2016-03-22.
  3. ^ "Vertcoin". vertcoin.org. Alındı 2019-10-08.
  4. ^ "MonaCoin". monacoin.org. Alındı 2019-10-08.
  5. ^ a b c van Beirendonck, M .; Trudeau, L .; Giard, P .; Balatsoukas-Stimming, A. (2019-05-29). Lyra2REv2 Tabanlı Kripto Para Birimleri için Lyra2 FPGA Çekirdeği. IEEE Uluslararası Devreler ve Sistemler Sempozyumu (ISCAS). Sapporo, Japonya: IEEE. s. 1–5. arXiv:1807.05764. doi:10.1109 / ISCAS.2019.8702498.
  6. ^ "Cryptology ePrint Arşivi: Rapor 2015/136". eprint.iacr.org. Alındı 2016-03-22.
  7. ^ a b Almeida, Leonardo C .; Andrade, Ewerton R .; Barreto, Paulo S. L. M .; Simplicio Jr, Marcos A. (2014-01-04). "Lyra: ayarlanabilir hafıza ve işlem maliyetleri ile şifre tabanlı anahtar türetme". Kriptografi Mühendisliği Dergisi. 4 (2): 75–89. CiteSeerX  10.1.1.642.8519. doi:10.1007 / s13389-013-0063-5. ISSN  2190-8508.
  8. ^ "Cryptology ePrint Arşivi: Rapor 2014/030". eprint.iacr.org. Alındı 2016-03-22.
  9. ^ Andrade, E .; Simplicio Jr, M .; Barreto, P .; Santos, P. (2016/01/01). "Lyra2: zaman-hafıza değişimlerine karşı yüksek güvenlikli verimli şifre hashing". Bilgisayarlarda IEEE İşlemleri. PP (99): 3096–3108. doi:10.1109 / TC.2016.2516011. ISSN  0018-9340.
  10. ^ a b c Simplicio Jr, Marcos A .; Almeida, Leonardo C .; Andrade, Ewerton R .; Santos, Paulo C .; Barreto, Paulo S.L.M. "Lyra2 başvuru kılavuzu" (PDF). PHC. Şifre Karma Yarışması.
  11. ^ Chen Lily (2009). "Sözde Rastgele İşlevleri Kullanarak Anahtar Türetme Önerisi (Gözden Geçirildi)" (PDF). Bilgisayar Güvenliği. NIST. doi:10.6028 / NIST.SP.800-108.
  12. ^ Percival, Colin. "Sıralı Bellek Zor İşlevleri Yoluyla Daha Güçlü Anahtar Türetme" (PDF). TARSNAP. Teknik BSD Konferansı.
  13. ^ "Cryptology ePrint Arşivi: Rapor 2013/525". eprint.iacr.org. Alındı 2016-03-22.
  14. ^ Schmidt, Sascha. "Catena Password-Scrambling Çerçevesinin Uygulanması" (PDF). Bauhaus-Universität Weimar. Medya Fakültesi.
  15. ^ "P-H-C / phc kazanan-argon2" (PDF). GitHub. Alındı 2016-03-22.
  16. ^ a b "Gmane - Başka bir PHC adayları mekanik testler". article.gmane.org. Alındı 2016-03-22.
  17. ^ a b "Gmane - Günlük Lyra2 için bir inceleme". article.gmane.org. Alındı 2016-03-22.
  18. ^ a b "Gmane - Lyra2 ilk incelemesi". article.gmane.org. Alındı 2016-03-22.
  19. ^ a b "Gmane - Bellek performansı ve ASIC saldırıları". article.gmane.org. Alındı 2016-03-22.
  20. ^ a b "Gmane - Argon'un hızlı analizi". article.gmane.org. Alındı 2016-03-22.
  21. ^ a b Andrade, E .; Simplicio Jr, M .; Barreto, P .; Santos, P. (2016/01/01). "Lyra2: zaman-hafıza değişimlerine karşı yüksek güvenlikli verimli şifre hashing". Bilgisayarlarda IEEE İşlemleri. PP (99): 3096–3108. doi:10.1109 / TC.2016.2516011. ISSN  0018-9340.

Dış bağlantılar