mboost-dp1

Hjælp til RSA kryptering


Gå til bund
Gravatar #1 - Sjovt
4. feb. 2012 17:01
Hej folkens.

Jeg sidder og skal lave et program der kan følgende:

Krypter en tekst for derefter at kunne dekrypter teksten! :)

Det skal kunne gøres ud fra hvad man har valgt på en anden side.

Som i kan se ser PHP delen sådan her ud:

<?php


$M = ($_POST['besked']);


$p = "197";
$q = "199";
$e = "13";
$d = "11941";
$N = bcmul($p,$q);


echo 'Din tekst: '.$M.'<br><br>'."\n ";


if (isset($_POST["Dekrypter"]) && $_POST["Dekrypter"] == 'ja' && (isset($_POST["Krypter"]) && $_POST["Krypter"] == 'ja')) {

echo 'Lad venligst vær med at trykke begge to.. - Prøv igen';
}

else if(isset($_POST["Krypter"]) && $_POST["Krypter"] == 'ja')


{
function krypter($M)
{
for ($i = 0, $j = strlen($M); $i < $j; $i++) {

$dec_array[] = ord($M{$i});

echo 'Asci Værdig '.$dec_array[$i].'<br>'."\n";

$blå = $dec_array[$i];

global $e;
global $N;
$Me = bcpow($blå,$e);
$C = bcmod($Me,$N);

echo 'Din tekst krypteret: '.$C.'<br><br>'."\n ";

}
return $C;
}

echo '<br><br>Din tekst blev krypteret det sidste bogstav blev således '.krypter($M).'<br><br>'."\n ";


}




else if (isset($_POST["Dekrypter"]) && $_POST["Dekrypter"] == 'ja')
{
function dekrypter($M)
{
for ($i = 0, $j = strlen($M); $i < $j; $i++)
{

global $d;
global $N;
$Cd = bcpow($M,$d);
$Ma = bcmod($Cd,$N);

$grøn =chr($Ma);
echo 'Din krypterede tekst '.$Ma.'<br><br>'."\n ";
}
return $Ma;
}



$grøn = chr(dekrypter($M));

echo 'Teksten dekrypteret: '.($grøn).'<br>'."\n ";


}

else

echo 'Du skal vælge om du vil dekrypter eller krypter.';


?>



Det den gør nu er at den udprinter når jeg krypter en masse :

Asci Værdig 104
Din tekst krypteret: 30768

fx :) indtil der ikke er flere bogstave.

er der en måde hvor jeg kan få det til at blive printet alle de kryptede værdier ud på en linje med mellemrum?


Nå næste spørgsmål ved dekryptering vil jeg meget gerne kunne tage et bogstav af gangen så den tager hver ting adskilt med et mellem rum så den i overstående tilfælde starter med
30768, og forsætter til den sidste.

Det skal sættes ind på en linje så det giver en forståelig tekst.


Det den gør nu er :

Din krypterede tekst 101 ( her giver den dec, asci værdien)

og så udskriver den bogstavet
Teksten dekrypteret: e
Gravatar #2 - redhead
4. feb. 2012 17:17
Du ved godt hvad '<br>' betyder ikke ? Samme med '\n' ...
Til dekrypteringen skal du måske kikke lidt på preg_split() eller explode() eller str_split() funktionerne.
Gravatar #3 - Sjovt
4. feb. 2012 17:21
Jeg bruger det bare som "enter" :)
Burde lave "/" bagefter i know - det er dog ikke det der driller mig hehe


Men hva med krypterings delen, noget du kan hjælpe med der?
Gravatar #4 - kasperd
4. feb. 2012 18:30
Jeg går ud fra at grunden til at du har skrevet koden er for at lære om kryptering. Derfor synes jeg også du skal vide, hvad du har gjort forkert.

Selvfølgelig er de to primtal for små, men det er vel blot fordi du er i gang med at eksperimentere. Det ser ud til at du har sørget for at bruge funktioner, der kan håndtere store tal, så du har muligheden for at bruge større primtal. Den del er godt nok.

Men måden du foretager krypteringen på er usikker. At kryptere hvert enkelt tegn for sig sådan som du gør det er ikke sikkert. Hvis jeg kender den offentlige nøgle kan jeg kryptere alle 256 mulige tegn, og så kender jeg alle de 256 mulige krypterede værdier og kan uden videre finde ud af, hvad det er for tegn der står i din kryptering.

Selv hvis jeg ikke kendte den offentlige nøgle ville krypteringen nemt kunne brydes. Hvis man undersøger en mængde krypteret tekst kan man lave statistik på de forskellige krypterede værdier, og de hyppigste krypterede værdier vil svare til de hyppigste ASCII værdier. Det er samme metode som man bruger til at bryde en ganske almindelig substitutionscipher.

For at løse det problem er man nødt til at bruge tilfældige tal i sin kryptering. Måden man normalt gør det på er følgende.

Vælg et tilfældigt tal r i intervallet fra 0 til N-1 og krypter dette tal. Beregn derefter r modulus 2^128 for at få en 128 bits nøgle, som du kan bruge til en symetrisk kryptering. Brug derefter en symetrisk kryptering som f.eks. AES128 i CBC mode til at kryptere selve data. Send den krypterede udgave af r og teksten krypteret med AES. Modtageren kan så dekryptere for at finde r og dekryptere teksten.
Gravatar #5 - Sjovt
4. feb. 2012 18:38
Jeg har godt lagt mærke til det du siger.

Hm problemet er bare hvordan jeg gør det du siger i pratisk. :)

Og ja opgaven er stillet efter at jeg skal krypter en tekst med RSA krypterings metoden.

Jeg valgte at krypter der hvert bogstav grundet at jeg ikke kunne tage en hel sætning og gøre det ud fra den :/
Derfor valgte jeg at gøre det per bogstav, og kan godt se nu det du mener at der ligger en sikkerhedsfejl i det.
Gravatar #6 - kasperd
5. feb. 2012 16:42
Sjovt (5) skrev:
problemet er bare hvordan jeg gør det du siger i pratisk.
Hvis du allerede har adgang til en symmetrisk blockcipher (som f.eks. AES128), så er det nemt at kryptere som jeg foreslog i slutningen af mit indlæg. Jeg vil ikke foreslå at du selv implementerer blockcipheren, det er lidt indviklet, og der er mange steder man nemt kan begå en fejl, som er svær at opdage.

Sjovt (5) skrev:
Og ja opgaven er stillet efter at jeg skal krypter en tekst med RSA krypterings metoden.
Er der krav om at det skal være RSA uden at anvende en symetrisk cipher i kombination med RSA? Det bliver vanskeligt at gøre det udelukkende med RSA, og specielt er det vanskeligt at sikre sig at man ikke har begået en fejl.

En metode der ser oplagt ud, men som viser sig at være usikker, er følgende:
1. Vælg tilfældigt r i intervallet 0 til N-1.
2. Krypter r.
3. Brug r som one-time-pad til kryptering af en blok data.
4. Send data krypteret med one-time-pad sammen med krypteringen af r.

Ovenstående lyder måske sikkert nok, men hvis man har et gæt på hvad data kunne være, så kan man bruge dette gæt sammen med de krypterede data til at udlede hvad r skulle være, og ved at kryptere ens gæt på r kan man undersøge om gættet er korrekt.

En metode som bruges af PKCS er følgende. Du finder ud af hvor mange bytes der skal til for at repræsentere N. Så sætter du bytes i det input du vil kryptere på følgende måde.
1 byte med værdi 0
1 byte med værdi 2
variabel antal bytes med tilfældige værdier i intervallet 1-255
1 byte med værdi 0
variabel antal bytes med data

Det første 0 er for at sikre at værdien bliver mindre end N. Byten med værdi 2 er for at kunne skelne det fra andre formater (værdien 0 angiver et forældet format som er usikkert, værdien 1 angiver et format som er velegnet til signaturer, men ikke til kryptering). De tilfældige bytes skal der være nok af til at sikre at krypteringen er stærk. Så vidt jeg husker bør de tilfældige bytes udgøre halvdelen af alle bytes i sekvensen. Ved at vælge de tilfældige bytes fra intervallet 1-255 og efterfølge med et 0 kan man fjerne denne padding efterfølgende ved at blot lede efter det første 0.

I praksis vil man nok ønske sig et N på minimum 256 bytes. Så kunne du have
1 byte med værdi 0
1 byte med værdi 2
128-253 bytes tilfældig padding
1 byte med værdi 0
0-125 bytes data

Til et simpelt eksempel med et meget lille N ønsker du sikkert et N på højst 7 bytes, så kunne du have:
1 byte med værdi 0
1 byte med værdi 2
1-4 bytes med tilfældig padding
1 byte med værdi 0
0-3 bytes data

Sjovt (5) skrev:
Jeg valgte at krypter der hvert bogstav grundet at jeg ikke kunne tage en hel sætning og gøre det ud fra den
Du kan sagtens tage en længere streng ad gangen. Du skal blot sikre dig at den starter med et 0-tegn og er samme længde som N. Du kan ikke tage en streng, som er længere end N.

Når du har et array med ASCII værdierne, så kan du beregne tallet på følgende måde (pseudokode):
v=0;
for (i=0;i<len(array);i++) {
v=v*256+array[ i ];
}


Det library du bruger til håndtering af store tal burde have en indbygget funktion der gør det samme lidt hurtigere end min pseudokode. Hvis N kun er 7 bytes langt gør det nok ikke nogen forskel, men hvis N er 256 bytes langt vil du nok opdage at pseudokoden tager kvadratisk tid.

Når du så har styr på ovenstående, så kan du begynde at overveje integritet som det næste. Overvej konsekvensen hvis nogen bytter rundt på rækkefølgen af de enkelte krypterede blokke, eller erstatter nogle af blokkene med en anden værdi de selv har krypteret.
Gravatar #7 - Sjovt
5. feb. 2012 17:21
Har sendt en besked til dig :)

Men kan godt stadig bruge inputs :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login