Merhaba dostlar bu gün sizlerle chatgpt ile cebelleşerek yaptığım sha256 algoritmasını paylaşıp mantığını göstermeye çalışacağım.
Normalde dillerde gömülü olarak gelen bu algoritmanın aslında nasıl çalıştığını göstermek oldukça faydalı olur diye düşündüm.
Peki bu sha256 nedir?
Algoritma kullanıcı şifrelerinin geri döndürülemez bir biçimde veri tabanında tutulması için geliştirilmiştir. Amacı veri tabanı hırsızlığından kaynaklı olarak şifrelerin ele geçirilse de okunamaz halde tutulmasını sağlamak ve avantajı decode(çözümleme,Geri döndürme) işlemi yapılamamasıdır.
Böylelikle çalınan şifreler hacker tarafından okunamaz.
Günümüzde sha 256 yerini bcrypt'e bırakmış (en son çıkanı php tarafında "ARGON2ID" dır.) ancak hala kullanımı yaygındır.
PHP:
<?php
function captainregenerate($mesaj)
{
// Initialize variables
$captainh = [
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
];
// Pre-processing: padding the mesaj
$captainbit = strlen($mesaj);
$captainbityen = $captainbit * 8;
// Append "1" bit to mesaj
$mesaj .= chr(0x80);
// Append "0" bits until mesaj length in bits ≡ 448 (mod 512)
while ((strlen($mesaj) % 64) != 56) {
$mesaj .= chr(0);
}
// Append original length in bits mod 2^64 to mesaj
$mesaj .= pack('N2', 0, $captainbityen); // 64-bit big-endian
// Process the mesaj in successive 512-bit mesajyen:
$mesajyen = str_split($mesaj, 64);
foreach ($mesajyen as $mesajyeni) {
// Break mesajyeni into sixteen 32-bit words w[j], 0 ≤ j ≤ 15
$w = array_values(unpack('N16', $mesajyeni));
// Extend the sixteen 32-bit words into sixty-four 32-bit words
for ($i = 16; $i < 64; $i++) {
$s0 = rightRotate($w[$i-15], 7) ^ rightRotate($w[$i-15], 18) ^ ($w[$i-15] >> 3);
$s1 = rightRotate($w[$i-2], 17) ^ rightRotate($w[$i-2], 19) ^ ($w[$i-2] >> 10);
$w[$i] = ($w[$i-16] + $s0 + $w[$i-7] + $s1) & 0xFFFFFFFF;
}
// Initialize hash value for this mesajyeni
list($a, $b, $c, $d, $e, $f, $g, $captainh0) = $captainh;
// Main loop
for ($i = 0; $i < 64; $i++) {
$s1 = rightRotate($e, 6) ^ rightRotate($e, 11) ^ rightRotate($e, 25);
$ch = ($e & $f) ^ ((~$e) & $g);
$temp1 = ($captainh0 + $s1 + $ch + K($i) + $w[$i]) & 0xFFFFFFFF;
$s0 = rightRotate($a, 2) ^ rightRotate($a, 13) ^ rightRotate($a, 22);
$maj = ($a & $b) ^ ($a & $c) ^ ($b & $c);
$temp2 = ($s0 + $maj) & 0xFFFFFFFF;
$captainh0 = $g;
$g = $f;
$f = $e;
$e = ($d + $temp1) & 0xFFFFFFFF;
$d = $c;
$c = $b;
$b = $a;
$a = ($temp1 + $temp2) & 0xFFFFFFFF;
}
// Add this mesajyeni's hash to result so far:
$captainh[0] = ($captainh[0] + $a) & 0xFFFFFFFF;
$captainh[1] = ($captainh[1] + $b) & 0xFFFFFFFF;
$captainh[2] = ($captainh[2] + $c) & 0xFFFFFFFF;
$captainh[3] = ($captainh[3] + $d) & 0xFFFFFFFF;
$captainh[4] = ($captainh[4] + $e) & 0xFFFFFFFF;
$captainh[5] = ($captainh[5] + $f) & 0xFFFFFFFF;
$captainh[6] = ($captainh[6] + $g) & 0xFFFFFFFF;
$captainh[7] = ($captainh[7] + $captainh0) & 0xFFFFFFFF;
}
// Produce the final hash value (big-endian) as a 256 bit number:
return sprintf(
'%08x%08x%08x%08x%08x%08x%08x%08x',
$captainh[0], $captainh[1], $captainh[2], $captainh[3], $captainh[4], $captainh[5], $captainh[6], $captainh[7]
);
}
function rightRotate($x, $n)
{
return ($x >> $n) | (($x << (32 - $n)) & 0xFFFFFFFF);
}
function K($i)
{
static $k = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
];
return $k[$i];
}
$input = "akar_.,?bc1234";
echo captainregenerate($input);
?>
captainregenerate() fonksiyonu, parametre olarak aldığı $mesaj (metin) üzerinde SHA-256 hash işlemi gerçekleştirir.
Fonksiyonun başında $captainh dizisi tanımlanmıştır. Bu dizi, SHA-256 algoritmasında kullanılacak başlangıç sabitlerini içerir.
Verilen mesajın sonuna öncelikle bir bit (binary 1) eklenir ($mesaj .= chr(0x80). Sonra mesajın uzunluğunu bit cinsinden hesaplayıp, mesajın uzunluğunu 448 (mod 512) olacak şekilde sıfırlarla doldurur. Son olarak mesajın asıl uzunluğunu 64-bit cinsinden ekler.
Mesaj, 64 karakterlik bloklara bölünür ($mesajyen = str_split($mesaj, 64). Her bir blok, 512-bit'lik bir mesajyeni oluşturur.
Her bir mesajyeni için aşağıdaki adımlar uygulanır:
- Mesajyeni 16 adet 32-bit kelimeye (w[j]) bölünür.
- Bu 16 kelime, 64 kelimeye genişletilir. Genişleme işlemi, her bir kelime için özel olarak belirlenmiş matematiksel işlemleri içerir.
Hash değeri hesaplaması için başlangıçta $captainh0'dan başlayarak a, b, c, d, e, f, g değişkenlerine ilk değerler atanır.
Her bir mesajyeni için 64 adet işlem yapılır. Her bir işlem, SHA-256 algoritmasının tanımlı adımlarını (bit kaydırmaları, XOR işlemleri, toplamalar vb.) içerir.
Her bir mesajyeni işlendikten sonra, son değerler, $captainh dizisine toplanır ve bu dizi, son hash değerini oluşturur.
Son olarak, sprintf() fonksiyonu kullanılarak $captainh dizisinin elemanları büyük-endian formatında birleştirilir ve 256-bitlik bir hash değeri olarak döndürülür.
rightRotate() fonksiyonu, verilen bir 32-bit sayıyı belirli bir miktar sağa döndürür. K() fonksiyonu, SHA-256 algoritmasında kullanılacak sabit değerleri döndürür.
Sha 256 algoritmasının arkada hangi parametrelerle yapıldığı burada detaylıca anlatılmıştır.
İyi Forumlar
Her bir mesajyeni için 64 adet işlem yapılır. Her bir işlem, SHA-256 algoritmasının tanımlı adımlarını (bit kaydırmaları, XOR işlemleri, toplamalar vb.) içerir.
Her bir mesajyeni işlendikten sonra, son değerler, $captainh dizisine toplanır ve bu dizi, son hash değerini oluşturur.
Son olarak, sprintf() fonksiyonu kullanılarak $captainh dizisinin elemanları büyük-endian formatında birleştirilir ve 256-bitlik bir hash değeri olarak döndürülür.
rightRotate() fonksiyonu, verilen bir 32-bit sayıyı belirli bir miktar sağa döndürür. K() fonksiyonu, SHA-256 algoritmasında kullanılacak sabit değerleri döndürür.
Sha 256 algoritmasının arkada hangi parametrelerle yapıldığı burada detaylıca anlatılmıştır.
İyi Forumlar

