Leser: 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
sub Encrypt($$$) { do 'bigint.pl'; $_ = shift; my $n = shift; my $m = shift; my $d = 0; my $k; s/^.(..)*$/0$&/;($k=unpack('B*', pack('H*', $_)))=~s/^0*//; my $x = 0; my $z = $n=~s/./$x=&::badd(&::bmul($x, 16), hex$&)/ge; my $w = ((2*$d-1+$z)&~1)/2; $_ = substr($m."\0"x$w, 0, $w); my $c = 0; s/.|\n/$c=&::badd(&::bmul($c, 256), ord$&)/ge; my $r = 1; my $t; $_ = $k; s/./$r=&::bmod(&::bmul($r, $r), $x), $&?$r=&::bmod(&::bmul($r, $c), $x):0,""/ge; ($r, $t)=&::bdiv($r, 256),$_=pack(C, $t).$_ while$w--+1-2*$d; return unpack('H*', $_); }
Guest JensWo kommt z.B. "C" aus Zeile 18 her?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
sub Encrypt($$$) { require Math::BigInt; # vorher: do 'bigint.pl'; my( $u, $n, $m ) = @_; # vorher: $u =~ s/^.(..)*$/0$&/; # verständlicher: $u = '0'. $u; $u = '0' if length($u) % 2 != 0; # ungerade anzahl an zeichen? # in $u befinden sich hexadezimale daten # diese werden zunächst in eine dezimalzahl umgewandelt(aus A wird 10) # dann wird die dezimalzahl in einen bitstring(einsen und nullen) umgewandelt # die daten liegen jetzt im little-endian format als bitstring vor # und landen in $k my $k = unpack( 'B*', pack( 'H*', $u ) ); $k =~ s/^0*//; # führende nullen entfernen # vorher: my $x = 0; # my $z = $n =~ s/./$x=&::badd(&::bmul($x, 16), hex$&)/ge; # verständlicher: my $x = Math::BigInt->bzero; my $z = length($n); for my $i ( 0 .. $z-1 ) { my $chr = substr( $n, $i, 1 ); next if $chr eq "\n"; # wahrscheinlich überflüssig $x->badd( $x->bmul(16), hex $chr ); substr( $n, $i, 1, $x->bstr ); } # for # ($z-1) & ~1 macht aus einer ungerade zahl die nächst kleinere gerade zahl # eine gerade zahl, bleibt dabei gerade # diese nun gerade zahl, wird durch 2 geteilt, das ergebnis landet in $w my $w = ( ($z-1) & ~1 ) / 2; # damit in $u auf jeden fall "$w" zeichen landen, werden an $m "$w" nullbytes angehängt # dann werden von beginn dieser zeichenkette die ersten "$w" zeichen genommen und in $u gepackt $u = substr( $m . "\0" x $w, 0, $w ); # vorher: $c = 0; # $u =~ s/.|\n/$c=&::badd(&::bmul($c, 256), ord$&)/ge; # verständlicher: my $c = Math::BigInt->bzero; for my $i ( 0 .. length($u)-1 ) { my $chr = substr( $u, $i, 1 ); $c->badd( $c->bmul(256), ord $chr ); substr( $u, $i, 1, $c->bstr ); } # for my $r = Math::BigInt->bone; my $t; $u = $k; # $u wird wieder auf den anfangs erzeugten bitstring gesetzt # vorher: $u =~ s/./$r=&::bmod(&::bmul($r, $r), $x), $&?$r=&::bmod(&::bmul($r, $c), $x):0,""/ge; # verständlicher: for my $i ( 0 .. length($u)-1 ) { my $chr = substr( $u, $i, 1 ); $r->bmod( $r->bmul($r), $x ); if ( $chr == 1 ) { $r->bmod( $r->bmul($c), $x ); substr( $u, $i, 1, $r->bstr ); } # if else { substr( $u, $i, 1, '' ); } # else } # for # was hier noch passiert, kann ich dir leider auch nicht sagen: while ( $w-- + 1 ) { ( $r, $t ) = $r->bdiv(256); $u = pack( 'C', $t->bstr ) . $u; } # while return unpack( 'H*', $u ); } # Encrypt
Guest GastCode (perl): (dl )1 2 3 4 5# was hier noch passiert, kann ich dir leider auch nicht sagen: while ( $w-- + 1 ) { ( $r, $t ) = $r->bdiv(256); $u = pack( 'C', $t->bstr ) . $u; } # while