130.20-gurux talabasi Sherbekov Quvonchbekning Blokcheyn texnalogiyasi fanidan
2 amaliy ishi.
SHA256 xeshlash algoritmi tarixiga oid malumotlar;
Hashing nima?
Xeshlash - bu xom ma'lumotni asl shakliga qaytara olmaydigan darajada shifrlash jarayoni. U ma'lumotni oladi va uni ochiq matnda matematik amallarni bajaradigan funksiya orqali o'tkazadi. Bu funktsiya xesh-funksiya deb ataladi va chiqish xash qiymati/digest deb ataladi.
Yuqoridagi rasmdan ko'rinib turibdiki, xesh funktsiyasi ochiq matnni tegishli xesh-dijestga aylantirish uchun javobgardir. Ular qaytarib bo'lmaydigan qilib yaratilgan, ya'ni sizning hazm bo'lishingiz kerak bo'lgan har qanday vosita bilan asl ochiq matnni taqdim etmasligi kerak. Xesh-funksiyalar, shuningdek, takrorlashlar sonidan qat'i nazar, kirish o'zgarmagan holda bir xil chiqish qiymatini ta'minlaydi.
Xeshlashning ikkita asosiy qo'llanilishi mavjud:
Parol xeshlari: Ko'pgina veb-sayt serverlarida foydalanuvchi parollarini serverda saqlashdan oldin xesh qiymatiga aylantiradi. U tizimga kirish paytida qayta hisoblangan xesh qiymatini tekshirish uchun ma'lumotlar bazasida saqlangan bilan solishtiradi.
Butunlikni tekshirish: Faylni veb-saytga yuklaganda, u o'z xeshini ham to'plam sifatida ulashdi. Foydalanuvchi uni yuklaganida, u xeshni qayta hisoblashi va ma'lumotlar yaxlitligini o'rnatish uchun solishtirishi mumkin.
Endi siz xesh-funksiyalarning ishlashini tushunganingizdan so'ng, qo'lingizdagi asosiy mavzuga qarang - SHA 256 algoritmi.
SHA-256 algoritmi nima?
SHA 256 SHA 2 algoritmlar oilasining bir qismi boʻlib, bu yerda SHA xavfsiz xash algoritmi degan maʼnoni anglatadi. 2001 yilda nashr etilgan, bu NSA va NIST o'rtasida qo'pol kuch hujumlariga qarshi asta-sekin kuchini yo'qotayotgan SHA 1 oilasining davomchisini joriy etish bo'yicha birgalikdagi sa'y-harakatlar edi .
Nomdagi 256 ning ahamiyati yakuniy xesh-dijest qiymatini bildiradi, ya'ni ochiq matn/aniq matn hajmidan qat'i nazar, xesh qiymati har doim 256 bit bo'ladi.
SHA oilasidagi boshqa algoritmlar SHA 256 ga koʻproq yoki kamroq oʻxshaydi. Endi ularning koʻrsatmalari haqida bir oz koʻproq maʼlumotga ega boʻling.
SHA-256 algoritmining xususiyatlari qanday?
SHA algoritmining o'ziga xos xususiyatlaridan ba'zilari quyidagilardir:
Xabar uzunligi: aniq matn uzunligi 264 bitdan kam bo'lishi kerak. Dijestni iloji boricha tasodifiy saqlash uchun o'lcham taqqoslash maydonida bo'lishi kerak.
Dijest uzunligi: Xesh-dijestning uzunligi SHA 256 algoritmida 256 bit, SHA-512 da 512 bit va hokazo bo'lishi kerak. Kattaroq dayjestlar, odatda, tezlik va bo'sh joy evaziga sezilarli darajada ko'proq hisob-kitoblarni taklif qiladi.
Qaytarib bo'lmaydigan: Dizaynga ko'ra, SHA 256 kabi barcha xesh funktsiyalari qaytarib bo'lmaydi. Oldindan dayjestga ega bo'lganingizda siz ochiq matnni olishingiz yoki uni xesh funktsiyasidan qayta o'tkazganingizda asl qiymatini ta'minlamasligingiz kerak.
Endi siz SHA uchun texnik talablar haqida adolatli tasavvurga ega bo'lganingizdan so'ng, keyingi bo'limda uning to'liq tartibi bilan tanishishingiz mumkin.
SHA-256 algoritmidagi qadamlar
To'liq jarayonni quyida aytib o'tilganidek, besh xil segmentga bo'lishingiz mumkin:
To'ldirish bitlari
U xabarga qo'shimcha bitlarni qo'shadi, shuning uchun uzunlik 512 ning ko'paytmasidan roppa-rosa 64 bitga kam bo'ladi. Qo'shish vaqtida birinchi bit bitta bo'lishi kerak, qolgan qismi esa nol bilan to'ldirilishi kerak.
Ushbu rasmada biz online kamplyator yordamida matni xeshlanganini ko’rishimiz mumkin.
Xeshlanadigan matn:
Sherbekov Quvonchbek
Xeshlangan matn: 0224aa70c4cca8c0b359953e5ed99a11c7a9cf0f66615ceb42e384c5015
Kod qismi phyton dasturlash tilida :
"""Ushbu Python moduli SHA-256 algoritmining amalga oshirilishidir.
https://github.com/keanemind/Python-SHA-256""" dan
K = [
0x428a2f98 , 0x71374491 , 0xb5c0fbcf , 0xe9b5dba5 , 0x3956c25b , 0x59f111f1 , 0x923f82a4 , 0xab15ed ,
0xd807aa98 , 0x12835b01 , 0x243185be , 0x550c7dc3 , 0x72be5d74 , 0x80deb1fe , 0x9bdc06a7 , 0xc19bf17 ,
0xe49b69c1 , 0xefbe4786 , 0x0fc19dc6 , 0x240ca1cc , 0x2de92c6f , 0x4a7484aa , 0x5cb0a9dc , 0x76f988da ,
0x983e5152 , 0xa831c66d , 0xb00327c8 , 0xbf597fc7 , 0xc6e00bf3 , 0xd5a79147 , 0x06ca6351 , 0x14292 ,
0x27b70a85 , 0x2e1b2138 , 0x4d2c6dfc , 0x53380d13 , 0x650a7354 , 0x766a0abb , 0x81c2c92e , 0x9522 ,
0xa2bfe8a1 , 0xa81a664b , 0xc24b8b70 , 0xc76c51a3 , 0xd192e819 , 0xd6990624 , 0xf40e3585 , 0x106a0 ,
0x19a4c116 , 0x1e376c08 , 0x2748774c , 0x34b0bcb5 , 0x391c0cb3 , 0x4ed8aa4a , 0x5b9cca4f , 0x682e , 0x682e ,
0x748f82ee , 0x78a5636f , 0x84c87814 , 0x8cc70208 , 0x90befffa , 0xa4506ceb , 0xbef9a3f7 , 0xc67178f2
]
def generate_hash(message: bytearray) -> bytearray:
"""Return a SHA-256 hash from the message passed.
The argument should be a bytes, bytearray, or
string object."""
if isinstance(message, str):
message = bytearray(message, 'ascii')
elif isinstance(message, bytes):
message = bytearray(message)
elif not isinstance(message, bytearray):
raise TypeError
# Padding
length = len(message) * 8 # len(message) is number of BYTES!!!
message.append(0x80)
while (len(message) * 8 + 64) % 512 != 0:
message.append(0x00)
message += length.to_bytes(8, 'big') # pad to 8 bytes or 64 bits
assert (len(message) * 8) % 512 == 0, "Padding did not complete properly!"
# Parsing
blocks = [] # contains 512-bit chunks of message
for i in range(0, len(message), 64): # 64 bytes is 512 bits
blocks.append(message[i:i+64])
# Setting Initial Hash Value
h0 = 0x6a09e667
h1 = 0xbb67ae85
h2 = 0x3c6ef372
h3 = 0xa54ff53a
h5 = 0x9b05688c
h4 = 0x510e527f
h6 = 0x1f83d9ab
h7 = 0x5be0cd19
# SHA-256 Hash Computation
for message_block in blocks:
# Prepare message schedule
message_schedule = []
for t in range(0, 64):
if t <= 15:
# adds the t'th 32 bit word of the block,
# starting from leftmost word
# 4 bytes at a time
message_schedule.append(bytes(message_block[t*4:(t*4)+4]))
else:
term1 = _sigma1(int.from_bytes(message_schedule[t-2], 'big'))
term2 = int.from_bytes(message_schedule[t-7], 'big')
term3 = _sigma0(int.from_bytes(message_schedule[t-15], 'big'))
term4 = int.from_bytes(message_schedule[t-16], 'big')
# append a 4-byte byte object
schedule = ((term1 + term2 + term3 + term4) % 2**32).to_bytes(4, 'big')
message_schedule.append(schedule)
assert len(message_schedule) == 64
# Initialize working variables
a = h0
b = h1
c = h2
d = h3
e = h4
f = h5
g = h6
h = h7
# Iterate for t=0 to 63
for t in range(64):
t1 = ((h + _capsigma1(e) + _ch(e, f, g) + K[t] +
int.from_bytes(message_schedule[t], 'big')) % 2**32)
t2 = (_capsigma0(a) + _maj(a, b, c)) % 2**32
h = g
g = f
f = e
e = (d + t1) % 2**32
d = c
c = b
b = a
a = (t1 + t2) % 2**32
# Compute intermediate hash value
h0 = (h0 + a) % 2**32
h1 = (h1 + b) % 2**32
h2 = (h2 + c) % 2**32
h3 = (h3 + d) % 2**32
h4 = (h4 + e) % 2**32
h5 = (h5 + f) % 2**32
h6 = (h6 + g) % 2**32
h7 = (h7 + h) % 2**32
return ((h0).to_bytes(4, 'big') + (h1).to_bytes(4, 'big') +
(h2).to_bytes(4, 'big') + (h3).to_bytes(4, 'big') +
(h4).to_bytes(4, 'big') + (h5).to_bytes(4, 'big') +
(h6).to_bytes(4, 'big') + (h7).to_bytes(4, 'big'))
def _sigma0(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 7) ^
_rotate_right(num, 18) ^
(num >> 3))
return num
def _sigma1(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 17) ^
_rotate_right(num, 19) ^
(num >> 10))
return num
def _capsigma0(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 2) ^
_rotate_right(num, 13) ^
_rotate_right(num, 22))
return num
def _capsigma1(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 6) ^
_rotate_right(num, 11) ^
_rotate_right(num, 25))
return num
def _ch(x: int, y: int, z: int):
"""As defined in the specification."""
return (x & y) ^ (~x & z)
def _maj(x: int, y: int, z: int):
"""As defined in the specification."""
return (x & y) ^ (x & z) ^ (y & z)
def _rotate_right(num: int, shift: int, size: int = 32):
"""Rotate an integer right."""
return (num >> shift) | (num << size - shift)
if __name__ == "__main__":
print(generate_hash("Hello").hex())
Dostları ilə paylaş: |