Thread möchte cryptische Routine verstehen (5 answers)
Opened by Jens at 2009-06-16 16:28

Gast Gast
 2009-06-16 17:59
#122543 #122543
Ich habs mal versucht etwas verständlicher zu schreiben. Allerdings habe ich keine Ahnung, ob das was ich da gemacht habe, auch das Selbe tut, wie der Originalcode, und ob meine Erklärungen korrekt sind:
Code (perl): (dl )
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

View full thread möchte cryptische Routine verstehen