mboost-dp1
Hjælp til RSA kryptering
- Forside
- ⟨
- Forum
- ⟨
- Programmering
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:
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
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
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.
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.
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.
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.
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:problemet er bare hvordan jeg gør det du siger i pratisk.
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.Sjovt (5) skrev:Og ja opgaven er stillet efter at jeg skal krypter en tekst med RSA krypterings metoden.
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
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.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
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.
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.