[PHP] RSA-algoritme in PHP: probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb geprobeerd het RSA-algoritme te scripten in PHP, ik heb nu al heel lang aan het script aan zitten kijken, maar het probleem is dus dat de codeer en decodeer functies niet lijken te werken...of zit er een fout in de keuze van sleutels etc.?
Ik kom er niet uit.
PHP:
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?
    print"
    <form method=post>
    String om te verzenden (<font color=blue>max 20 karakters</font>): <input type=text name=string><br><br>
    <input type=submit name=submit value=Voer in>
    </form>";
    
    /* "Vertaal" de string naar ASCII-codes en plaats die in een tabel */    

    if ($submit) {
        $lengte_string = strlen($string);
        echo "Deze string bestaat uit $lengte_string karakters";
        
        print "<br><br><table id=tabel>";
        for ($i = 0; $i < $lengte_string; $i++) {
            $letter = $string[$i];
            $ascii = ord($letter);
            print "<tr> 
                    <td width='30'>$string[$i]</td>
                    <td width='80'> is in ASCII :</td>
                    <td> $ascii</td>
                </tr>";
        } 
        print "</table>";
        
    }

    print "
    <form method=post>
    2 verschillende priemgetallen (kies voor kleinere priemgetallen (onder de 30 liefst)): <br>
    <input type=text name=p> <br>
    <input type=text name=q><br><br>
    <input type=hidden name=string value=$string> 
    <input type=submit name=submit2 value=Voer in>
    </form>";

    if ($submit2) {
        if ($p%2 != 0 &amp;&amp; $q%2 != 0 &amp;&amp; $p < 50 &amp;&amp; $q < 50)        /* mietige controle of p en q is priemgetal */ 
        {
            $n = $p * $q;                        /* berekening n */
            print "<b><u>Berekening van n</u></b><br><br>
            n = p * q <br>$p * $q = $n<br><br><br>";
        
        
            $a = ($p-1) * ($q-1);                    /* berekening a */
            $p_min = $p-1;
            $q_min = $q-1;
            print "<b><u>Berekening van a</u></b><br><br>
            a = (p-1) * (q-1) <br>$p_min * $q_min = $a<br><br><br>";

            print "<b><u>Berekening van e</u></b><br><br>";        /* berekening $e, <$n, !=$a en relatief briem aan $a */
            print "Mogelijke waarden voor e zijn:<br><br>";
            for ( $i = 2; $i < $n; $i++ )
                {for ( $j = 2; $j < $n; $j++ )
                    {if ( $j <= $i and $a != $i )
                        {if ( $a%$j == 0 &amp;&amp; $i%$j == 0)
                            {$num_del[$i] = $i;}
                        }
                    }
                }
        
            $num_all = range(0,$n-1);
            $num_rest = array_diff ($num_all, $num_del);
            unset ($num_rest[0]);
            unset ($num_rest[1]);
            unset ($num_rest[$a]);

            for ($x = 2; $x <= max($num_rest); $x++)
                {
                if ( IsSet($num_rest[$x]) )
                    {print "$num_rest[$x]<br>";}
                }           
        
            print("<br>e is nu:</b><br>                
                - kleiner dan n<br>
                - verschillend van a<br>
                - relatief priem aan a<br>");
            $e = max($num_rest);
            print "<br>Voor e kiezen we e: $e<br><br><br>";

            print "<b><u>Berekening van d</u></b><br><br>";        /* berekening d */
            print "d moet voldoen aan: (e * d )-1)) mod a = 0<br>een mogelijke waarde voor d is: ";
            for ( $d=0;; $d++ )
                { if ((($d*$e)-1)%$a == 0 &amp;&amp; (($d*$e)-1) != 0)
                    { print "$d<br><br><br>"; break;}
                }
            print "<form method=post>
                <input type=hidden name=string value=$string>
                <input type=hidden name=n value=$n>
                <input type=hidden name=d value=$d>
                <input type=hidden name=e value=$e>
                <input type=submit name=submit3 value=codeer>
                </form>";            
        }
        else
        { 
            print "Priemgetallen te groot of dit is helemaal geen priemgetal, neem een andere waarde"; 
        }
    }
    
    if ($submit3)
        {
        print "Nu gaan we dus het bericht <b>$string</b> coderen met de volgende sleutels:<br>
            - n is $n<br>
            - d is $d<br>
            - e is $e<br>";
        print "<br><br>We coderen nu elke ASCII code apart door middel van het volgende algoritme<br><br>
        <b>c = m^e mod n</b>";
        
        $lengte_string = strlen($string);                /* codeer bericht en plaats in tabel */
        print "<br><br><table id=tabel>";
        for ($i = 0; $i < $lengte_string; $i++) {
            $letter = $string[$i];
            $ascii = ord($letter);
            $gecodeerd = (bcpow($ascii,$e))%n;
            print "<tr> 
                    <td width='30'>$string[$i]</td>
                    <td width='80'> is in ASCII :</td>
                    <td width='30'>  $ascii </td>
                    <td width='80'> gecodeerd:</td>
                    <td> $gecodeerd </td>
                </tr>";
        } 
    print "</table>";
    print "<form method=post>
                <input type=hidden name=string value=$string>
                <input type=hidden name=n value=$n>
                <input type=hidden name=d value=$d>
                <input type=hidden name=e value=$e>
                <input type=submit name=submit4 value=verstuur>
                </form>";
        }
    if ($submit4)
        {
        print "Nu hebben we de cyphertext verstuurd, met de d-sleutel <b>$d</b> kan de ontvanger het bericht decoderen.<br>
        Dit gaat met de formule:<br><br>
        <b>m = c^d mod n</b><br><br>";
        
        $lengte_string = strlen($string);                /* decodeer bericht en plaats in tabel */                
        print "<br><br><table id=tabel>";
        for ($i = 0; $i < $lengte_string; $i++) {
            $letter = $string[$i];
            $ascii = ord($letter);
            $gecodeerd = (bcpow($ascii,$e))%n;
            $gedecodeerd = (bcpow($gecodeerd,$d))%n;
            print "<tr> 
                    <td width='30'>$string[$i]</td>
                    <td width='80'>is in ASCII :</td>
                    <td width='30'>$ascii </td>
                    <td width='80'>gecodeerd:</td>
                    <td width='30'>$gecodeerd </td>
                    <td width='80'>gedecodeerd:</td>
                    <td width='80'>$gedecodeerd </td>
                </tr>";
        } 
        print "</table>";
        
        }                    
?>                    
?>

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 16:24

mulder

ik spuug op het trottoir

Ik ken praktisch geen PHP, dus ik kan je waarschijnlijk niet helpen. Maar misschien krijg je hulp als je wat meer uitlegt over je probleem: wat werkt er iet, krijg je een error whatever.

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou, ik krijg helemaal geen waarden voor $gecodeerd en $gedecodeerd, het tabelletje waar ik ze in zet blijft gewoon leeg, terwijl ik ze in het blokje code daarvoor wel gedefinieerd heb.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$lengte_string = strlen($string);       
print "<br><br><table id=tabel>";
      
for ($i = 0; $i < $lengte_string; $i++) {   
     $letter = $string[$i];     
     $ascii = ord($letter);     
     $gecodeerd = (bcpow($ascii,$e))%n; 
     $gedecodeerd = (bcpow($gecodeerd,$d))%n;
     print "<tr> 
    <td width='30'>$string[$i]</td>
    <td width='80'>is in ASCII :</td>
    <td width='30'>$ascii </td>
    <td width='80'>gecodeerd:</td>
    <td width='30'>$gecodeerd </td>
    <td width='80'>gedecodeerd:</td>
    <td width='80'>$gedecodeerd </td>
    </tr>";
    }
 
print "</table>";

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

volgens mij werkt $string[<getal>] niet in php zoals in C. in PHP kan een variable gewoon een hele string bevatten, terwijl in C het een array is van chars.

Je zult een andere manier moeten vinden om de aparte letters in een array te krijgen ben ik bang

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

PHP:
1
2
3
<?
$string[$i]
?>


Kan niet. Want $string is geen array, dus hij geeft dan inderdaad niets terug.

Zo werkt het wel als het goed is. Hij geeft nu een substring van $string terug, beginnend bij $i, met een lengte van 1
PHP:
1
2
3
<?
substr($string, $i, 1); 
?>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op vrijdag 07 december 2001 12:43 schreef eamelink het volgende:
PHP:
1
2
3
<?
$string[$i]
?>


Kan niet. Want $string is geen array, dus hij geeft dan inderdaad niets terug.

Zo werkt het wel als het goed is. Hij geeft nu een substring van $string terug, beginnend bij $i, met een lengte van 1
PHP:
1
2
3
<?
substr($string, $i, 1); 
?>
Dit klopt wel want een string mag je gewoon benaderen als een array waarbij geldt dat $string[0] staat voor de eerste letter van de string, $string[1] voor de tweede enz.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

CyB3R:
volgens mij werkt $string[<getal>] niet in php zoals in C. in PHP kan een variable gewoon een hele string bevatten, terwijl in C het een array is van chars.

Je zult een andere manier moeten vinden om de aparte letters in een array te krijgen ben ik bang
Nee hoor. In PHP hetzelfde. Ze zijn wel een beetje trouw aan de "oude" technieken :)
$string is ook gewoon een array van characters.
Alleen characters zijn in PHP weer strings met lengte 1 :{


Dondervogeltje >>
code:
1
(bcpow($gecodeerd,$d))%n;

Wat is n in deze expressie :?

[edit:typo]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

idd
ik heb het even geprobeerd:
PHP:
1
2
3
4
5
6
7
8
<?
$foo = "fooobar!";
$len = strlen($foo);

for ($i = 0; $i <= $len; $i++){
        echo "$foo[$i]" . substr($foo, $i, 1) . "<br>\n";
}
?>

werkt allebei hier

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op vrijdag 07 december 2001 14:13 schreef drm het volgende:
Dondervogeltje >>
code:
1
(bcpow($gecodeerd,$d))%n;

Wat is n in deze expressie :?
!!! |:( ik ben dom! dat moet natuurlijk $n zijn...

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Op vrijdag 07 december 2001 14:13 schreef drm het volgende:

[..]

Wat is n in deze expressie :?

[edit:typo]
zo te zien een $ vergeten, want de variable $n bestaat

[edit] hij was me net een paar seconden eerder af :)

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het probleem was $n ja..was een hele domme fout van me, maar ik heb het nu veranderd...er is echter 1 probleem:

als ik de ascii code 99 codeer met het algoritme:
c = m^e mod n dan krijg ik 7, maar met de rekenmachine vind je 9. (met de volgende variabelen: m = 99, e = 13, n = 15)

Ligt dit aan de gebrekkige wiskundige mogelijkheden van PHP en kan ik dit zo veranderen dat er WEL 9 uitkomt?

[wijziging] coderingsformule gewijzigd [/wijziging]

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Op vrijdag 07 december 2001 14:29 schreef CyB3R het volgende:
zo te zien een $ vergeten, want de variable $n bestaat
het was ook meer een hint dan een vraag ;)
Op vrijdag 07 december 2001 14:34 schreef Dondervogeltje het volgende:
Het probleem was $n ja..was een hele domme fout van me, maar ik heb het nu veranderd...er is echter 1 probleem:

als ik de ascii code 99 codeer met het algoritme:
c = m^d % n dan krijg ik 7, maar met de rekenmachine vind je 9.
Ligt dit aan de gebrekkige wiskundige mogelijkheden van PHP en kan ik dit zo veranderen dat er WEL 9 uitkomt?
heeft misschien te maken met precedence?
Sowieso is het aan te raden haakjes te gebruiken in dit soort expressies, want dan ben je alle ambiguiteiten voorbij :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Op vrijdag 07 december 2001 14:34 schreef Dondervogeltje het volgende:
Het probleem was $n ja..was een hele domme fout van me, maar ik heb het nu veranderd...er is echter 1 probleem:

als ik de ascii code 99 codeer met het algoritme:
c = m^d % n dan krijg ik 7, maar met de rekenmachine vind je 9.
Ligt dit aan de gebrekkige wiskundige mogelijkheden van PHP en kan ik dit zo veranderen dat er WEL 9 uitkomt?
zo veel mogelijk proberen de bcmath functies te gebruiken, php is niet erg goed met grote getallen namelijk

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar ik gebruik nu dus voor het coderen het statement:
code:
1
$gecodeerd = (bcpow($ascii,$e))%$n;

Wat kan ik dara nog aan veranderen zodat het wel klopt?

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

string bcmod(string left operand, string modulus);
Get the modulus of the left operand using modulus.

(voor mensen die het niet weten, % == modulus ;))

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op vrijdag 07 december 2001 14:42 schreef CyB3R het volgende:
string bcmod(string left operand, string modulus);
Get the modulus of the left operand using modulus.

(voor mensen die het niet weten, % == modulus ;))
You rule! bedankt, nu krijg ik gewoon 9...waarom kom ik dr zelf niet op... ;)

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Op vrijdag 07 december 2001 14:46 schreef Dondervogeltje het volgende:

[..]

You rule! bedankt, nu krijg ik gewoon 9...waarom kom ik dr zelf niet op... ;)
aww ;)
och, genoeg frustraties met dit soort dingen en je komt er vanzelf op ;) (of je stapt, zoals ik, over op perl. Ik had die bcmath functions toen niet ;))

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

even semi-OT
heeft jouw rekenmachine modulus?

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op vrijdag 07 december 2001 14:52 schreef CyB3R het volgende:
even semi-OT
heeft jouw rekenmachine modulus?
Nee..niet standaard, heb ik zelf geprogrammeerd (TI-83)

Maar die waarden waar ik het net over had, heb ik berekend met de rekenmachine die bij windows zit

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Op vrijdag 07 december 2001 15:11 schreef Dondervogeltje het volgende:

[..]

Nee..niet standaard, heb ik zelf geprogrammeerd (TI-83)

Maar die waarden waar ik het net over had, heb ik berekend met de rekenmachine die bij windows zit
ah
ik heb een Casio grafische rekenmachine waar ik het ook niet op heb kunnen vinden
zal het ook wel zelf moeten doen 8-)

All my posts are provided as-is. They come with NO WARRANTY at all.

Pagina: 1