Witam!
Chciałbym się przywitać,pierwszy post i z góry przeprosić - wiem że odkopuję temat z przed 7 miesięcy,ale według mnie jest na tyle ciekawy aby go odkopać.
Zakładamy że mamy funkcję hashującą,która w moim wypadku dla jednej linijki wygląda tak(dla całego pliku wystarczyłoby zliczyć wszystkie znaki):
Kod:
sub hash {
$xd = shift;
for($i = 0;$i < length($xd);$i++)
{
$plik += ord(substr $xd,$i,1);
}
return $plik % 999;
}
Hm,wygląda nadzwyczaj mądrze,jednakże ma jedną podstawową wadę - dzielenie modulo.Co z nim?Jak wiemy,dzielenie modulo to reszta z dzielenia,ok.Nawet gdybyśmy mieli całą biblię,dającą sumę znaków 09582095382093512414,a dzielone modulo wychodziłoby 24,dzielone modulo znów dawałoby...24.
Idźmy więc tym tropem,może 24 jedynki dawałby radę?
Niestety,funkcja "ord" dla "1" daje 43,więc zamiast sumy 24*1=24 mielibyśmy 1032,co mod 999 daje 33(dosyć mylące).
Z pomocą i odsieczą przybyła funkcja chr(),której siostra ord() da w końcu 1.
Więc jak wyglądałby program generujący plik,który dla powyższej funkcji generowałby określony hash?
Kod:
die "brak kodu do odhaszowania" unless($ARGV[0]);
open $fh,">urodziny.txt" or die "Nie ma takiego pliku";
use warnings;
$hash = chr(1) x $ARGV[0];
if($ARGV[0] == hash($hash))
{
print $fh $hash;
print "atak urodzinowy się udał się,jest w pliku urodziny.txt";
exit();
}
(Wybaczcie,że nie mam zwyczaju pisania tych komentarzy na początku...ale korzystam z ActiveState,więc jak dla mnie jest to zbędne).
Tak,być może nie jest to atak urodzinowy,ale hasze mamy takie same,więc to tak bardziej haksorsko,heh.
Pozdrawiam i dziękuję za uwagę,z chęcią posłucham opinii i ew.błędów. ;x