Seite 1 von 1

encrypt von perl zu python

Verfasst: Montag 15. Juni 2009, 16:39
von woolfy
Hallo zusammen,

ich bin leider noch ein ziemlicher Perl Anfänger und möchte folgende Perl Routine in Python umschreiben. Hab so meine Probleme die kompakte Schreibweise zu verstehen...

Code: Alles auswählen

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*',$_);
}
Es würde mir auch schon helfen, wenn hier jemand gut Perl kann und mir das etwas aufschlüsselt und das ganze etwas mehr ausschreibt.

Das Ganze ist für mich gerade, wie wenn ein Python Anfänger auf so nen Blödsinn stößt ;-)

Code: Alles auswählen

g=lambda x:x<<2;r=[g(i)|g(i-1)for i in range(16)]
Danke! :-)
Gruß
Jens

Verfasst: Montag 15. Juni 2009, 19:26
von problembär
Hallo,

also, das ist ganz übler Code, den Du da vorlegst :).

Schon beim - empfohlenen - Ausführen mit "use strict;" erhalte ich
Bareword "C" not allowed while "strict subs" in use at ./script.pl line 26.
Wahrscheinlich ist oben im Skript eine Zeile "use C;" oder so, die Du nicht genannt hast.

Ich kann versuchen, einen Teil zu interpretieren. Das sähe dann bei mir so aus:

Code: Alles auswählen

#!/usr/bin/perl

use warnings;
use strict;

sub Encrypt($$$) {

    do 'bigint.pl';
    my $a = shift(@_);
    my $n = shift(@_);
    my $m = shift(@_);
    my $d = 0;
    my $k;
    $a =~ s/^.(..)*$/0$&/;
    ($k = unpack('B*', pack('H*',$a))) =~ s/^0*//;
    my $x = &::badd(&::bmul(0, 16), hex$&);
    $n =~ s/./$x/ge;
    my $z = $n;
    my $w = ((2 * $d - 1 + $z) &~ 1) / 2;
    $a = substr($m . "\0" x $w, 0, $w);
    my $c = &::badd(&::bmul(0, 256), ord$&);
    $a = s/.|\n/$c/ge;
    my $r = &::bmod(&::bmul(1, 1), $x);
    my $t;
    $a = $k;
    $a =~ s/./$r=&::bmod(&::bmul($r, $r), $x), $&?$r = &::bmod(&::bmul($r,$c),$x):0,""/ge;

    while($w-- + 1 - 2 * $d) {
        $a = pack(C, $t) . $a;
    }

    $r = &::bdiv($r,256);
    $t = $a;
    return unpack('H*', $a);
}
Würd' mich ja mal interessieren, ob das auch so läuft ...

Schon das "($$$)" in

Code: Alles auswählen

sub Encrypt($$$) {}
sagt mir aber gar nichts.

Ansonsten, frag doch mal die Perl-Cracks. Die stehen auf sowas :mrgreen:.

Wenn die den Code so verständlich wie möglich gemacht haben, kannst Du Dich ja ggf. hier nochmal melden (da die es wohl weniger nach Python übersetzen möchten).

Gruß

Verfasst: Dienstag 16. Juni 2009, 15:40
von woolfy
Hallo problembär,

ja das Script ist fies. :-)
Bei mir lief das ohne Weiteres (keine use Anweisungen oder Ähnliches) in SciTE mit aktuellem Perl-Interpreter.
Allerdings musste ich auch die Warnings abschalten. ^^

Das hier..
sub Encrypt($$$) {}
verstehe ich so, dass pro $ ein Wert erwartet wird, wobei auf diese mittels shift zugegriffen wird.

Danke für den Tipp mit dem Perl-Forum, ich hab das da mal rein gestellt:
http://www.perl-community.de/bat/poard/thread/13643
(ich hoffe der Link verletzt keine Forenregeln) :-)

Gruß
Jens

Verfasst: Dienstag 16. Juni 2009, 19:26
von problembär
Hallo,

das ominöse

Code: Alles auswählen

do 'bigint.pl';
scheint sich auf

http://cpansearch.perl.org/src/GBARR/pe ... /bigint.pl

zu beziehen. Da sind jedenfalls diese Funktionen &badd(), &bmul() usw. genannt. Bei meiner Version steht noch:
This library is no longer being maintained, and is included for backward compatibility with Perl 4 programs which may require it ... Suggested alternative: Math::BigInt
pack() und unpack() gibt es auch in dem Python-Modul "struct". Weiß aber nicht, ob die voll kompatibel sind.

Könnte schwer werden, sehr Perl-spezifisch, das ganze.

Gruß

Verfasst: Sonntag 21. Juni 2009, 17:21
von problembär
So, hab mal das erste Beispiel von

http://www.cypherspace.org/adam/rsa/python.html

von diesen kryptischen Konstruktionen (lambda, map, reduce, filter) befreit (hoffentlich):

Code: Alles auswählen

#!/usr/bin/env python

import sys 
import string

def Encrypt(text, p, q):

    if '-d' in sys.argv:
        d = 1
    else:
        d = 0

    e = string.atol(p, 16)
    n = string.atol(q, 16)

    l = (len(q) + 1) / 2

    o = l - d
    inb = l - 1 + d

    for u in range(0, len(text), inb):

        s = text[u : u + inb]

        # Emuliere snums = map(ord, s):

        snums = []

        for i in s:
            snums.append(ord(i))

        # Emuliere "reduce()":

        b = 0
        for i in range(len(snums)):
            # Dies war in lambda:
            b = (b << 8L) + snums[i]

        b = pow(b, e, n)

        arr2 = []

        for i in range(o - 1, -1, -1):
            # Dies war in lambda:
            arr2.append(chr(b >> 8 * i & 255))

        for i in arr2:
            sys.stdout.write(i)

    print

Encrypt("This is a test.\n", "10001", "1967cb529")
Bin aber nicht sicher, ob's dasselbe tut wie der Perl-Code ...

Gruß

Edit: 1 Bug beseitigt; 2 Funktionen entfernt.
Edit 2: reduce() besser verstanden und Skript insoweit geändert.