encrypt von perl zu python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
woolfy
User
Beiträge: 19
Registriert: Montag 6. Februar 2006, 15:14
Wohnort: Stuttgart

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
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ß
woolfy
User
Beiträge: 19
Registriert: Montag 6. Februar 2006, 15:14
Wohnort: Stuttgart

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
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ß
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.
Antworten